1
2
3
4
5
6
7
8
9
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 #include "main/php_stdint.h"
24
25 #ifdef TSRM_WIN32
26 # ifdef TSRM_EXPORTS
27 # define TSRM_API __declspec(dllexport)
28 # else
29 # define TSRM_API __declspec(dllimport)
30 # endif
31 #elif defined(__GNUC__) && __GNUC__ >= 4
32 # define TSRM_API __attribute__ ((visibility("default")))
33 #else
34 # define TSRM_API
35 #endif
36
37 typedef intptr_t tsrm_intptr_t;
38 typedef uintptr_t tsrm_uintptr_t;
39
40
41 #ifdef ZTS
42
43 #ifdef TSRM_WIN32
44 # ifndef TSRM_INCLUDE_FULL_WINDOWS_HEADERS
45 # define WIN32_LEAN_AND_MEAN
46 # endif
47 # include <windows.h>
48 # include <shellapi.h>
49 #elif defined(GNUPTH)
50 # include <pth.h>
51 #elif defined(PTHREADS)
52 # include <pthread.h>
53 #elif defined(TSRM_ST)
54 # include <st.h>
55 #elif defined(BETHREADS)
56 #include <kernel/OS.h>
57 #include <TLS.h>
58 #endif
59
60 typedef int ts_rsrc_id;
61
62
63 #ifdef TSRM_WIN32
64 # define THREAD_T DWORD
65 # define MUTEX_T CRITICAL_SECTION *
66 #elif defined(GNUPTH)
67 # define THREAD_T pth_t
68 # define MUTEX_T pth_mutex_t *
69 #elif defined(PTHREADS)
70 # define THREAD_T pthread_t
71 # define MUTEX_T pthread_mutex_t *
72 #elif defined(NSAPI)
73 # define THREAD_T SYS_THREAD
74 # define MUTEX_T CRITICAL
75 #elif defined(PI3WEB)
76 # define THREAD_T PIThread *
77 # define MUTEX_T PISync *
78 #elif defined(TSRM_ST)
79 # define THREAD_T st_thread_t
80 # define MUTEX_T st_mutex_t
81 #elif defined(BETHREADS)
82 # define THREAD_T thread_id
83 typedef struct {
84 sem_id sem;
85 int32 ben;
86 } beos_ben;
87 # define MUTEX_T beos_ben *
88 #endif
89
90 #ifdef HAVE_SIGNAL_H
91 #include <signal.h>
92 #endif
93
94 typedef void (*ts_allocate_ctor)(void *);
95 typedef void (*ts_allocate_dtor)(void *);
96
97 #define THREAD_HASH_OF(thr,ts) (unsigned long)thr%(unsigned long)ts
98
99 #ifdef __cplusplus
100 extern "C" {
101 #endif
102
103
104 TSRM_API int tsrm_startup(int expected_threads, int expected_resources, int debug_level, char *debug_filename);
105 TSRM_API void tsrm_shutdown(void);
106
107
108 TSRM_API ts_rsrc_id ts_allocate_id(ts_rsrc_id *rsrc_id, size_t size, ts_allocate_ctor ctor, ts_allocate_dtor dtor);
109
110
111 TSRM_API void *ts_resource_ex(ts_rsrc_id id, THREAD_T *th_id);
112 #define ts_resource(id) ts_resource_ex(id, NULL)
113
114
115 TSRM_API void ts_free_thread(void);
116
117
118 void ts_free_worker_threads(void);
119
120
121 TSRM_API void ts_free_id(ts_rsrc_id id);
122
123
124
125 #define TSRM_ERROR_LEVEL_ERROR 1
126 #define TSRM_ERROR_LEVEL_CORE 2
127 #define TSRM_ERROR_LEVEL_INFO 3
128
129 typedef void (*tsrm_thread_begin_func_t)(THREAD_T thread_id);
130 typedef void (*tsrm_thread_end_func_t)(THREAD_T thread_id);
131
132
133 TSRM_API int tsrm_error(int level, const char *format, ...);
134 TSRM_API void tsrm_error_set(int level, char *debug_filename);
135
136
137 TSRM_API THREAD_T tsrm_thread_id(void);
138 TSRM_API MUTEX_T tsrm_mutex_alloc(void);
139 TSRM_API void tsrm_mutex_free(MUTEX_T mutexp);
140 TSRM_API int tsrm_mutex_lock(MUTEX_T mutexp);
141 TSRM_API int tsrm_mutex_unlock(MUTEX_T mutexp);
142 #ifdef HAVE_SIGPROCMASK
143 TSRM_API int tsrm_sigmask(int how, const sigset_t *set, sigset_t *oldset);
144 #endif
145
146 TSRM_API void *tsrm_set_new_thread_begin_handler(tsrm_thread_begin_func_t new_thread_begin_handler);
147 TSRM_API void *tsrm_set_new_thread_end_handler(tsrm_thread_end_func_t new_thread_end_handler);
148
149
150
151 TSRM_API void *tsrm_new_interpreter_context(void);
152 TSRM_API void *tsrm_set_interpreter_context(void *new_ctx);
153 TSRM_API void tsrm_free_interpreter_context(void *context);
154
155 TSRM_API void *tsrm_get_ls_cache(void);
156
157 #ifdef TSRM_WIN32
158 # define TSRM_TLS __declspec(thread)
159 #else
160 # define TSRM_TLS __thread
161 #endif
162
163 #define TSRM_SHUFFLE_RSRC_ID(rsrc_id) ((rsrc_id)+1)
164 #define TSRM_UNSHUFFLE_RSRC_ID(rsrc_id) ((rsrc_id)-1)
165
166 #define TSRMLS_FETCH_FROM_CTX(ctx) void ***tsrm_ls = (void ***) ctx
167 #define TSRMLS_SET_CTX(ctx) ctx = (void ***) tsrm_get_ls_cache()
168 #define TSRMG(id, type, element) (TSRMG_BULK(id, type)->element)
169 #define TSRMG_BULK(id, type) ((type) (*((void ***) tsrm_get_ls_cache()))[TSRM_UNSHUFFLE_RSRC_ID(id)])
170
171 #define TSRMG_STATIC(id, type, element) (TSRMG_BULK_STATIC(id, type)->element)
172 #define TSRMG_BULK_STATIC(id, type) ((type) (*((void ***) TSRMLS_CACHE))[TSRM_UNSHUFFLE_RSRC_ID(id)])
173 #define TSRMLS_CACHE_EXTERN() extern TSRM_TLS void *TSRMLS_CACHE;
174 #define TSRMLS_CACHE_DEFINE() TSRM_TLS void *TSRMLS_CACHE = NULL;
175 #if ZEND_DEBUG
176 #define TSRMLS_CACHE_UPDATE() TSRMLS_CACHE = tsrm_get_ls_cache()
177 #else
178 #define TSRMLS_CACHE_UPDATE() if (!TSRMLS_CACHE) TSRMLS_CACHE = tsrm_get_ls_cache()
179 #endif
180 #define TSRMLS_CACHE _tsrm_ls_cache
181
182
183 #define TSRMLS_D void
184 #define TSRMLS_DC
185 #define TSRMLS_C
186 #define TSRMLS_CC
187 #define TSRMLS_FETCH()
188
189 #ifdef __cplusplus
190 }
191 #endif
192
193 #else
194
195 #define TSRMLS_FETCH()
196 #define TSRMLS_FETCH_FROM_CTX(ctx)
197 #define TSRMLS_SET_CTX(ctx)
198
199 #define TSRMG_STATIC(id, type, element)
200 #define TSRMLS_CACHE_EXTERN()
201 #define TSRMLS_CACHE_DEFINE()
202 #define TSRMLS_CACHE_UPDATE()
203 #define TSRMLS_CACHE
204
205 #define TSRM_TLS
206
207
208 #define TSRMLS_D void
209 #define TSRMLS_DC
210 #define TSRMLS_C
211 #define TSRMLS_CC
212
213 #endif
214
215 #endif