php-src/TSRM/TSRM.h

178 lines
5.1 KiB
C
Raw Normal View History

1999-04-23 11:00:02 +00:00
/*
+----------------------------------------------------------------------+
| Thread Safe Resource Manager |
+----------------------------------------------------------------------+
2007-01-01 09:36:18 +00:00
| Copyright (c) 1999-2007, Andi Gutmans, Sascha Schumann, Zeev Suraski |
| This source file is subject to the TSRM license, that is bundled |
| with this package in the file LICENSE |
1999-04-23 11:00:02 +00:00
+----------------------------------------------------------------------+
| Authors: Zeev Suraski <zeev@zend.com> |
1999-04-23 11:00:02 +00:00
+----------------------------------------------------------------------+
*/
#ifndef TSRM_H
#define TSRM_H
1999-04-20 23:58:02 +00:00
2007-02-15 19:11:48 +00:00
#if !defined(__CYGWIN__) && defined(WIN32)
2001-07-28 12:16:43 +00:00
# define TSRM_WIN32
2002-08-07 14:47:42 +00:00
# include "tsrm_config.w32.h"
2007-02-15 19:11:48 +00:00
#else
# include <tsrm_config.h>
2001-07-28 12:16:43 +00:00
#endif
#ifdef TSRM_WIN32
# ifdef TSRM_EXPORTS
# define TSRM_API __declspec(dllexport)
# else
# define TSRM_API __declspec(dllimport)
# endif
#else
# define TSRM_API
#endif
2007-04-16 08:09:56 +00:00
#ifdef _WIN64
2007-04-17 06:26:32 +00:00
typedef __int64 tsrm_intptr_t;
typedef unsigned __int64 tsrm_uintptr_t;
2007-04-16 08:09:56 +00:00
#else
typedef long tsrm_intptr_t;
typedef unsigned long tsrm_uintptr_t;
#endif
/* Only compile multi-threading functions if we're in ZTS mode */
#ifdef ZTS
2000-09-02 15:03:19 +00:00
#ifdef TSRM_WIN32
# ifndef TSRM_INCLUDE_FULL_WINDOWS_HEADERS
# define WIN32_LEAN_AND_MEAN
# endif
1999-04-24 09:01:30 +00:00
# include <windows.h>
# include <shellapi.h>
#elif defined(GNUPTH)
# include <pth.h>
1999-04-24 09:01:30 +00:00
#elif defined(PTHREADS)
# include <pthread.h>
#elif defined(TSRM_ST)
# include <st.h>
#elif defined(BETHREADS)
#include <kernel/OS.h>
#include <TLS.h>
1999-04-24 09:01:30 +00:00
#endif
1999-04-20 23:58:02 +00:00
typedef int ts_rsrc_id;
/* Define THREAD_T and MUTEX_T */
2000-09-02 15:03:19 +00:00
#ifdef TSRM_WIN32
1999-04-20 23:58:02 +00:00
# define THREAD_T DWORD
# define MUTEX_T CRITICAL_SECTION *
#elif defined(GNUPTH)
# define THREAD_T pth_t
# define MUTEX_T pth_mutex_t *
1999-04-20 23:58:02 +00:00
#elif defined(PTHREADS)
# define THREAD_T pthread_t
# define MUTEX_T pthread_mutex_t *
#elif defined(NSAPI)
# define THREAD_T SYS_THREAD
# define MUTEX_T CRITICAL
#elif defined(PI3WEB)
# define THREAD_T PIThread *
# define MUTEX_T PISync *
#elif defined(TSRM_ST)
# define THREAD_T st_thread_t
# define MUTEX_T st_mutex_t
#elif defined(BETHREADS)
# define THREAD_T thread_id
typedef struct {
sem_id sem;
int32 ben;
} beos_ben;
# define MUTEX_T beos_ben *
1999-04-20 23:58:02 +00:00
#endif
typedef void (*ts_allocate_ctor)(void *, void ***);
typedef void (*ts_allocate_dtor)(void *, void ***);
1999-04-20 23:58:02 +00:00
#define THREAD_HASH_OF(thr,ts) (unsigned long)thr%(unsigned long)ts
1999-04-20 23:58:02 +00:00
1999-08-14 09:35:52 +00:00
#ifdef __cplusplus
extern "C" {
#endif
1999-04-20 23:58:02 +00:00
/* startup/shutdown */
2000-11-18 02:41:14 +00:00
TSRM_API int tsrm_startup(int expected_threads, int expected_resources, int debug_level, char *debug_filename);
TSRM_API void tsrm_shutdown(void);
1999-04-20 23:58:02 +00:00
/* allocates a new thread-safe-resource id */
TSRM_API ts_rsrc_id ts_allocate_id(ts_rsrc_id *rsrc_id, size_t size, ts_allocate_ctor ctor, ts_allocate_dtor dtor);
1999-04-20 23:58:02 +00:00
/* fetches the requested resource for the current thread */
TSRM_API void *ts_resource_ex(ts_rsrc_id id, THREAD_T *th_id);
#define ts_resource(id) ts_resource_ex(id, NULL)
1999-04-20 23:58:02 +00:00
/* frees all resources allocated for the current thread */
TSRM_API void ts_free_thread(void);
1999-04-20 23:58:02 +00:00
/* frees all resources allocated for all threads except current */
void ts_free_worker_threads(void);
1999-04-20 23:58:02 +00:00
/* deallocates all occurrences of a given id */
1999-08-14 09:35:52 +00:00
TSRM_API void ts_free_id(ts_rsrc_id id);
1999-04-20 23:58:02 +00:00
/* Debug support */
#define TSRM_ERROR_LEVEL_ERROR 1
2000-11-18 02:41:14 +00:00
#define TSRM_ERROR_LEVEL_CORE 2
#define TSRM_ERROR_LEVEL_INFO 3
2001-07-30 01:46:35 +00:00
typedef void (*tsrm_thread_begin_func_t)(THREAD_T thread_id, void ***tsrm_ls);
typedef void (*tsrm_thread_end_func_t)(THREAD_T thread_id, void ***tsrm_ls);
2000-11-18 02:41:14 +00:00
TSRM_API int tsrm_error(int level, const char *format, ...);
TSRM_API void tsrm_error_set(int level, char *debug_filename);
1999-04-20 23:58:02 +00:00
/* utility functions */
1999-08-14 09:35:52 +00:00
TSRM_API THREAD_T tsrm_thread_id(void);
TSRM_API MUTEX_T tsrm_mutex_alloc(void);
TSRM_API void tsrm_mutex_free(MUTEX_T mutexp);
TSRM_API int tsrm_mutex_lock(MUTEX_T mutexp);
TSRM_API int tsrm_mutex_unlock(MUTEX_T mutexp);
2001-07-30 01:46:35 +00:00
TSRM_API void *tsrm_set_new_thread_begin_handler(tsrm_thread_begin_func_t new_thread_begin_handler);
TSRM_API void *tsrm_set_new_thread_end_handler(tsrm_thread_end_func_t new_thread_end_handler);
1999-08-14 09:35:52 +00:00
/* these 3 APIs should only be used by people that fully understand the threading model
* used by PHP/Zend and the selected SAPI. */
TSRM_API void *tsrm_new_interpreter_context(void);
TSRM_API void *tsrm_set_interpreter_context(void *new_ctx);
TSRM_API void tsrm_free_interpreter_context(void *context);
#define TSRM_SHUFFLE_RSRC_ID(rsrc_id) ((rsrc_id)+1)
#define TSRM_UNSHUFFLE_RSRC_ID(rsrc_id) ((rsrc_id)-1)
#define TSRMLS_FETCH() void ***tsrm_ls = (void ***) ts_resource_ex(0, NULL)
#define TSRMLS_FETCH_FROM_CTX(ctx) void ***tsrm_ls = (void ***) ctx
2005-08-05 22:28:23 +00:00
#define TSRMLS_SET_CTX(ctx) ctx = (void ***) tsrm_ls
#define TSRMG(id, type, element) (((type) (*((void ***) tsrm_ls))[TSRM_UNSHUFFLE_RSRC_ID(id)])->element)
#define TSRMLS_D void ***tsrm_ls
#define TSRMLS_DC , TSRMLS_D
#define TSRMLS_C tsrm_ls
#define TSRMLS_CC , TSRMLS_C
1999-08-14 09:35:52 +00:00
#ifdef __cplusplus
}
#endif
1999-04-20 23:58:02 +00:00
#else /* non ZTS */
2001-07-28 00:46:42 +00:00
#define TSRMLS_FETCH()
#define TSRMLS_FETCH_FROM_CTX(ctx)
#define TSRMLS_SET_CTX(ctx)
#define TSRMLS_D void
2001-07-28 00:46:42 +00:00
#define TSRMLS_DC
#define TSRMLS_C
#define TSRMLS_CC
#endif /* ZTS */
#endif /* TSRM_H */