Annotation of embedaddon/php/TSRM/TSRM.h, revision 1.1
1.1 ! misho 1: /*
! 2: +----------------------------------------------------------------------+
! 3: | Thread Safe Resource Manager |
! 4: +----------------------------------------------------------------------+
! 5: | Copyright (c) 1999-2011, Andi Gutmans, Sascha Schumann, Zeev Suraski |
! 6: | This source file is subject to the TSRM license, that is bundled |
! 7: | with this package in the file LICENSE |
! 8: +----------------------------------------------------------------------+
! 9: | Authors: Zeev Suraski <zeev@zend.com> |
! 10: +----------------------------------------------------------------------+
! 11: */
! 12:
! 13: #ifndef TSRM_H
! 14: #define TSRM_H
! 15:
! 16: #if !defined(__CYGWIN__) && defined(WIN32)
! 17: # define TSRM_WIN32
! 18: # include "tsrm_config.w32.h"
! 19: #else
! 20: # include <tsrm_config.h>
! 21: #endif
! 22:
! 23: #ifdef TSRM_WIN32
! 24: # ifdef TSRM_EXPORTS
! 25: # define TSRM_API __declspec(dllexport)
! 26: # else
! 27: # define TSRM_API __declspec(dllimport)
! 28: # endif
! 29: #elif defined(__GNUC__) && __GNUC__ >= 4
! 30: # define TSRM_API __attribute__ ((visibility("default")))
! 31: #else
! 32: # define TSRM_API
! 33: #endif
! 34:
! 35: #ifdef _WIN64
! 36: typedef __int64 tsrm_intptr_t;
! 37: typedef unsigned __int64 tsrm_uintptr_t;
! 38: #else
! 39: typedef long tsrm_intptr_t;
! 40: typedef unsigned long tsrm_uintptr_t;
! 41: #endif
! 42:
! 43: /* Only compile multi-threading functions if we're in ZTS mode */
! 44: #ifdef ZTS
! 45:
! 46: #ifdef TSRM_WIN32
! 47: # ifndef TSRM_INCLUDE_FULL_WINDOWS_HEADERS
! 48: # define WIN32_LEAN_AND_MEAN
! 49: # endif
! 50: # include <windows.h>
! 51: # include <shellapi.h>
! 52: #elif defined(GNUPTH)
! 53: # include <pth.h>
! 54: #elif defined(PTHREADS)
! 55: # include <pthread.h>
! 56: #elif defined(TSRM_ST)
! 57: # include <st.h>
! 58: #elif defined(BETHREADS)
! 59: #include <kernel/OS.h>
! 60: #include <TLS.h>
! 61: #endif
! 62:
! 63: typedef int ts_rsrc_id;
! 64:
! 65: /* Define THREAD_T and MUTEX_T */
! 66: #ifdef TSRM_WIN32
! 67: # define THREAD_T DWORD
! 68: # define MUTEX_T CRITICAL_SECTION *
! 69: #elif defined(GNUPTH)
! 70: # define THREAD_T pth_t
! 71: # define MUTEX_T pth_mutex_t *
! 72: #elif defined(PTHREADS)
! 73: # define THREAD_T pthread_t
! 74: # define MUTEX_T pthread_mutex_t *
! 75: #elif defined(NSAPI)
! 76: # define THREAD_T SYS_THREAD
! 77: # define MUTEX_T CRITICAL
! 78: #elif defined(PI3WEB)
! 79: # define THREAD_T PIThread *
! 80: # define MUTEX_T PISync *
! 81: #elif defined(TSRM_ST)
! 82: # define THREAD_T st_thread_t
! 83: # define MUTEX_T st_mutex_t
! 84: #elif defined(BETHREADS)
! 85: # define THREAD_T thread_id
! 86: typedef struct {
! 87: sem_id sem;
! 88: int32 ben;
! 89: } beos_ben;
! 90: # define MUTEX_T beos_ben *
! 91: #endif
! 92:
! 93: typedef void (*ts_allocate_ctor)(void *, void ***);
! 94: typedef void (*ts_allocate_dtor)(void *, void ***);
! 95:
! 96: #define THREAD_HASH_OF(thr,ts) (unsigned long)thr%(unsigned long)ts
! 97:
! 98: #ifdef __cplusplus
! 99: extern "C" {
! 100: #endif
! 101:
! 102: /* startup/shutdown */
! 103: TSRM_API int tsrm_startup(int expected_threads, int expected_resources, int debug_level, char *debug_filename);
! 104: TSRM_API void tsrm_shutdown(void);
! 105:
! 106: /* allocates a new thread-safe-resource id */
! 107: TSRM_API ts_rsrc_id ts_allocate_id(ts_rsrc_id *rsrc_id, size_t size, ts_allocate_ctor ctor, ts_allocate_dtor dtor);
! 108:
! 109: /* fetches the requested resource for the current thread */
! 110: TSRM_API void *ts_resource_ex(ts_rsrc_id id, THREAD_T *th_id);
! 111: #define ts_resource(id) ts_resource_ex(id, NULL)
! 112:
! 113: /* frees all resources allocated for the current thread */
! 114: TSRM_API void ts_free_thread(void);
! 115:
! 116: /* frees all resources allocated for all threads except current */
! 117: void ts_free_worker_threads(void);
! 118:
! 119: /* deallocates all occurrences of a given id */
! 120: TSRM_API void ts_free_id(ts_rsrc_id id);
! 121:
! 122:
! 123: /* Debug support */
! 124: #define TSRM_ERROR_LEVEL_ERROR 1
! 125: #define TSRM_ERROR_LEVEL_CORE 2
! 126: #define TSRM_ERROR_LEVEL_INFO 3
! 127:
! 128: typedef void (*tsrm_thread_begin_func_t)(THREAD_T thread_id, void ***tsrm_ls);
! 129: typedef void (*tsrm_thread_end_func_t)(THREAD_T thread_id, void ***tsrm_ls);
! 130:
! 131:
! 132: TSRM_API int tsrm_error(int level, const char *format, ...);
! 133: TSRM_API void tsrm_error_set(int level, char *debug_filename);
! 134:
! 135: /* utility functions */
! 136: TSRM_API THREAD_T tsrm_thread_id(void);
! 137: TSRM_API MUTEX_T tsrm_mutex_alloc(void);
! 138: TSRM_API void tsrm_mutex_free(MUTEX_T mutexp);
! 139: TSRM_API int tsrm_mutex_lock(MUTEX_T mutexp);
! 140: TSRM_API int tsrm_mutex_unlock(MUTEX_T mutexp);
! 141:
! 142: TSRM_API void *tsrm_set_new_thread_begin_handler(tsrm_thread_begin_func_t new_thread_begin_handler);
! 143: TSRM_API void *tsrm_set_new_thread_end_handler(tsrm_thread_end_func_t new_thread_end_handler);
! 144:
! 145: /* these 3 APIs should only be used by people that fully understand the threading model
! 146: * used by PHP/Zend and the selected SAPI. */
! 147: TSRM_API void *tsrm_new_interpreter_context(void);
! 148: TSRM_API void *tsrm_set_interpreter_context(void *new_ctx);
! 149: TSRM_API void tsrm_free_interpreter_context(void *context);
! 150:
! 151: #define TSRM_SHUFFLE_RSRC_ID(rsrc_id) ((rsrc_id)+1)
! 152: #define TSRM_UNSHUFFLE_RSRC_ID(rsrc_id) ((rsrc_id)-1)
! 153:
! 154: #define TSRMLS_FETCH() void ***tsrm_ls = (void ***) ts_resource_ex(0, NULL)
! 155: #define TSRMLS_FETCH_FROM_CTX(ctx) void ***tsrm_ls = (void ***) ctx
! 156: #define TSRMLS_SET_CTX(ctx) ctx = (void ***) tsrm_ls
! 157: #define TSRMG(id, type, element) (((type) (*((void ***) tsrm_ls))[TSRM_UNSHUFFLE_RSRC_ID(id)])->element)
! 158: #define TSRMLS_D void ***tsrm_ls
! 159: #define TSRMLS_DC , TSRMLS_D
! 160: #define TSRMLS_C tsrm_ls
! 161: #define TSRMLS_CC , TSRMLS_C
! 162:
! 163: #ifdef __cplusplus
! 164: }
! 165: #endif
! 166:
! 167: #else /* non ZTS */
! 168:
! 169: #define TSRMLS_FETCH()
! 170: #define TSRMLS_FETCH_FROM_CTX(ctx)
! 171: #define TSRMLS_SET_CTX(ctx)
! 172: #define TSRMLS_D void
! 173: #define TSRMLS_DC
! 174: #define TSRMLS_C
! 175: #define TSRMLS_CC
! 176:
! 177: #endif /* ZTS */
! 178:
! 179: #endif /* TSRM_H */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>