pthread.h
上传用户:luoyougen
上传日期:2008-05-12
资源大小:23136k
文件大小:10k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* pthread.h - header for POSIX threads (pthreads) */
  2.  
  3. /* Copyright 1984-2002 Wind River Systems, Inc. */
  4.  
  5. /*
  6. modification history
  7. --------------------
  8. 01c,22oct01,jgn  add definition of PTHREAD_STACK_MIN (SPR #71110)
  9. 01b,11sep00,jgn  split into kernel & user level parts (SPR #33375)
  10. 01a,17jul00,jgn  created from DOT-4 version
  11. */
  12.  
  13. #ifndef __INCpthreadh
  14. #define __INCpthreadh
  15. /* includes */
  16. #include "vxWorks.h"
  17. #include "semLib.h"
  18. #include "signal.h"
  19. #include "timers.h"
  20. #include "sched.h"
  21. #if defined(__cplusplus)
  22. extern "C" {
  23. #endif /* __cplusplus */
  24. /* defines */
  25. #define _POSIX_THREADS 1
  26. #define _POSIX_THREAD_PRIORITY_SCHEDULING 1
  27. #define _POSIX_THREAD_ATTR_STACKSIZE 1
  28. #define _POSIX_THREAD_ATTR_STACKADDR 1
  29. #ifdef _POSIX_THREAD_PROCESS_SHARED
  30. #define PTHREAD_PROCESS_PRIVATE 0
  31. #define PTHREAD_PROCESS_SHARED 1
  32. #endif /* _POSIX_THREAD_PROCESS_SHARED */
  33. #ifdef _POSIX_THREAD_ATTR_STACKSIZE
  34. #define PTHREAD_STACK_MIN 4096 /* suggested minimum */
  35. #endif
  36. #define PTHREAD_INHERIT_SCHED 0 /* implementation default */
  37. #define PTHREAD_EXPLICIT_SCHED 1
  38. #define PTHREAD_SCOPE_PROCESS 2
  39. #define PTHREAD_SCOPE_SYSTEM 3 /* implementation default */
  40. #define PTHREAD_ONCE_INIT {0}
  41. #define PTHREAD_INITIALIZED 1 /* object can be used */
  42. #define PTHREAD_DESTROYED -1 /* object status */
  43. #define PTHREAD_MUTEX_INITIALIZER {NULL, TRUE, 0, 0, 0, 0, 
  44.     {PTHREAD_INITIALIZED, PTHREAD_PRIO_INHERIT, 0}}
  45. #define PTHREAD_COND_INITIALIZER {NULL, TRUE, 0, 0, NULL}
  46. #define PTHREAD_CREATE_DETACHED 0
  47. #define PTHREAD_CREATE_JOINABLE 1 /*.4a and implementation default */
  48. #define PTHREAD_CANCEL_ENABLE 0
  49. #define PTHREAD_CANCEL_DISABLE 1
  50. #define PTHREAD_CANCEL_ASYNCHRONOUS 0
  51. #define PTHREAD_CANCEL_DEFERRED 1
  52. #define PTHREAD_CANCELED ((void *)-1)
  53. #define _POSIX_THREAD_THREAD_MAX 0 /* unlimited, not checked */
  54. #define _POSIX_THREAD_KEYS_MAX 256     
  55. #define _POSIX_THREAD_DESTRUCTOR_ITERATIONS  4
  56. /* to make some function returns more readable
  57.  */
  58. #define _RETURN_PTHREAD_SUCCESS 0
  59. #define SIGCANCEL SIGCNCL
  60. /* Internal definitions */
  61. #define VALID 0x01
  62. #define STACK_PASSED_IN 0x02
  63. #define JOINABLE 0x04
  64. #define JOINER_WAITING 0x08
  65. #define TASK_EXITED 0x10
  66. /* typedefs */
  67. typedef unsigned long pthread_t;
  68. typedef struct {
  69. int threadAttrStatus; /* status flag */
  70. size_t threadAttrStacksize; /* stack size */
  71. void *threadAttrStackaddr; /* stack address */
  72. int threadAttrDetachstate; /* detach state */
  73. int threadAttrContentionscope; /* contention scope */
  74. int threadAttrInheritsched; /* inherit scheduler */
  75. int threadAttrSchedpolicy; /* scheduling policy */
  76. char  *threadAttrName; /* task name - VxWorks extension */
  77.         struct sched_param threadAttrSchedparam;
  78. /* sched param struct */
  79. } pthread_attr_t;
  80. typedef struct {
  81. int condAttrStatus; /* status flag */
  82. #ifdef _POSIX_THREAD_PROCESS_SHARED
  83. int condAttrPshared; /* process-shared attr */
  84. #endif /* _POSIX_THREAD_PROCESS_SHARED */
  85. } pthread_condattr_t;
  86. typedef struct {
  87. int mutexAttrStatus; /* status flag */
  88. #ifdef _POSIX_THREAD_PROCESS_SHARED
  89. int mutexAttrPshared; /* process-shared attr */
  90. #endif /* _POSIX_THREAD_PROCESS_SHARED */
  91. int mutexAttrProtocol; /* inherit or protect */
  92. int mutexAttrPrioceiling; /* priority ceiling */
  93. /* (protect only) */
  94. } pthread_mutexattr_t;
  95. /* values for mutexAttrProtocol */
  96. #define PTHREAD_PRIO_NONE       0
  97. #define PTHREAD_PRIO_INHERIT 1
  98. #define PTHREAD_PRIO_PROTECT 2
  99. typedef struct {
  100. SEM_ID mutexSemId;
  101.         int                     mutexValid;
  102.         int                     mutexInitted;
  103.         int                     mutexIniting;
  104. int mutexCondRefCount;
  105. int mutexSavPriority;
  106. pthread_mutexattr_t mutexAttr;
  107. } pthread_mutex_t;
  108. typedef struct {
  109. SEM_ID condSemId;
  110.         int                     condValid;
  111.         int                     condInitted;
  112.         int                     condIniting;
  113. int condRefCount;
  114. pthread_mutex_t         *condMutex;
  115. #ifdef _POSIX_THREAD_PROCESS_SHARED
  116. pthread_condattr_t condAttr;
  117. #endif /* _POSIX_THREAD_PROCESS_SHARED */
  118. } pthread_cond_t;
  119. typedef unsigned long pthread_key_t;
  120. typedef struct {
  121. int onceInitialized;
  122. int onceMutex; /* shdbe sizeof thing that vxTas acts on */
  123. } pthread_once_t;
  124. /* internal typedefs */
  125. typedef struct cleanup
  126.     {
  127.  
  128.     struct cleanup *next;
  129.     void(*routine)(void *);
  130.     void *arg;
  131.  
  132.     } cleanupHandler;
  133.  
  134. typedef struct
  135.     {
  136.     const void **       privateData;
  137.     int                 privateDataCount;
  138.     int                 taskId;
  139.     unsigned long       flags;
  140.     SEM_ID              exitJoinSemId;
  141.     SEM_ID              mutexSemId;
  142.     SEM_ID              cancelSemId;
  143.     int                 priority;
  144.     int                 cancelstate;
  145.     int                 canceltype;
  146.     int                 cancelrequest;
  147.     void *              exitStatus;
  148.     cleanupHandler *    handlerBase;
  149.     pthread_cond_t *    cvcond;
  150.     } internalPthread;
  151. /*
  152.  * Section 3 Process Primitives
  153.  */
  154. int pthread_sigmask(int how, const sigset_t *set, sigset_t *oset);
  155. int pthread_kill(pthread_t thread, int sig);
  156. /*
  157.  * Section 11.3 Mutexes
  158.  */
  159. int pthread_mutexattr_init(pthread_mutexattr_t *attr);
  160. int pthread_mutexattr_destroy(pthread_mutexattr_t *attr);
  161. #ifdef _POSIX_THREAD_PROCESS_SHARED
  162. int pthread_mutexattr_getpshared(const pthread_mutexattr_t *attr, int *pshared);
  163. int pthread_mutexattr_setpshared(pthread_mutexattr_t *attr, int pshared);
  164. #endif /* _POSIX_THREAD_PROCESS_SHARED */
  165. int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);
  166. int pthread_mutex_destroy(pthread_mutex_t *mutex);
  167. int pthread_mutex_lock(pthread_mutex_t *mutex);
  168. int pthread_mutex_trylock(pthread_mutex_t *mutex);
  169. int pthread_mutex_unlock(pthread_mutex_t *mutex);
  170. /*
  171.  * Section 11.4 Condition variables
  172.  */
  173. int pthread_condattr_init(pthread_condattr_t *attr);
  174. int pthread_condattr_destroy(pthread_condattr_t *attr);
  175. #ifdef _POSIX_THREAD_PROCESS_SHARED
  176. int pthread_condattr_getpshared(const pthread_condattr_t *attr, int *pshared);
  177. int pthread_condattr_setpshared(pthread_condattr_t *attr, int pshared);
  178. #endif /* _POSIX_THREAD_PROCESS_SHARED */
  179. int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *attr);
  180. int pthread_cond_destroy(pthread_cond_t *cond);
  181. int pthread_cond_signal(pthread_cond_t *cond);
  182. int pthread_cond_broadcast(pthread_cond_t *cond);
  183. int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
  184. int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex,
  185.    const struct timespec *abstime);
  186. /*
  187.  * Section 13.5 Thread scheduling
  188.  */
  189. #ifdef _POSIX_THREAD_PRIORITY_SCHEDULING
  190. int pthread_attr_setscope(pthread_attr_t *attr, int contentionscope);
  191. int pthread_attr_getscope(const pthread_attr_t *attr, int *contentionscope);
  192. int pthread_attr_setinheritsched(pthread_attr_t *attr, int inheritsched);
  193. int pthread_attr_getinheritsched(const pthread_attr_t *attr, int *inheritsched);
  194. int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);
  195. int pthread_attr_getschedpolicy(const pthread_attr_t *attr, int *policy);
  196. int pthread_attr_setschedparam(pthread_attr_t *attr,
  197. const struct sched_param *param);
  198. int pthread_attr_getschedparam(const pthread_attr_t *attr,
  199. struct sched_param *param);
  200. int pthread_getschedparam(pthread_t thread, int *policy,
  201. struct sched_param *param);
  202. int pthread_setschedparam(pthread_t thread, int policy,
  203. const struct sched_param *param);
  204. #endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */
  205. #if defined (_POSIX_THREAD_PRIO_INHERIT) || defined (_POSIX_THREAD_PRIO_PROTECT)
  206. int pthread_mutexattr_setprotocol(pthread_mutexattr_t *attr, int protocol);
  207. int pthread_mutexattr_getprotocol(pthread_mutexattr_t *attr, int *protocol);
  208. #endif /* _POSIX_THREAD_PRIO_INHERIT || _POSIX_THREAD_PRIO_PROTECT */
  209. #ifdef _POSIX_THREAD_PRIO_PROTECT
  210. int pthread_mutexattr_setprioceiling(pthread_mutexattr_t *attr,
  211. int prioceiling);
  212. int pthread_mutexattr_getprioceiling(pthread_mutexattr_t *attr,
  213. int *prioceiling);
  214. int pthread_mutex_setprioceiling(pthread_mutex_t *attr, int prioceiling,
  215. int *old_ceiling);
  216. int pthread_mutex_getprioceiling(pthread_mutex_t *attr, int *prioceiling);
  217. #endif /* _POSIX_THREAD_PRIO_PROTECT */
  218. /*
  219.  * Section 16 Thread management
  220.  */
  221. int pthread_attr_init(pthread_attr_t *attr);
  222. int pthread_attr_destroy(pthread_attr_t *attr);
  223. #ifdef _POSIX_THREAD_ATTR_STACKSIZE
  224. int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);
  225. int pthread_attr_getstacksize(const pthread_attr_t *attr, size_t *stacksize);
  226. #endif /* _POSIX_THREAD_ATTR_STACKSIZE */
  227. #ifdef _POSIX_THREAD_ATTR_STACKADDR
  228. int pthread_attr_setstackaddr(pthread_attr_t *attr, void *stackaddr);
  229. int pthread_attr_getstackaddr(const pthread_attr_t *attr, void **stackaddr);
  230. #endif /* _POSIX_THREAD_ATTR_STACKADDR */
  231. int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
  232. int pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate);
  233. void pthread_exit(void *value_ptr);
  234. int pthread_create (pthread_t *pThread,
  235.     const pthread_attr_t *pAttr,
  236.     void * (*start_routine)(void *),
  237.     void *arg);
  238. int pthread_join(pthread_t thread, void **status);
  239. int pthread_detach(pthread_t thread);
  240. pthread_t pthread_self(void);
  241. int pthread_equal(pthread_t t1, pthread_t t2);
  242. int pthread_once(pthread_once_t *once_control, void (*init_routine)(void));
  243. /*
  244.  * Section 17 Thread-specific data
  245.  */
  246. int pthread_key_create(pthread_key_t *key, void (*destructor)(void *));
  247. int pthread_setspecific(pthread_key_t key, const void *value);
  248. void *pthread_getspecific(pthread_key_t key);
  249. int pthread_key_delete(pthread_key_t key);
  250. /*
  251.  * Section 18 Thread cancellation
  252.  */
  253. int pthread_cancel(pthread_t thread);
  254. int pthread_setcancelstate(int state, int *oldstate);
  255. int pthread_setcanceltype(int type, int *oldtype);
  256. void pthread_testcancel(void);
  257. void pthread_cleanup_push(void (*routine)(void *), void *arg);
  258. void pthread_cleanup_pop(int execute);
  259. /* VxWorks support routines */
  260. extern void pthreadLibInit();
  261. /* Kernel support routine prototypes */
  262. extern STATUS _pthreadLibInit(FUNCPTR deleteUserTaskEntry);
  263. extern int _pthreadCreate (pthread_t *pThread,
  264.                 const pthread_attr_t *pAttr,
  265.                 void * (*wrapperFunc)(void *),
  266.                 void * (*start_routine)(void *),
  267.                 void *arg,
  268. int priNumMode);
  269. extern int _pthreadSetCancelType (int type, int * oldtype);
  270. extern int _pthreadSemOwnerGet (SEM_ID semId);
  271. #if defined(__cplusplus)
  272. }
  273. #endif /* __cplusplus */
  274. #endif /* __INCpthreadh */