pupnp (libupnp) snapshot from SourceForge: git clone git://pupnp.git.sourceforge...
[igd2-for-linux:pandonghui1211s-igd2-for-linux.git] / pupnp_branch-1.6.x / threadutil / inc / ithread.h
1 /*******************************************************************************
2  *
3  * Copyright (c) 2000-2003 Intel Corporation 
4  * All rights reserved. 
5  *
6  * Redistribution and use in source and binary forms, with or without 
7  * modification, are permitted provided that the following conditions are met: 
8  *
9  * * Redistributions of source code must retain the above copyright notice, 
10  * this list of conditions and the following disclaimer. 
11  * * Redistributions in binary form must reproduce the above copyright notice, 
12  * this list of conditions and the following disclaimer in the documentation 
13  * and/or other materials provided with the distribution. 
14  * * Neither name of Intel Corporation nor the names of its contributors 
15  * may be used to endorse or promote products derived from this software 
16  * without specific prior written permission.
17  * 
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 
21  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR 
22  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
23  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
24  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
25  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 
26  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
27  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
28  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  *
30  ******************************************************************************/
31
32 #ifndef ITHREADH
33 #define ITHREADH
34 #ifdef __cplusplus
35 extern "C" {
36 #endif
37
38
39 #include <pthread.h>
40 #ifndef WIN32
41         #include <unistd.h>
42 #endif
43
44 #ifdef __FreeBSD__
45         #define PTHREAD_MUTEX_RECURSIVE_NP PTHREAD_MUTEX_RECURSIVE
46 #endif
47
48 #ifdef PTHREAD_MUTEX_RECURSIVE
49         /* This system has SuS2-compliant mutex attributes.
50          * E.g. on Cygwin, where we don't have the old nonportable (NP) symbols
51          */
52         #define ITHREAD_MUTEX_FAST_NP       PTHREAD_MUTEX_NORMAL
53         #define ITHREAD_MUTEX_RECURSIVE_NP  PTHREAD_MUTEX_RECURSIVE
54         #define ITHREAD_MUTEX_ERRORCHECK_NP PTHREAD_MUTEX_ERRORCHECK
55 #else /* PTHREAD_MUTEX_RECURSIVE */
56         #define ITHREAD_MUTEX_FAST_NP       PTHREAD_MUTEX_FAST_NP
57         #define ITHREAD_MUTEX_RECURSIVE_NP  PTHREAD_MUTEX_RECURSIVE_NP
58         #define ITHREAD_MUTEX_ERRORCHECK_NP PTHREAD_MUTEX_ERRORCHECK_NP
59 #endif /* PTHREAD_MUTEX_RECURSIVE */
60
61
62 #define ITHREAD_PROCESS_PRIVATE PTHREAD_PROCESS_PRIVATE
63 #define ITHREAD_PROCESS_SHARED  PTHREAD_PROCESS_SHARED
64
65
66 #define ITHREAD_CANCELED PTHREAD_CANCELED
67
68   
69 /***************************************************************************
70  * Name: ithread_t
71  *
72  *  Description:
73  *      Thread handle.
74  *      typedef to pthread_t.
75  *      Internal Use Only.
76  ***************************************************************************/
77 typedef pthread_t ithread_t; 
78   
79 /****************************************************************************
80  * Name: ithread_attr_t
81  *
82  *  Description:
83  *      Thread attribute.
84  *      typedef to pthread_attr_t
85  *      Internal Use Only
86  ***************************************************************************/
87 typedef pthread_attr_t ithread_attr_t;  
88
89
90 /****************************************************************************
91  * Name: start_routine
92  *
93  *  Description:
94  *      Thread start routine 
95  *      Internal Use Only.
96  ***************************************************************************/
97 typedef void * (*start_routine) (void *arg);
98
99   
100 /****************************************************************************
101  * Name: ithread_cond_t
102  *
103  *  Description:
104  *      condition variable.
105  *      typedef to pthread_cond_t
106  *      Internal Use Only.
107  ***************************************************************************/
108 typedef pthread_cond_t ithread_cond_t;
109
110
111 /****************************************************************************
112  * Name: ithread_mutexattr_t
113  *
114  *  Description:
115  *      Mutex attribute.
116  *      typedef to pthread_mutexattr_t
117  *      Internal Use Only
118  ***************************************************************************/
119 typedef pthread_mutexattr_t ithread_mutexattr_t;        
120
121
122 /****************************************************************************
123  * Name: ithread_mutex_t
124  *
125  *  Description:
126  *      Mutex.
127  *      typedef to pthread_mutex_t
128  *      Internal Use Only.
129  ***************************************************************************/
130 typedef pthread_mutex_t ithread_mutex_t;
131
132
133 /****************************************************************************
134  * Name: ithread_condattr_t
135  *
136  *  Description:
137  *      Condition attribute.
138  *      typedef to pthread_condattr_t
139  *      NOT USED
140  *      Internal Use Only
141  ***************************************************************************/
142 typedef pthread_condattr_t ithread_condattr_t;  
143
144
145 /****************************************************************************
146  * Name: ithread_rwlockattr_t
147  *
148  *  Description:
149  *      Mutex attribute.
150  *      typedef to pthread_rwlockattr_t
151  *      Internal Use Only
152  ***************************************************************************/
153 typedef pthread_rwlockattr_t ithread_rwlockattr_t;      
154
155
156 /****************************************************************************
157  * Name: ithread_rwlock_t
158  *
159  *  Description:
160  *      Condition attribute.
161  *      typedef to pthread_rwlock_t
162  *      Internal Use Only
163  ***************************************************************************/
164 typedef pthread_rwlock_t ithread_rwlock_t;      
165
166 /****************************************************************************
167  * Function: ithread_mutexattr_init
168  *
169  *  Description:
170  *      Initializes a mutex attribute variable.
171  *      Used to set the type of the mutex.
172  *  Parameters:
173  *      ithread_mutexattr_init * attr (must be valid non NULL pointer to 
174  *                                     pthread_mutexattr_t)
175  *  Returns:
176  *      0 on success, Nonzero on failure.
177  *      Always returns 0.
178  *      See man page for pthread_mutexattr_init
179  ***************************************************************************/
180 #define ithread_mutexattr_init pthread_mutexattr_init
181
182
183 /****************************************************************************
184  * Function: ithread_mutexattr_destroy
185  *
186  *  Description:
187  *      Releases any resources held by the mutex attribute.
188  *      Currently there are no resources associated with the attribute
189  *  Parameters:
190  *      ithread_mutexattr_t * attr (must be valid non NULL pointer to 
191  *                                  pthread_mutexattr_t)
192  *  Returns:
193  *      0 on success, Nonzero on failure.
194  *      Always returns 0.
195  *      See man page for pthread_mutexattr_destroy
196  ***************************************************************************/
197 #define ithread_mutexattr_destroy pthread_mutexattr_destroy
198   
199   
200 /****************************************************************************
201  * Function: ithread_mutexattr_setkind_np
202  *
203  *  Description:
204  *      Sets the mutex type in the attribute.
205  *      Valid types are: ITHREAD_MUTEX_FAST_NP 
206  *                       ITHREAD_MUTEX_RECURSIVE_NP 
207  *                       ITHREAD_MUTEX_ERRORCHECK_NP
208  *
209  *  Parameters:
210  *      ithread_mutexattr_t * attr (must be valid non NULL pointer to 
211  *                                   ithread_mutexattr_t)
212  *      int kind (one of ITHREAD_MUTEX_FAST_NP or ITHREAD_MUTEX_RECURSIVE_NP
213  *                or ITHREAD_MUTEX_ERRORCHECK_NP)
214  *  Returns:
215  *      0 on success. Nonzero on failure.
216  *      Returns EINVAL if the kind is not supported.
217  *      See man page for pthread_mutexattr_setkind_np
218  *****************************************************************************/
219 #ifdef PTHREAD_MUTEX_RECURSIVE
220         #define ithread_mutexattr_setkind_np pthread_mutexattr_settype
221 #else
222         #define ithread_mutexattr_setkind_np pthread_mutexattr_setkind_np
223 #endif
224
225 /****************************************************************************
226  * Function: ithread_mutexattr_getkind_np
227  *
228  *  Description:
229  *      Gets the mutex type in the attribute.
230  *      Valid types are: ITHREAD_MUTEX_FAST_NP 
231  *                       ITHREAD_MUTEX_RECURSIVE_NP 
232  *                       ITHREAD_MUTEX_ERRORCHECK_NP
233  *
234  *  Parameters:
235  *      ithread_mutexattr_t * attr (must be valid non NULL pointer to 
236  *                                   pthread_mutexattr_t)
237  *      int *kind (one of ITHREAD_MUTEX_FAST_NP or ITHREAD_MUTEX_RECURSIVE_NP
238  *                or ITHREAD_MUTEX_ERRORCHECK_NP)
239  *  Returns:
240  *      0 on success. Nonzero on failure.
241  *      Always returns 0.
242  *      See man page for pthread_mutexattr_getkind_np
243  *****************************************************************************/
244 #ifdef PTHREAD_MUTEX_RECURSIVE
245         #define ithread_mutexattr_getkind_np pthread_mutexattr_gettype
246 #else
247         #define ithread_mutexattr_getkind_np pthread_mutexattr_getkind_np
248 #endif
249
250   
251 /****************************************************************************
252  * Function: ithread_mutex_init
253  *
254  *  Description:
255  *      Initializes mutex.
256  *      Must be called before use.
257  *      
258  *  Parameters:
259  *      ithread_mutex_t * mutex (must be valid non NULL pointer to pthread_mutex_t)
260  *      const ithread_mutexattr_t * mutex_attr 
261  *  Returns:
262  *      0 on success, Nonzero on failure.
263  *      Always returns 0.
264  *      See man page for pthread_mutex_init
265  *****************************************************************************/
266 #define ithread_mutex_init pthread_mutex_init
267
268
269 /****************************************************************************
270  * Function: ithread_mutex_lock
271  *
272  *  Description:
273  *      Locks mutex.
274  *  Parameters:
275  *      ithread_mutex_t * mutex (must be valid non NULL pointer to pthread_mutex_t)
276  *      mutex must be initialized.
277  *      
278  *  Returns:
279  *      0 on success, Nonzero on failure.
280  *      Always returns 0.
281  *      See man page for pthread_mutex_lock
282  *****************************************************************************/
283 #define ithread_mutex_lock pthread_mutex_lock
284   
285
286 /****************************************************************************
287  * Function: ithread_mutex_unlock
288  *
289  *  Description:
290  *      Unlocks mutex.
291  *
292  *  Parameters:
293  *      ithread_mutex_t * mutex (must be valid non NULL pointer to pthread_mutex_t)
294  *      mutex must be initialized.
295  *      
296  *  Returns:
297  *      0 on success, Nonzero on failure.
298  *      Always returns 0.
299  *      See man page for pthread_mutex_unlock
300  *****************************************************************************/
301 #define ithread_mutex_unlock pthread_mutex_unlock
302
303
304 /****************************************************************************
305  * Function: ithread_mutex_destroy
306  *
307  *  Description:
308  *      Releases any resources held by the mutex. 
309  *              Mutex can no longer be used after this call.
310  *              Mutex is only destroyed when there are no longer any threads waiting on it. 
311  *              Mutex cannot be destroyed if it is locked.
312  *  Parameters:
313  *      ithread_mutex_t * mutex (must be valid non NULL pointer to pthread_mutex_t)
314  *      mutex must be initialized.
315  *  Returns:
316  *      0 on success. Nonzero on failure.
317  *      Always returns 0.
318  *      See man page for pthread_mutex_destroy
319  *****************************************************************************/
320 #define ithread_mutex_destroy pthread_mutex_destroy
321
322
323 /****************************************************************************
324  * Function: ithread_rwlockattr_init
325  *
326  *  Description:
327  *      Initializes a rwlock attribute variable to default values.
328  *  Parameters:
329  *      const ithread_rwlockattr_init *attr (must be valid non NULL pointer to 
330  *                                           pthread_rwlockattr_t)
331  *  Returns:
332  *      0 on success, Nonzero on failure.
333  *      Always returns 0.
334  *      See man page for pthread_rwlockattr_init
335  ***************************************************************************/
336 #define ithread_rwlockattr_init pthread_rwlockattr_init
337
338
339 /****************************************************************************
340  * Function: ithread_rwlockattr_destroy
341  *
342  *  Description:
343  *      Releases any resources held by the rwlock attribute.
344  *  Parameters:
345  *      ithread_rwlockattr_t *attr (must be valid non NULL pointer to 
346  *                                  pthread_rwlockattr_t)
347  *  Returns:
348  *      0 on success, Nonzero on failure.
349  *      Always returns 0.
350  *      See man page for pthread_rwlockattr_destroy
351  ***************************************************************************/
352 #define ithread_rwlockattr_destroy pthread_rwlockattr_destroy
353   
354   
355 /****************************************************************************
356  * Function: ithread_rwlockatttr_setpshared
357  *
358  *  Description:
359  *      Sets the rwlock type in the attribute.
360  *      Valid types are: ITHREAD_PROCESS_PRIVATE 
361  *                       ITHREAD_PROCESS_SHARED
362  *
363  *  Parameters:
364  *      ithread_rwlockattr_t * attr (must be valid non NULL pointer to 
365  *                                   ithread_rwlockattr_t)
366  *      int kind (one of ITHREAD_PROCESS_PRIVATE or ITHREAD_PROCESS_SHARED)
367  *
368  *  Returns:
369  *      0 on success. Nonzero on failure.
370  *      Returns EINVAL if the kind is not supported.
371  *      See man page for pthread_rwlockattr_setkind_np
372  *****************************************************************************/
373 #define ithread_rwlockatttr_setpshared pthread_rwlockatttr_setpshared
374
375
376 /****************************************************************************
377  * Function: ithread_rwlockatttr_getpshared
378  *
379  *  Description:
380  *      Gets the rwlock type in the attribute.
381  *      Valid types are: ITHREAD_PROCESS_PRIVATE 
382  *                       ITHREAD_PROCESS_SHARED 
383  *
384  *  Parameters:
385  *      ithread_rwlockattr_t * attr (must be valid non NULL pointer to 
386  *                                   pthread_rwlockattr_t)
387  *      int *kind (one of ITHREAD_PROCESS_PRIVATE or ITHREAD_PROCESS_SHARED)
388  *
389  *  Returns:
390  *      0 on success. Nonzero on failure.
391  *      Always returns 0.
392  *      See man page for pthread_rwlockatttr_getpshared
393  *****************************************************************************/
394 #define ithread_rwlockatttr_getpshared pthread_rwlockatttr_getpshared
395
396   
397 /****************************************************************************
398  * Function: ithread_rwlock_init
399  *
400  *  Description:
401  *      Initializes rwlock.
402  *      Must be called before use.
403  *      
404  *  Parameters:
405  *      ithread_rwlock_t * rwlock (must be valid non NULL pointer to pthread_rwlock_t)
406  *      const ithread_rwlockattr_t * rwlock_attr 
407  *  Returns:
408  *      0 on success, Nonzero on failure.
409  *      Always returns 0.
410  *      See man page for pthread_rwlock_init
411  *****************************************************************************/
412 #define ithread_rwlock_init pthread_rwlock_init
413
414
415 /****************************************************************************
416  * Function: ithread_rwlock_rdlock
417  *
418  *  Description:
419  *      Locks rwlock for reading.
420  *  Parameters:
421  *      ithread_rwlock_t * rwlock (must be valid non NULL pointer to pthread_rwlock_t)
422  *      rwlock must be initialized.
423  *      
424  *  Returns:
425  *      0 on success, Nonzero on failure.
426  *      Always returns 0.
427  *      See man page for pthread_rwlock_rdlock
428  *****************************************************************************/
429 #define ithread_rwlock_rdlock pthread_rwlock_rdlock
430
431
432 /****************************************************************************
433  * Function: ithread_rwlock_wrlock
434  *
435  *  Description:
436  *      Locks rwlock for writting.
437  *  Parameters:
438  *      ithread_rwlock_t * rwlock (must be valid non NULL pointer to pthread_rwlock_t)
439  *      rwlock must be initialized.
440  *      
441  *  Returns:
442  *      0 on success, Nonzero on failure.
443  *      Always returns 0.
444  *      See man page for pthread_rwlock_wrlock
445  *****************************************************************************/
446 #define ithread_rwlock_wrlock pthread_rwlock_wrlock
447
448
449 /****************************************************************************
450  * Function: ithread_rwlock_unlock
451  *
452  *  Description:
453  *      Unlocks rwlock.
454  *
455  *  Parameters:
456  *      ithread_rwlock_t * rwlock (must be valid non NULL pointer to pthread_rwlock_t)
457  *      rwlock must be initialized.
458  *      
459  *  Returns:
460  *      0 on success, Nonzero on failure.
461  *      Always returns 0.
462  *      See man page for pthread_rwlock_unlock
463  *****************************************************************************/
464 #define ithread_rwlock_unlock pthread_rwlock_unlock
465
466
467 /****************************************************************************
468  * Function: ithread_rwlock_destroy
469  *
470  *  Description:
471  *      Releases any resources held by the rwlock. 
472  *              rwlock can no longer be used after this call.
473  *              rwlock is only destroyed when there are no longer any threads waiting on it. 
474  *              rwlock cannot be destroyed if it is locked.
475  *  Parameters:
476  *      ithread_rwlock_t * rwlock (must be valid non NULL pointer to pthread_rwlock_t)
477  *      rwlock must be initialized.
478  *  Returns:
479  *      0 on success. Nonzero on failure.
480  *      Always returns 0.
481  *      See man page for pthread_rwlock_destroy
482  *****************************************************************************/
483 #define ithread_rwlock_destroy pthread_rwlock_destroy
484
485
486 /****************************************************************************
487  * Function: ithread_cond_init
488  *
489  *  Description:
490  *      Initializes condition variable.
491  *      Must be called before use.
492  *  Parameters:
493  *      ithread_cond_t * cond (must be valid non NULL pointer to pthread_cond_t)
494  *      const ithread_condattr_t * cond_attr (ignored)
495  *  Returns:
496  *      0 on success, Nonzero on failure.
497  *      See man page for pthread_cond_init
498  *****************************************************************************/
499 #define ithread_cond_init pthread_cond_init
500
501
502
503 /****************************************************************************
504  * Function: ithread_cond_signal
505  *
506  *  Description:
507  *      Wakes up exactly one thread waiting on condition.
508  *      Associated mutex MUST be locked by thread before entering this call.
509  *  Parameters:
510  *      ithread_cond_t * cond (must be valid non NULL pointer to 
511  *      ithread_cond_t)
512  *      cond must be initialized
513  *  Returns:
514  *      0 on success, Nonzero on failure.
515  *      See man page for pthread_cond_signal
516  *****************************************************************************/
517 #define ithread_cond_signal pthread_cond_signal
518
519
520 /****************************************************************************
521  * Function: ithread_cond_broadcast
522  *
523  *  Description:
524  *      Wakes up all threads waiting on condition.
525  *      Associated mutex MUST be locked by thread before entering this call.
526  *  Parameters:
527  *      ithread_cond_t * cond (must be valid non NULL pointer to 
528  *      ithread_cond_t)
529  *      cond must be initialized
530  *  Returns:
531  *      0 on success, Nonzero on failure.
532  *      See man page for pthread_cond_broadcast
533  *****************************************************************************/
534 #define ithread_cond_broadcast pthread_cond_broadcast
535   
536
537 /****************************************************************************
538  * Function: ithread_cond_wait
539  *
540  *  Description:
541  *      Atomically releases mutex and waits on condition.
542  *      Associated mutex MUST be locked by thread before entering this call.
543  *      Mutex is reacquired when call returns.
544  *  Parameters:
545  *      ithread_cond_t * cond (must be valid non NULL pointer to 
546  *      ithread_cond_t)
547  *      cond must be initialized
548  *      ithread_mutex_t *mutex (must be valid non NULL pointer to 
549  *      ithread_mutex_t)
550  *      Mutex must be locked.
551  *  Returns:
552  *      0 on success, Nonzero on failure.
553  *      See man page for pthread_cond_wait
554  *****************************************************************************/
555 #define ithread_cond_wait pthread_cond_wait
556   
557
558   /****************************************************************************
559    * Function: pthread_cond_timedwait
560    *
561    *  Description:      
562    *      Atomically releases the associated mutex and waits on the condition. 
563    *            If the condition is not signaled in the specified time 
564    *              than the 
565    *            call times out and returns.
566    *            Associated mutex MUST be locked by thread before entering 
567    *              this call.
568    *      Mutex is reacquired when call returns.
569    *  Parameters:
570    *      ithread_cond_t * cond (must be valid non NULL pointer to 
571    *      ithread_cond_t)
572    *      cond must be initialized
573    *      ithread_mutex_t *mutex (must be valid non NULL pointer to 
574    *      ithread_mutex_t)
575    *      Mutex must be locked.
576    *      const struct timespec *abstime (absolute time, measured 
577    *      from Jan 1, 1970)
578    *  Returns:
579    *      0 on success. ETIMEDOUT on timeout. Nonzero on failure.
580    *      See man page for pthread_cond_timedwait
581    ***************************************************************************/
582  
583 #define ithread_cond_timedwait pthread_cond_timedwait
584   
585
586   /****************************************************************************
587    * Function: ithread_cond_destroy
588    *
589    *  Description:
590    *      Releases any resources held by the condition variable. 
591    *            Condition variable can no longer be used after this call.       
592    *  Parameters:
593    *      ithread_cond_t * cond (must be valid non NULL pointer to 
594    *      ithread_cond_t)
595    *      cond must be initialized.
596    *  Returns:
597    *      0 on success. Nonzero on failure.
598    *      See man page for pthread_cond_destroy
599    ***************************************************************************/
600 #define ithread_cond_destroy pthread_cond_destroy
601
602
603   /****************************************************************************
604    * Function: ithread_create
605    *
606    *  Description:
607    *            Creates a thread with the given start routine
608    *      and argument.
609    *  Parameters:
610    *      ithread_t * thread (must be valid non NULL pointer to pthread_t)
611    *      ithread_attr_t *attr, IGNORED
612    *      void * (start_routine) (void *arg) (start routine)
613    *      void * arg - argument.
614    *  Returns:
615    *      0 on success. Nonzero on failure.
616    *        Returns EAGAIN if a new thread can not be created.
617    *      Returns EINVAL if there is a problem with the arguments.
618    *      See man page fore pthread_create
619    ***************************************************************************/
620 #define ithread_create pthread_create
621
622
623   /****************************************************************************
624    * Function: ithread_cancel
625    *
626    *  Description:
627    *            Cancels a thread.
628    *  Parameters:
629    *      ithread_t * thread (must be valid non NULL pointer to ithread_t)
630    *  Returns:
631    *      0 on success. Nonzero on failure.
632    *      See man page for pthread_cancel
633    ***************************************************************************/
634 #define ithread_cancel pthread_cancel
635   
636
637   /****************************************************************************
638    * Function: ithread_exit
639    *
640    *  Description:
641    *            Returns a return code from a thread.
642    *      Implicitly called when the start routine returns.
643    *  Parameters:
644    *      void  * return_code return code to return
645    *      See man page for pthread_exit
646    ***************************************************************************/
647 #define ithread_exit pthread_exit
648
649 /****************************************************************************
650    * Function: ithread_get_current_thread_id
651    *
652    *  Description:
653    *            Returns the handle of the currently running thread.
654    *  Returns:
655    *            The handle of the currently running thread.
656    *              See man page for pthread_self
657    ***************************************************************************/
658 #define ithread_get_current_thread_id pthread_self
659
660
661   /****************************************************************************
662    * Function: ithread_self
663    *
664    *  Description:
665    *            Returns the handle of the currently running thread.
666    *  Returns:
667    *            The handle of the currently running thread.
668    *              See man page for pthread_self
669    ***************************************************************************/
670 #define ithread_self pthread_self
671
672   /****************************************************************************
673    * Function: ithread_detach
674    *
675    *  Description:
676    *            Makes a thread's resources reclaimed immediately 
677    *            after it finishes
678    *            execution.  
679    *  Returns:
680    *            0 on success, Nonzero on failure.
681    *      See man page for pthread_detach
682    ***************************************************************************/
683 #define ithread_detach pthread_detach  
684
685   /****************************************************************************
686    * Function: ithread_join
687    *
688    *  Description:
689    *            Suspends the currently running thread until the 
690    * specified thread
691    *      has finished. 
692    *      Returns the return code of the thread, or ITHREAD_CANCELED 
693    *      if the thread has been canceled.
694    *  Parameters:
695    *      ithread_t *thread (valid non null thread identifier)
696    *      void ** return (space for return code) 
697    *  Returns:
698    *            0 on success, Nonzero on failure.
699    *     See man page for pthread_join
700    ***************************************************************************/
701 #define ithread_join pthread_join
702   
703
704
705 /****************************************************************************
706  * Function: isleep
707  *
708  *  Description:
709  *              Suspends the currently running thread for the specified number 
710  *      of seconds
711  *      Always returns 0.
712  *  Parameters:
713  *      unsigned int seconds - number of seconds to sleep.
714  *  Returns:
715  *              0 on success, Nonzero on failure.
716  *              See man page for sleep (man 3 sleep)
717  *****************************************************************************/
718 #ifndef WIN32
719 #define isleep sleep
720 #else
721 #define isleep(x) Sleep((x)*1000)
722 #endif
723
724 /****************************************************************************
725  * Function: isleep
726  *
727  *  Description:
728  *              Suspends the currently running thread for the specified number 
729  *      of milliseconds
730  *      Always returns 0.
731  *  Parameters:
732  *      unsigned int milliseconds - number of milliseconds to sleep.
733  *  Returns:
734  *              0 on success, Nonzero on failure.
735  *              See man page for sleep (man 3 sleep)
736  *****************************************************************************/
737 #ifndef WIN32
738 #define imillisleep(x) usleep(1000*x)
739 #else
740 #define imillisleep     Sleep
741 #endif
742
743 #ifdef WIN32
744         #ifndef UPNP_STATIC_LIB
745                 #ifdef LIBUPNP_EXPORTS
746                         /* set up declspec for dll export to make functions visible to library users */
747                         #define EXPORT_SPEC __declspec(dllexport)
748                 #else
749                         #define EXPORT_SPEC __declspec(dllimport)
750                 #endif
751         #else
752                 #define EXPORT_SPEC
753         #endif
754 #else
755         #define EXPORT_SPEC
756 #endif
757
758
759 #ifndef PTHREAD_MUTEX_RECURSIVE
760 /* NK: Added for satisfying the gcc compiler */
761 EXPORT_SPEC int pthread_mutexattr_setkind_np(pthread_mutexattr_t *attr, int kind);
762 #endif
763
764 #ifdef __cplusplus
765 }
766 #endif
767
768 #endif /* ITHREADH */
769