diff options
author | Wez Furlong <wez@php.net> | 2005-04-28 02:55:14 +0000 |
---|---|---|
committer | Wez Furlong <wez@php.net> | 2005-04-28 02:55:14 +0000 |
commit | 4625889764d06774e05101595e6db3cb0cefa700 (patch) | |
tree | 6a6d92314488b1a7c7ee5b60992119a9f651e2ba /TSRM/TSRM.c | |
parent | 099a7eb6b8d48e4cadc716c322716e69c0db36d9 (diff) | |
download | php-git-4625889764d06774e05101595e6db3cb0cefa700.tar.gz |
consolidate the various tls get/set calls for the different platforms into
a single macro, at Andi's request.
Diffstat (limited to 'TSRM/TSRM.c')
-rw-r--r-- | TSRM/TSRM.c | 81 |
1 files changed, 23 insertions, 58 deletions
diff --git a/TSRM/TSRM.c b/TSRM/TSRM.c index 786e4081e2..5c1482d1b8 100644 --- a/TSRM/TSRM.c +++ b/TSRM/TSRM.c @@ -92,12 +92,28 @@ static FILE *tsrm_error_file; #if defined(PTHREADS) /* Thread local storage */ static pthread_key_t tls_key; +# define tsrm_tls_set(what) pthread_setspecific(tls_key, (void*)(what)) +# define tsrm_tls_get() pthread_getspecific(tls_key) + #elif defined(TSRM_ST) static int tls_key; +# define tsrm_tls_set(what) st_thread_setspecific(tls_key, (void*)(what)) +# define tsrm_tls_get() st_thread_getspecific(tls_key) + #elif defined(TSRM_WIN32) static DWORD tls_key; +# define tsrm_tls_set(what) TlsSetValue(tls_key, (void*)(what)) +# define tsrm_tls_get() TlsGetValue(tls_key) + #elif defined(BETHREADS) static int32 tls_key; +# define tsrm_tls_set(what) tls_set(tls_key, (void*)(what) +# define tsrm_tls_get() (tsrm_tls_entry*)tls_get(tls_key) + +#else +# define tsrm_tls_set(what) +# define tsrm_tls_get() NULL +# warning tsrm_set_interpreter_context is probably broken on this platform #endif /* Startup TSRM (call once for the entire process) */ @@ -262,16 +278,8 @@ static void allocate_new_resource(tsrm_tls_entry **thread_resources_ptr, THREAD_ (*thread_resources_ptr)->thread_id = thread_id; (*thread_resources_ptr)->next = NULL; -#if defined(PTHREADS) /* Set thread local storage to this new thread resources structure */ - pthread_setspecific(tls_key, (void *) *thread_resources_ptr); -#elif defined(TSRM_ST) - st_thread_setspecific(tls_key, (void *) *thread_resources_ptr); -#elif defined(TSRM_WIN32) - TlsSetValue(tls_key, (void *) *thread_resources_ptr); -#elif defined(BETHREADS) - tls_set(tls_key, (void*) *thread_resources_ptr); -#endif + tsrm_tls_set(*thread_resources_ptr); if (tsrm_new_thread_begin_handler) { tsrm_new_thread_begin_handler(thread_id, &((*thread_resources_ptr)->storage)); @@ -313,22 +321,13 @@ TSRM_API void *ts_resource_ex(ts_rsrc_id id, THREAD_T *th_id) if(tsrm_tls_table) { #endif if (!th_id) { -#if defined(PTHREADS) /* Fast path for looking up the resources for the current * thread. Its used by just about every call to * ts_resource_ex(). This avoids the need for a mutex lock * and our hashtable lookup. */ - thread_resources = pthread_getspecific(tls_key); -#elif defined(TSRM_ST) - thread_resources = st_thread_getspecific(tls_key); -#elif defined(TSRM_WIN32) - thread_resources = TlsGetValue(tls_key); -#elif defined(BETHREADS) - thread_resources = (tsrm_tls_entry*)tls_get(tls_key); -#else - thread_resources = NULL; -#endif + thread_resources = tsrm_tls_get(); + if (thread_resources) { TSRM_ERROR((TSRM_ERROR_LEVEL_INFO, "Fetching resource id %d for current thread %d", id, (long) thread_resources->thread_id)); /* Read a specific resource from the thread's resources. @@ -407,32 +406,13 @@ void *tsrm_set_interpreter_context(void *new_ctx) { tsrm_tls_entry *current; -#if defined(PTHREADS) - current = pthread_getspecific(tls_key); -#elif defined(TSRM_ST) - current = st_thread_getspecific(tls_key); -#elif defined(TSRM_WIN32) - current = TlsGetValue(tls_key); -#elif defined(BETHREADS) - current = (tsrm_tls_entry*)tls_get(tls_key); -#else -#warning tsrm_set_interpreter_context is probably broken on this platform - current = NULL; -#endif + current = tsrm_tls_get(); /* TODO: unlink current from the global linked list, and replace it * it with the new context, protected by mutex where/if appropriate */ /* Set thread local storage to this new thread resources structure */ -#if defined(PTHREADS) - pthread_setspecific(tls_key, new_ctx); -#elif defined(TSRM_ST) - st_thread_setspecific(tls_key, new_ctx); -#elif defined(TSRM_WIN32) - TlsSetValue(tls_key, new_ctx); -#elif defined(BETHREADS) - tls_set(tls_key, new_ctx); -#endif + tsrm_tls_set(new_ctx); /* return old context, so caller can restore it when they're done */ return current; @@ -448,18 +428,7 @@ void *tsrm_new_interpreter_context(void) thread_id = tsrm_thread_id(); tsrm_mutex_lock(tsmm_mutex); -#if defined(PTHREADS) - current = pthread_getspecific(tls_key); -#elif defined(TSRM_ST) - current = st_thread_getspecific(tls_key); -#elif defined(TSRM_WIN32) - current = TlsGetValue(tls_key); -#elif defined(BETHREADS) - current = (tsrm_tls_entry*)tls_get(tls_key); -#else -#warning tsrm_new_interpreter_context is probably broken on this platform - current = NULL; -#endif + current = tsrm_tls_get(); new_ctx = malloc(sizeof(*new_ctx)); allocate_new_resource(&new_ctx, thread_id); @@ -499,11 +468,7 @@ void ts_free_thread(void) } else { tsrm_tls_table[hash_value] = thread_resources->next; } -#if defined(PTHREADS) - pthread_setspecific(tls_key, 0); -#elif defined(TSRM_WIN32) - TlsSetValue(tls_key, 0); -#endif + tsrm_tls_set(0); free(thread_resources); break; } |