pthread.h
上传用户:sdaoma
上传日期:2013-08-07
资源大小:3838k
文件大小:16k
源码类别:

GPS编程

开发平台:

C/C++

  1. /**
  2.  * file ucos2_pthread.h
  3.  * author Wei Yongming <ymwei@minigui.org>
  4.  * date 2003/02/03
  5.  * 
  6.  * Description:   This header contains the pthread definitions needed to 
  7.  *                support MiniGUI under uC/OS-II. 
  8.  *
  9.  verbatim
  10.     Copyright (C) 2004 Feynman Software.
  11.     This file is part of MiniGUI, a compact cross-platform Graphics 
  12.     User Interface (GUI) support system for real-time embedded systems.
  13.     This program is free software; you can redistribute it and/or modify
  14.     it under the terms of the GNU General Public License as published by
  15.     the Free Software Foundation; either version 2 of the License, or
  16.     (at your option) any later version.
  17.     This program is distributed in the hope that it will be useful,
  18.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  19.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  20.     GNU General Public License for more details.
  21.     You should have received a copy of the GNU General Public License
  22.     along with this program; if not, write to the Free Software
  23.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  24.  endverbatim
  25.  */
  26. /*
  27.  * $Id: ucos2_pthread.h,v 1.5 2004/10/20 02:02:11 weiym Exp $
  28.  *
  29.  *             MiniGUI for Linux/uClinux, eCos, uC/OS-II, VxWorks version 1.6.x
  30.  *             Copyright (C) 1998-2002 Wei Yongming.
  31.  *             Copyright (C) 2002-2004 Feynman Software.
  32.  */
  33. #ifndef UCOSII_PTHREAD_H
  34. #define UCOSII_PTHREAD_H
  35. #include "common.h"
  36. #ifdef __UCOSII__
  37. #include <stddef.h>
  38. //=============================================================================
  39. // Tunable macros
  40. #define NR_POSIX_PTHREAD_THREADS_MAX    16      // This can not be less than 5.
  41. #define HIGHEST_UCOSII_PTHREAD_PRIORITY 16
  42. #define LOWEST_UCOSII_PTHREAD_PRIORITY  (HIGHEST_UCOSII_PTHREAD_PRIORITY + NR_POSIX_PTHREAD_THREADS_MAX - 1)
  43. #undef PTHREAD_KEYS_MAX
  44. #define PTHREAD_KEYS_MAX                64
  45. #undef PTHREAD_STACK_MIN
  46. #define PTHREAD_STACK_MIN               (PTHREAD_KEYS_MAX * sizeof(void *) + 1024*8)
  47. #undef PTHREAD_DESTRUCTOR_ITERATIONS
  48. #define PTHREAD_DESTRUCTOR_ITERATIONS  4
  49. #define UCOSII_THREAD_LOWEST_PRIORITY   64
  50. //-----------------------------------------------------------------------------
  51. // Internal types
  52. #define pthread_t ucos2_pthread_t
  53. #define pthread_key_t ucos2_pthread_key_t
  54. #define pthread_once_t ucos2_pthread_once_t
  55. #define pthread_attr_t ucos2_pthread_attr_t
  56. #define pthread_mutex_t ucos2_pthread_mutex_t
  57. #define pthread_mutexattr_t ucos2_pthread_mutexattr_t
  58. //-----------------------------------------------------------------------------
  59. // Basic types.
  60. typedef unsigned int pthread_t;
  61. typedef int pthread_key_t;
  62. typedef int pthread_once_t;
  63. //-----------------------------------------------------------------------------
  64. // Scheduling parameters. At present only the priority is defined.
  65. struct sched_param
  66. {
  67.     int                 prio;
  68. };
  69. //-----------------------------------------------------------------------------
  70. // Thread attribute structure.
  71. typedef struct pthread_attr_t
  72. {
  73.     unsigned int        detachstate:2,
  74. #if 0 /* not support in uC/OS-II */
  75.                         scope:2,
  76.                         inheritsched:2,
  77.                         schedpolicy:2,
  78. #endif /* not support in uC/OS-II */
  79.                         stackaddr_valid:1,
  80.                         stacksize_valid:1;
  81.     struct sched_param  schedparam;
  82.     void                *stackaddr;
  83.     size_t              stacksize;
  84. } pthread_attr_t;
  85. // Values for detachstate
  86. #define PTHREAD_CREATE_JOINABLE         1
  87. #define PTHREAD_CREATE_DETACHED         2
  88. #if 0 /* not support in uC/OS-II */
  89. // Values for scope
  90. #define PTHREAD_SCOPE_SYSTEM            1
  91. #define PTHREAD_SCOPE_PROCESS           2
  92. // Values for inheritsched
  93. #define PTHREAD_INHERIT_SCHED           1
  94. #define PTHREAD_EXPLICIT_SCHED          2
  95. #endif /* not support in uC/OS-II */
  96. //=============================================================================
  97. // General thread operations
  98. //-----------------------------------------------------------------------------
  99. // Thread creation and management.
  100. // Create a thread.
  101. int pthread_create ( pthread_t *thread,
  102.                              const pthread_attr_t *attr,
  103.                              void *(*start_routine) (void *),
  104.                              void *arg);
  105. // Get current thread id.
  106. pthread_t pthread_self ( void );
  107. // Compare two thread identifiers.
  108. int pthread_equal (pthread_t thread1, pthread_t thread2);
  109. // Terminate current thread.
  110. void pthread_exit (void *retval);
  111. // Wait for the thread to terminate. If thread_return is not NULL then
  112. // the retval from the thread's call to pthread_exit() is stored at
  113. // *thread_return.
  114. int pthread_join (pthread_t thread, void **thread_return);
  115. // Set the detachstate of the thread to "detached". The thread then does not
  116. // need to be joined and its resources will be freed when it exits.
  117. int pthread_detach (pthread_t thread);
  118. #if 0 /* not support in uC/OS-II */
  119. //-----------------------------------------------------------------------------
  120. // Thread scheduling controls
  121. // Set scheduling policy and parameters for the thread
  122. int pthread_setschedparam (pthread_t thread,
  123.                                    int policy,
  124.                                    const struct sched_param *param);
  125. // Get scheduling policy and parameters for the thread
  126. int pthread_getschedparam (pthread_t thread,
  127.                                    int *policy,
  128.                                    struct sched_param *param);
  129. #endif /* not support in uC/OS-II */
  130. //-----------------------------------------------------------------------------
  131. // Thread attribute handling.
  132. // Initialize attributes object with default attributes:
  133. // detachstate          == PTHREAD_JOINABLE
  134. // scope                == PTHREAD_SCOPE_SYSTEM
  135. // inheritsched         == PTHREAD_EXPLICIT_SCHED
  136. // schedpolicy          == SCHED_OTHER
  137. // schedparam           == unset
  138. // stackaddr            == unset
  139. // stacksize            == 0
  140. // 
  141. int pthread_attr_init (pthread_attr_t *attr);
  142. // Destroy thread attributes object
  143. int pthread_attr_destroy (pthread_attr_t *attr);
  144. // Set the detachstate attribute
  145. int pthread_attr_setdetachstate (pthread_attr_t *attr,
  146.                                          int detachstate);
  147. // Get the detachstate attribute
  148. int pthread_attr_getdetachstate (const pthread_attr_t *attr,
  149.                                          int *detachstate);
  150. // Set scheduling contention scope
  151. int pthread_attr_setscope (pthread_attr_t *attr, int scope);
  152. // Get scheduling contention scope
  153. int pthread_attr_getscope (const pthread_attr_t *attr, int *scope);
  154. // Set scheduling inheritance attribute
  155. int pthread_attr_setinheritsched (pthread_attr_t *attr, int inherit);
  156. // Get scheduling inheritance attribute
  157. int pthread_attr_getinheritsched (const pthread_attr_t *attr,
  158.                                           int *inherit);
  159. // Set scheduling policy
  160. int pthread_attr_setschedpolicy (pthread_attr_t *attr, int policy);
  161. // Get scheduling policy
  162. int pthread_attr_getschedpolicy (const pthread_attr_t *attr,
  163.                                          int *policy);
  164. // Set scheduling parameters
  165. int pthread_attr_setschedparam (pthread_attr_t *attr,
  166.         const struct sched_param *param);
  167. // Get scheduling parameters
  168. int pthread_attr_getschedparam (const pthread_attr_t *attr,
  169.                                         struct sched_param *param);
  170. // Set starting address of stack. Whether this is at the start or end of
  171. // the memory block allocated for the stack depends on whether the stack
  172. // grows up or down.
  173. int pthread_attr_setstackaddr (pthread_attr_t *attr, void *stackaddr);
  174. // Get any previously set stack address.
  175. int pthread_attr_getstackaddr (const pthread_attr_t *attr,
  176.                                        void **stackaddr);
  177. // Set minimum creation stack size.
  178. int pthread_attr_setstacksize (pthread_attr_t *attr,
  179.                                        size_t stacksize);
  180. // Get current minimal stack size.
  181. int pthread_attr_getstacksize (const pthread_attr_t *attr,
  182.                                        size_t *stacksize);
  183. //=============================================================================
  184. // Dynamic package initialization
  185. // Initializer for pthread_once_t instances
  186. #define PTHREAD_ONCE_INIT       0
  187. // Call init_routine just the once per control variable.
  188. int pthread_once (pthread_once_t *once_control,
  189.                           void (*init_routine) (void));
  190. //=============================================================================
  191. //Thread specific data
  192. // Create a key to identify a location in the thread specific data area.
  193. // Each thread has its own distinct thread-specific data area but all are
  194. // addressed by the same keys. The destructor function is called whenever a
  195. // thread exits and the value associated with the key is non-NULL.
  196. int pthread_key_create (pthread_key_t *key,
  197.                                 void (*destructor) (void *));
  198. // Delete key.
  199. int pthread_key_delete (pthread_key_t key);
  200. // Store the pointer value in the thread-specific data slot addressed
  201. // by the key.
  202. int pthread_setspecific (pthread_key_t key, const void *pointer);
  203. // Retrieve the pointer value in the thread-specific data slot addressed
  204. // by the key.
  205. void *pthread_getspecific (pthread_key_t key);
  206. //=============================================================================
  207. // Thread Cancellation
  208. //-----------------------------------------------------------------------------
  209. // Data structure used to manage cleanup functions
  210. struct pthread_cleanup_buffer
  211. {
  212.     struct pthread_cleanup_buffer *prev;        // Chain cleanup buffers
  213.     void (*routine) (void *);              // Function to call
  214.     void *arg;         // Arg to pass
  215. };
  216. //-----------------------------------------------------------------------------
  217. // Thread cancelled return value.
  218. // This is a value returned as the retval in pthread_join() of a
  219. // thread that has been cancelled. By making it the address of a
  220. // location we define we can ensure that it differs from NULL and any
  221. // other valid pointer (as required by the standard).
  222. extern int pthread_canceled_dummy_var;
  223. #define PTHREAD_CANCELED                ((void *)(&pthread_canceled_dummy_var))
  224. //-----------------------------------------------------------------------------
  225. // Cancelability enable and type
  226. #define PTHREAD_CANCEL_ENABLE           1
  227. #define PTHREAD_CANCEL_DISABLE          2
  228. #define PTHREAD_CANCEL_ASYNCHRONOUS     1
  229. #define PTHREAD_CANCEL_DEFERRED         2
  230. //-----------------------------------------------------------------------------
  231. // Functions
  232. // Set cancel state of current thread to ENABLE or DISABLE.
  233. // Returns old state in *oldstate.
  234. int pthread_setcancelstate (int state, int *oldstate);
  235. // Set cancel type of current thread to ASYNCHRONOUS or DEFERRED.
  236. // Returns old type in *oldtype.
  237. int pthread_setcanceltype (int type, int *oldtype);
  238. // Cancel the thread.
  239. int pthread_cancel (pthread_t thread);
  240. // Test for a pending cancellation for the current thread and terminate
  241. // the thread if there is one.
  242. void pthread_testcancel (void);
  243. // Install a cleanup routine.
  244. // Note that pthread_cleanup_push() and pthread_cleanup_pop() are macros that
  245. // must be used in matching pairs and at the same brace nesting level.
  246. #define pthread_cleanup_push(routine,arg)                       
  247.     {                                                           
  248.         struct pthread_cleanup_buffer _buffer_;                 
  249.         pthread_cleanup_push_inner (&_buffer_, (routine), (arg));
  250. // Remove a cleanup handler installed by the matching pthread_cleanup_push().
  251. // If execute is non-zero, the handler function is called.
  252. #define pthread_cleanup_pop(execute)                            
  253.         pthread_cleanup_pop_inner (&_buffer_, (execute));       
  254.     }
  255. // These two functions actually implement the cleanup push and pop functionality.
  256. void pthread_cleanup_push_inner (struct pthread_cleanup_buffer *buffer,
  257.                                          void (*routine) (void *),
  258.                                          void *arg);
  259. void pthread_cleanup_pop_inner (struct pthread_cleanup_buffer *buffer,
  260.                                         int execute);
  261. //-----------------------------------------------------------------------------
  262. // Mutex object
  263. typedef struct
  264. {
  265.     void*   os_mutex;
  266. } pthread_mutex_t;
  267. // We do not implement PTHREAD_MUTEX_INITIALIZER
  268. #undef PTHREAD_MUTEX_INITIALIZER
  269. //-----------------------------------------------------------------------------
  270. // Mutex attributes structure
  271. typedef struct
  272. {
  273.     unsigned char prio;
  274. } pthread_mutexattr_t;
  275. //=============================================================================
  276. // Mutexes
  277. //-----------------------------------------------------------------------------
  278. // Mutex attributes manipulation functions
  279. // Initialize attribute object
  280. int pthread_mutexattr_init ( pthread_mutexattr_t *attr);
  281. // Destroy attribute object
  282. int pthread_mutexattr_destroy ( pthread_mutexattr_t *attr);
  283. // Set priority
  284. int pthread_mutexattr_setpriority ( pthread_mutexattr_t *attr, int priority);
  285. // Get priority
  286. int pthread_mutexattr_getpriority ( pthread_mutexattr_t *attr, int* priority);
  287. //-----------------------------------------------------------------------------
  288. // Mutex functions
  289. // Initialize mutex. If mutex_attr is NULL, use default attributes.
  290. int pthread_mutex_init (pthread_mutex_t *mutex,
  291.                                 const pthread_mutexattr_t *mutex_attr);
  292. // Destroy mutex.
  293. int pthread_mutex_destroy (pthread_mutex_t *mutex);
  294. // Lock mutex, waiting for it if necessary.
  295. int pthread_mutex_lock (pthread_mutex_t *mutex);
  296. // Try to lock mutex.
  297. int pthread_mutex_trylock (pthread_mutex_t *mutex);
  298. // Unlock mutex.
  299. int pthread_mutex_unlock (pthread_mutex_t *mutex);
  300. #if 0 /* We do not implement pthread condition variable */
  301. //-----------------------------------------------------------------------------
  302. // Condition Variable structure.
  303. // Like mutexes, this must match the underlying eCos implementation class.
  304. typedef struct
  305. {
  306.     int         dummy;
  307. } pthread_cond_t;
  308. #define PTHREAD_COND_INITIALIZER { 0, 0 }
  309. //-----------------------------------------------------------------------------
  310. // Condition variable attributes structure
  311. typedef struct
  312. {
  313.     int         dummy;
  314. } pthread_condattr_t;
  315. //=============================================================================
  316. // Condition Variables
  317. //-----------------------------------------------------------------------------
  318. // Attribute manipulation functions
  319. // We do not actually support any attributes at present, so these do nothing.
  320. // Initialize condition variable attributes
  321. int pthread_condattr_init (pthread_condattr_t *attr);
  322. // Destroy condition variable attributes
  323. int pthread_condattr_destroy (pthread_condattr_t *attr);
  324. //-----------------------------------------------------------------------------
  325. // Condition variable functions
  326. // Initialize condition variable.
  327. int pthread_cond_init (pthread_cond_t *cond,
  328.                                const pthread_condattr_t *attr);
  329. // Destroy condition variable.
  330. int pthread_cond_destroy (pthread_cond_t *cond);
  331. // Wake up one thread waiting for condition variable
  332. int pthread_cond_signal (pthread_cond_t *cond);
  333. // Wake up all threads waiting for condition variable
  334. int pthread_cond_broadcast (pthread_cond_t *cond);
  335. // Block on condition variable until signalled. The mutex is
  336. // assumed to be locked before this call, will be unlocked
  337. // during the wait, and will be re-locked on wakeup.
  338. int pthread_cond_wait (pthread_cond_t *cond,
  339.                                pthread_mutex_t *mutex);
  340. // Block on condition variable until signalled, or the timeout expires.
  341. int pthread_cond_timedwait (pthread_cond_t *cond,
  342.                                     pthread_mutex_t *mutex,
  343.                                     const struct timespec *abstime);
  344. #endif /* We do not implement pthread condition variable*/
  345. #endif /* __UCOSII__ */
  346. #endif /* UCOSII_PTHREAD_H */