home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / gnat-2.06-src.tgz / tar.out / fsf / gnat / ada / threads / src / signal_internals.h < prev    next >
C/C++ Source or Header  |  1996-09-28  |  7KB  |  246 lines

  1. /* Copyright (C) 1992, the Florida State University
  2.    Distributed by the Florida State University under the terms of the
  3.    GNU Library General Public License.
  4.  
  5. This file is part of Pthreads.
  6.  
  7. Pthreads is free software; you can redistribute it and/or
  8. modify it under the terms of the GNU Library General Public
  9. License as published by the Free Software Foundation (version 2).
  10.  
  11. Pthreads is distributed "AS IS" in the hope that it will be
  12. useful, but WITHOUT ANY WARRANTY; without even the implied
  13. warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  14. See the GNU Library General Public License for more details.
  15.  
  16. You should have received a copy of the GNU Library General Public
  17. License along with Pthreads; see the file COPYING.  If not, write
  18. to the Free Software Foundation, 675 Mass Ave, Cambridge,
  19. MA 02139, USA.
  20.  
  21. Report problems and direct all questions to:
  22.  
  23.   pthreads-bugs@ada.cs.fsu.edu
  24.  
  25.   @(#)signal_internals.h    2.5 4/12/95
  26.  
  27. */
  28.  
  29. #ifndef _pthread_signal_internals_h
  30. #define _pthread_signal_internals_h
  31.  
  32. #include <pthread/config.h>
  33. #include <../src/config_internals.h>
  34.  
  35. #if !defined(__signal_h) && !defined(_SIGNAL_H)
  36.  
  37. #if !defined(_ASM) && !defined(LOCORE)
  38. #include <pthread/signal.h>
  39. #endif
  40.  
  41. #ifdef DEBUG
  42. #define TEMPSTACK_SIZE (104*SA(MINFRAME)+SA(WINDOWSIZE))
  43. #else
  44. #define TEMPSTACK_SIZE ( 54*SA(MINFRAME)+SA(WINDOWSIZE))
  45. #endif
  46.  
  47. #define SIGCANCEL NSIG
  48.  
  49. #define DIRECTED_AT_THREAD (struct context_t *) NULL
  50.  
  51. #define TIME_SLICE 20000
  52.  
  53. /*
  54.  * MINUS_NTIME only works if src1 > src2
  55.  */
  56. #define MINUS_NTIME(dst, src1, src2) \
  57.   MACRO_BEGIN \
  58.     if ((src2).tv_nsec > (src1).tv_nsec) { \
  59.       (dst).tv_sec = (src1).tv_sec - (src2).tv_sec - 1; \
  60.       (dst).tv_nsec = ((src1).tv_nsec - (src2).tv_nsec) + 1000000000; \
  61.     } \
  62.     else { \
  63.       (dst).tv_sec = (src1).tv_sec - (src2).tv_sec; \
  64.       (dst).tv_nsec = (src1).tv_nsec - (src2).tv_nsec; \
  65.     } \
  66.   MACRO_END
  67.  
  68. #define PLUS_NTIME(dst, src1, src2) \
  69.   MACRO_BEGIN \
  70.     if (1000000000 - (src2).tv_nsec <= (src1).tv_nsec) { \
  71.       (dst).tv_sec = (src1).tv_sec + (src2).tv_sec + 1; \
  72.       (dst).tv_nsec = -1000000000 + (src1).tv_nsec + (src2).tv_nsec; \
  73.     } \
  74.     else { \
  75.       (dst).tv_sec = (src1).tv_sec + (src2).tv_sec; \
  76.       (dst).tv_nsec = (src1).tv_nsec + (src2).tv_nsec; \
  77.     } \
  78.   MACRO_END
  79.  
  80. #define GT_NTIME(t1, t2) \
  81.       (t1.tv_sec > t2.tv_sec || \
  82.        (t1.tv_sec == t2.tv_sec && \
  83.     t1.tv_nsec > t2.tv_nsec))
  84.  
  85. #define GTEQ_NTIME(t1, t2) \
  86.       ((t1).tv_sec > (t2).tv_sec || \
  87.        ((t1).tv_sec == (t2).tv_sec && \
  88.     (t1).tv_nsec >= (t2).tv_nsec))
  89.  
  90. #define LE0_NTIME(t1) \
  91.       ((t1).tv_sec < 0 || \
  92.        ((t1).tv_sec == 0 && \
  93.     (t1).tv_nsec <= 0))
  94.  
  95. /*
  96.  * MINUS_TIME only works if src1 > src2
  97.  */
  98. #define MINUS_TIME(dst, src1, src2) \
  99.   MACRO_BEGIN \
  100.     if ((src2).tv_usec > (src1).tv_usec) { \
  101.       (dst).tv_sec = (src1).tv_sec - (src2).tv_sec - 1; \
  102.       (dst).tv_usec = ((src1).tv_usec - (src2).tv_usec) + 1000000; \
  103.     } \
  104.     else { \
  105.       (dst).tv_sec = (src1).tv_sec - (src2).tv_sec; \
  106.       (dst).tv_usec = (src1).tv_usec - (src2).tv_usec; \
  107.     } \
  108.   MACRO_END
  109.  
  110. #define PLUS_TIME(dst, src1, src2) \
  111.   MACRO_BEGIN \
  112.     if (1000000 - (src2).tv_usec <= (src1).tv_usec) { \
  113.       (dst).tv_sec = (src1).tv_sec + (src2).tv_sec + 1; \
  114.       (dst).tv_usec = -1000000 + (src1).tv_usec + (src2).tv_usec; \
  115.     } \
  116.     else { \
  117.       (dst).tv_sec = (src1).tv_sec + (src2).tv_sec; \
  118.       (dst).tv_usec = (src1).tv_usec + (src2).tv_usec; \
  119.     } \
  120.   MACRO_END
  121.  
  122. #define GT_TIME(t1, t2) \
  123.       ((t1).tv_sec > (t2).tv_sec || \
  124.        ((t1).tv_sec == (t2).tv_sec && \
  125.     (t1).tv_usec > (t2).tv_usec))
  126.  
  127. #define GTEQ_TIME(t1, t2) \
  128.       ((t1).tv_sec > (t2).tv_sec || \
  129.        ((t1).tv_sec == (t2).tv_sec && \
  130.     (t1).tv_usec >= (t2).tv_usec))
  131.  
  132. #define LE0_TIME(t1) \
  133.       ((t1).tv_sec < 0 || \
  134.        ((t1).tv_sec == 0 && \
  135.     (t1).tv_usec <= 0))
  136.  
  137. #define P2U_TIME(dst, src) \
  138.   MACRO_BEGIN \
  139.   (dst).tv_sec = (src).tv_sec; \
  140.   (dst).tv_usec = (src).tv_nsec / 1000; \
  141.   MACRO_END
  142.  
  143. #define U2P_TIME(dst, src) \
  144.   MACRO_BEGIN \
  145.   (dst).tv_sec = (src).tv_sec; \
  146.   (dst).tv_nsec = (src).tv_usec * 1000; \
  147.   MACRO_END
  148.  
  149. #define ISNTIMERSET(tp) ((tp).tv_sec || (tp).tv_nsec)
  150. #define NTIMERCLEAR(tp) (tp).tv_sec = (tp).tv_nsec = 0
  151.  
  152. #ifdef SOLARIS
  153.  
  154. #define ILL_STACK 0x00
  155. #include <vm/faultcode.h>
  156. #define BUS_CODE(x) FC_CODE(x)
  157.  
  158. /*
  159.  * Perform signal manipulation as macros for speed; no error handling!
  160.  * We don't want error handling inside Pthreads since we use one more
  161.  * signal (SIGCANCEL) which would cause any manipulations to fail otherwise.
  162.  */
  163.  
  164. #define sigmask(n)              ((unsigned int)1 << (((n) - 1) & (32 - 1)))
  165. #define sigword(n)              (((unsigned int)((n) - 1))>>5)
  166.  
  167. #define sigaddset(s, n)         ((s)->__sigbits[sigword(n)] |= sigmask(n))
  168. #define sigdelset(s, n)         ((s)->__sigbits[sigword(n)] &= ~sigmask(n))
  169. #define sigismember(s, n)       (sigmask(n) & (s)->__sigbits[sigword(n)])
  170.  
  171. #else !SOLARIS
  172. #ifdef SVR4
  173.  
  174. /*
  175.  * should get most of the stuff from <signal.h>
  176.  * but may still needed: BUS_CODE, ILL_STACK, etc.
  177.  */
  178.  
  179. #else !SVR4
  180.  
  181. #define sigemptyset(set)        (*(set) = (sigset_t) 0)
  182. #define sigfillset(set)         (*(set) = (sigset_t) -1)
  183. #define sigaddset(set, signo)   (*(set) |= sigmask(signo))
  184. #define sigdelset(set, signo)   (*(set) &= ~sigmask(signo))
  185. #define sigismember(set, signo) (*(set) & sigmask(signo))
  186.  
  187. #endif !SVR4
  188. #endif !SOLARIS
  189.  
  190. /*
  191.  * define UNIX interface, de-multiplex overlayed function names via syscalls
  192.  */
  193. #define SIGPROCMASK          pthread_p_sigprocmask
  194. #define SIGACTION            pthread_p_sigaction
  195. #define SIGSUSPEND           pthread_p_sigsuspend
  196. #ifdef IO
  197. #define ACCEPT               pthread_p_accecpt
  198. #define SELECT               pthread_p_select
  199. #endif IO
  200.  
  201. #ifdef SVR4
  202.  
  203. #define SCP_ONSTACK    (scp->sc_flags & UC_STACK)
  204.  
  205. #define SCP_CODE       (sip ? sip->si_code : 0)
  206.  
  207. #define SIGSTACK_T     stack_t
  208. #define SIGSTACK       sigaltstack
  209. #define CLR_SS_ONSTACK ss.ss_flags = 0; ss.ss_size = TEMPSTACK_SIZE
  210.  
  211. #define STACK_OFFSET   TEMPSTACK_SIZE
  212.  
  213. #define GETPAGESIZE(x) sysconf(x)
  214.  
  215. #ifdef SYS_sigwait
  216. #define SYS_SIGWAIT SYS_sigwait
  217. #else
  218. #define SYS_SIGWAIT SYS_sigtimedwait
  219. #endif
  220.  
  221. #if !defined(_ASM) && !defined(LOCORE)
  222. typedef void *malloc_t;
  223. #endif !defined(_ASM) && !defined(LOCORE)
  224.  
  225. #else !SVR4
  226.  
  227. #define SCP_ONSTACK    (scp->sc_onstack)
  228.  
  229. #define CLR_SCP_ONSTACK scp->sc_onstack = FALSE
  230. #define SCP_CODE       code
  231.  
  232. #define SIGSTACK_T     struct sigstack
  233. #define SIGSTACK       sigstack
  234. #define CLR_SS_ONSTACK ss.ss_onstack = FALSE
  235.  
  236. #define GETPAGESIZE(x) getpagesize()
  237.  
  238. #define STACK_OFFSET   0
  239. #define SA_RESTART     0
  240.  
  241. #endif !SVR4
  242.  
  243. #endif    !__signal_h && !_SIGNAL_H
  244.  
  245. #endif /*!_pthread_signal_internals_h*/
  246.