Annotation of embedaddon/php/Zend/zend_signal.h, revision 1.1
1.1 ! misho 1: /*
! 2: +----------------------------------------------------------------------+
! 3: | Zend Signal Handling |
! 4: +----------------------------------------------------------------------+
! 5: | Copyright (c) 2008 The PHP Group |
! 6: +----------------------------------------------------------------------+
! 7: | This source file is subject to version 3.01 of the PHP license, |
! 8: | that is bundled with this package in the file LICENSE, and is |
! 9: | available through the world-wide-web at the following url: |
! 10: | http://www.php.net/license/3_01.txt |
! 11: | If you did not receive a copy of the PHP license and are unable to |
! 12: | obtain it through the world-wide-web, please send a note to |
! 13: | license@php.net so we can mail you a copy immediately. |
! 14: +----------------------------------------------------------------------+
! 15: | Authors: Lucas Nealan <lucas@php.net> |
! 16: | Arnaud Le Blanc <lbarnaud@php.net> |
! 17: +----------------------------------------------------------------------+
! 18:
! 19: */
! 20:
! 21: /* $Id$ */
! 22:
! 23: #ifndef ZEND_SIGNAL_H
! 24: #define ZEND_SIGNAL_H
! 25:
! 26: #ifdef HAVE_SIGNAL_H
! 27: #include <signal.h>
! 28: #endif
! 29:
! 30: #ifndef NSIG
! 31: #define NSIG 65
! 32: #endif
! 33:
! 34: #ifndef ZEND_SIGNAL_QUEUE_SIZE
! 35: #define ZEND_SIGNAL_QUEUE_SIZE 32
! 36: #endif
! 37:
! 38: /* Signal structs */
! 39: typedef struct _zend_signal_entry_t {
! 40: int flags; /* sigaction style flags */
! 41: void* handler; /* signal handler or context */
! 42: } zend_signal_entry_t;
! 43:
! 44: typedef struct _zend_signal_t {
! 45: int signo;
! 46: siginfo_t *siginfo;
! 47: void* context;
! 48: } zend_signal_t;
! 49:
! 50: typedef struct _zend_signal_queue_t {
! 51: zend_signal_t zend_signal;
! 52: struct _zend_signal_queue_t *next;
! 53: } zend_signal_queue_t;
! 54:
! 55: /* Signal Globals */
! 56: typedef struct _zend_signal_globals_t {
! 57: int depth;
! 58: int blocked; /* 0==TRUE, -1==FALSE */
! 59: int running; /* in signal handler execution */
! 60: int active; /* internal signal handling is enabled */
! 61: int initialized; /* memory initialized */
! 62: zend_bool check; /* check for replaced handlers on shutdown */
! 63: zend_signal_entry_t handlers[NSIG];
! 64: zend_signal_queue_t pstorage[ZEND_SIGNAL_QUEUE_SIZE], *phead, *ptail, *pavail; /* pending queue */
! 65: } zend_signal_globals_t;
! 66:
! 67: #ifdef ZTS
! 68: # define SIGG(v) TSRMG(zend_signal_globals_id, zend_signal_globals_t *, v)
! 69: BEGIN_EXTERN_C()
! 70: ZEND_API extern int zend_signal_globals_id;
! 71: END_EXTERN_C()
! 72: # define ZEND_SIGNAL_BLOCK_INTERRUPUTIONS() if (EXPECTED(zend_signal_globals_id)) { SIGG(depth)++; }
! 73: # define ZEND_SIGNAL_UNBLOCK_INTERRUPTIONS() if (EXPECTED(zend_signal_globals_id) && UNEXPECTED((--SIGG(depth))==SIGG(blocked))) { zend_signal_handler_unblock(TSRMLS_C); }
! 74: #else /* ZTS */
! 75: # define SIGG(v) (zend_signal_globals.v)
! 76: extern ZEND_API zend_signal_globals_t zend_signal_globals;
! 77: # define ZEND_SIGNAL_BLOCK_INTERRUPUTIONS() SIGG(depth)++;
! 78: # define ZEND_SIGNAL_UNBLOCK_INTERRUPTIONS() if (UNEXPECTED((--SIGG(depth))==SIGG(blocked))) { zend_signal_handler_unblock(TSRMLS_C); }
! 79: #endif /* not ZTS */
! 80:
! 81: # define SIGNAL_BEGIN_CRITICAL() sigset_t oldmask; \
! 82: zend_sigprocmask(SIG_BLOCK, &global_sigmask, &oldmask);
! 83: # define SIGNAL_END_CRITICAL() zend_sigprocmask(SIG_SETMASK, &oldmask, NULL);
! 84:
! 85: void zend_signal_handler_defer(int signo, siginfo_t *siginfo, void *context);
! 86: ZEND_API void zend_signal_handler_unblock();
! 87: void zend_signal_activate(TSRMLS_D);
! 88: void zend_signal_deactivate(TSRMLS_D);
! 89: void zend_signal_startup();
! 90: void zend_signal_shutdown(TSRMLS_D);
! 91: ZEND_API int zend_signal(int signo, void (*handler)(int) TSRMLS_DC);
! 92: ZEND_API int zend_sigaction(int signo, const struct sigaction *act, struct sigaction *oldact TSRMLS_DC);
! 93:
! 94: #ifdef ZTS
! 95: #define zend_sigprocmask(signo, set, oldset) tsrm_sigmask((signo), (set), (oldset))
! 96: #else
! 97: #define zend_sigprocmask(signo, set, oldset) sigprocmask((signo), (set), (oldset))
! 98: #endif
! 99:
! 100: #endif /* ZEND_SIGNAL_H */
! 101:
! 102: /*
! 103: * Local variables:
! 104: * tab-width: 4
! 105: * c-basic-offset: 4
! 106: * indent-tabs-mode: t
! 107: * End:
! 108: */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>