File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / php / Zend / zend_signal.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue May 29 12:34:36 2012 UTC (12 years, 5 months ago) by misho
Branches: php, MAIN
CVS tags: v5_4_3elwix, v5_4_29p0, v5_4_29, v5_4_20p0, v5_4_20, v5_4_17p0, v5_4_17, HEAD
php 5.4.3+patches

    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: zend_signal.h,v 1.1.1.1 2012/05/29 12:34:36 misho Exp $ */
   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>