home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1999 March B / SCO_CASTOR4RRT.iso / nsu / root / usr / include / mt.h / mt
Text File  |  1998-08-19  |  7KB  |  215 lines

  1. /*
  2.  * Copyright (c) 1998 The Santa Cruz Operation, Inc.. All Rights Reserved. 
  3.  *                                                                         
  4.  *        THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF THE               
  5.  *                   SANTA CRUZ OPERATION INC.                             
  6.  *                                                                         
  7.  *   The copyright notice above does not evidence any actual or intended   
  8.  *   publication of such source code.                                      
  9.  */
  10.  
  11. #ifndef _MT_H
  12. #define _MT_H
  13.  
  14. #ident    "@(#)head.usr:mt.h    1.10"
  15. #ident    "$Header: $"
  16.  
  17. /*
  18.  * mt.h - this file has all of the information that the
  19.  * libnsl subcomponents need to use to be thread-safe.
  20.  */
  21.  
  22. #if defined(__cplusplus)
  23. extern "C" {
  24. #endif
  25.  
  26. #include <errno.h>
  27.  
  28. #ifdef _REENTRANT
  29.  
  30. #include <thread.h>
  31. #include <synch.h>
  32.  
  33. #define MULTI_THREADED (_mt_multi_threaded)
  34. #define FIRST_OR_NO_THREAD \
  35.     ((MULTI_THREADED) ? ((* _mt_thr_selfp)() == _mt_first_thread) : 1)
  36.  
  37. #define THR_SELF() ((MULTI_THREADED) ? (* _mt_thr_selfp)() : 0)
  38.  
  39. #define THR_MINSTACK() ((MULTI_THREADED) ? (* _mt_thr_minstackp)() : 0)
  40.  
  41. #define THR_CREATE(stack_addr,stack_size,start_routine,arg,flags,new_thread) \
  42.        ((MULTI_THREADED) \
  43.        ? (* _mt_thr_createp) \
  44.          (stack_addr,stack_size,start_routine,arg,flags,new_thread) \
  45.        : EINVAL)
  46.  
  47. #define THR_EXIT(status) ((MULTI_THREADED) ? (* _mt_thr_exitp)(status) : EINVAL)
  48.  
  49. /* 
  50.  * The following macro sends a signal to the specified thread (if linked
  51.  * with libthread) or to the specified process (otherwise).
  52.  */
  53. #define MT_KILL(id, sig) \
  54.         ((MULTI_THREADED) ? (* _mt_thr_killp)(id, sig) : kill(id, sig))
  55.  
  56. /* 
  57.  * The following macro sends a signal to the calling thread (if linked
  58.  * with libthread) or to the calling process (otherwise).
  59.  */
  60. #define MT_KILL_SELF(sig) \
  61.         ((MULTI_THREADED) \
  62.         ? (* _mt_thr_killp)((* _mt_thr_selfp)(), sig) \
  63.         : kill(getpid(), sig))
  64.  
  65. #define MUTEX_T mutex_t
  66. #define MUTEX_INIT(lockp,type,argp) \
  67.      ((MULTI_THREADED) ? (* _mt_mutex_initp)(lockp,type,argp) : 0)
  68. #define MUTEX_LOCK(lockp) \
  69.      ((MULTI_THREADED) ? (* _mt_mutex_lockp)(lockp) : 0)
  70. #define MUTEX_TRYLOCK(lockp) \
  71.      ((MULTI_THREADED) ? (* _mt_mutex_trylockp)(lockp) : 0)
  72. #define MUTEX_UNLOCK(lockp) \
  73.      ((MULTI_THREADED) ? (* _mt_mutex_unlockp)(lockp) : 0)
  74. #define MUTEX_DESTROY(lockp) \
  75.      ((MULTI_THREADED) ? (* _mt_mutex_destroyp)(lockp) : 0)
  76.  
  77. #define RWLOCK_T rwlock_t
  78. #define RWLOCK_INIT(lockp,type,argp) \
  79.      ((MULTI_THREADED) ? (* _mt_rwlock_initp)(lockp,type,argp) : 0)
  80. #define RW_RDLOCK(lockp) \
  81.      ((MULTI_THREADED) ? (* _mt_rw_rdlockp)(lockp) : 0)
  82. #define RW_WRLOCK(lockp) \
  83.      ((MULTI_THREADED) ? (* _mt_rw_wrlockp)(lockp) : 0)
  84. #define RW_UNLOCK(lockp) \
  85.      ((MULTI_THREADED) ? (* _mt_rw_unlockp)(lockp) : 0)
  86. #define RWLOCK_DESTROY(lockp) \
  87.      ((MULTI_THREADED) ? (* _mt_rwlock_destroyp)(lockp) : 0)
  88.  
  89. #define THREAD_KEY_T thread_key_t
  90.  
  91. #define THR_KEYCREATE(keyp, destructor) \
  92.     ((MULTI_THREADED) ? (* _mt_thr_keycreatep)(keyp,destructor) : EINVAL)
  93.  
  94. #define THR_SETSPECIFIC(key, valuep) \
  95.     ((MULTI_THREADED) ? (* _mt_thr_setspecificp)((key), (valuep)) : EINVAL)
  96.  
  97. #define THR_GETSPECIFIC(key, valuepp) \
  98.     ((MULTI_THREADED) ? (* _mt_thr_getspecificp)((key), (valuepp)) : EINVAL)
  99.  
  100. /*
  101.  * The following two macros are part of a temporary patch required
  102.  * for libnsl and libsocket to prevent the interruption of ioctl()
  103.  * TI_BIND and TI_UNBIND requests, since they cannot be restarted.
  104.  */
  105.  
  106. #define MT_MASKSIGS(osetp) \
  107.     ((MULTI_THREADED) ? _mt_masksigs((osetp)) : 0)
  108.  
  109. #define MT_UNMASKSIGS(osetp) \
  110.     ((MULTI_THREADED) ? _mt_unmasksigs((osetp)) : 0)
  111.  
  112. /* End of patch section */
  113.  
  114. #if defined(__STDC__)
  115.  
  116. extern thread_t (* _mt_thr_selfp)(void);
  117. extern size_t (* _mt_thr_minstackp)(void);
  118. extern int (* _mt_thr_createp)(void*, size_t, void *(*)(void *),
  119.                    void *, long, thread_t *);
  120. extern int (* _mt_thr_exitp)(void *);
  121. extern int (* _mt_thr_killp)(thread_t, int);
  122. extern int (* _mt_mutex_initp)(mutex_t *, int, void *);
  123. extern int (* _mt_mutex_lockp)(mutex_t *);
  124. extern int (* _mt_mutex_trylockp)(mutex_t *);
  125. extern int (* _mt_mutex_unlockp)(mutex_t *);
  126. extern int (* _mt_mutex_destroyp)(mutex_t *);
  127. extern int (* _mt_rwlock_initp)(rwlock_t *, int, void *);
  128. extern int (* _mt_rw_rdlockp)(rwlock_t *);
  129. extern int (* _mt_rw_wrlockp)(rwlock_t *);
  130. extern int (* _mt_rw_unlockp)(rwlock_t *);
  131. extern int (* _mt_rwlock_destroyp)(rwlock_t *);
  132. /* This function is supplied for support of thread-specific data. */
  133. extern void *_mt_get_thr_specific_storage(thread_key_t, size_t);
  134. /* if everyone uses _mt_get_thr_specific_storage() these should not be here. */
  135. extern int (* _mt_thr_keycreatep)
  136.      (thread_key_t *key, void (*destructor)(void *value));
  137. extern int (* _mt_thr_setspecificp)(thread_key_t key, void *value);
  138. extern int (* _mt_thr_getspecificp)(thread_key_t key, void **value);
  139.  
  140. /* The following three lines are part of the temporary patch */
  141. extern int _mt_masksigs(sigset_t *);
  142. extern int _mt_unmasksigs(sigset_t *);
  143. extern int (* _mt_sigprocmaskp)(int, const sigset_t *, sigset_t *);
  144. /* End of patch section */
  145.  
  146. #else /* !__STDC__ */
  147.  
  148. extern thread_t (* _mt_thr_selfp)();
  149. extern size_t (* _mt_thr_minstackp)();
  150. extern int (* _mt_thr_createp)();
  151. extern int (* _mt_thr_exitp)();
  152. extern int (* _mt_thr_killp)();
  153. extern int (* _mt_mutex_initp)();
  154. extern int (* _mt_mutex_lockp)();
  155. extern int (* _mt_mutex_trylockp)();
  156. extern int (* _mt_mutex_unlockp)();
  157. extern int (* _mt_mutex_destroyp)();
  158. extern int (* _mt_rwlock_initp)();
  159. extern int (* _mt_rw_rdlockp)();
  160. extern int (* _mt_rw_wrlockp)();
  161. extern int (* _mt_rw_unlockp)();
  162. extern int (* _mt_rwlock_destroyp)();
  163. extern int (* _mt_thr_keycreatep)();
  164. extern int (* _mt_thr_setspecificp)();
  165. extern int (* _mt_thr_getspecificp)();
  166. /* This function is supplied for support of thread-specific data. */
  167. extern void *_mt_get_thr_specific_storage();
  168. /* The following three lines are part of the temporary patch */
  169. extern int _mt_masksigs();
  170. extern int _mt_unmasksigs();
  171. extern int (* _mt_sigprocmaskp)();
  172. /* End of patch section */
  173.  
  174. #endif     /* defined(__STDC__) */
  175.  
  176. /* This flag is checked by MULTI_THREADED macro. Simple boolean */
  177. extern int _mt_multi_threaded;
  178.  
  179. /* This variable is where we save the thread id of the first thread. */
  180. extern thread_t    _mt_first_thread;
  181.  
  182. #else /* !_REENTRANT */
  183.  
  184. #define MULTI_THREADED                  (0)
  185. #define FIRST_OR_NO_THREAD        (1)
  186. #define THR_SELF()                      (0)
  187. #define THR_MINSTACK()                  (0)
  188. #define THR_CREATE(a,b,c,d,e,f)        (EINVAL)
  189. #define THR_EXIT(status)        (EINVAL)
  190. #define MT_KILL(id, sig)         (kill(id, sig))
  191. #define MT_KILL_SELF(sig)         (kill(getpid(), sig))
  192. #define MUTEX_INIT(lockp,type,argp)    (0)
  193. #define MUTEX_LOCK(lockp)        (0)
  194. #define MUTEX_TRYLOCK(lockp)        (0)
  195. #define MUTEX_UNLOCK(lockp)        (0)
  196. #define MUTEX_DESTROY(lockp)        (0)
  197. #define THR_KEYCREATE(keyp,destructor)  (EINVAL)
  198. #define THR_SETSPECIFIC(key,key_tbl)    (EINVAL)
  199. #define THR_GETSPECIFIC(key,key_tblp)    (EINVAL)
  200. #define RWLOCK_INIT(lockp,type,argp)    (0)
  201. #define RW_RDLOCK(lockp)        (0)
  202. #define RW_WRLOCK(lockp)        (0)
  203. #define RW_UNLOCK(lockp)        (0)
  204. #define RWLOCK_DESTROY(lockp)        (0)
  205. #define MT_MASKSIGS(osetp)         (0)
  206. #define MT_UNMASKSIGS(osetp)        (0)
  207.  
  208. #endif /* _REENTRANT */
  209.  
  210. #if defined(__cplusplus)
  211. }
  212. #endif
  213.  
  214. #endif /* _MT_H */
  215.