From 94c36e88469c10c696d80afedab63c18d83e56b8 Mon Sep 17 00:00:00 2001 From: Sascha Schumann Date: Wed, 1 Dec 1999 17:07:25 +0000 Subject: [PATCH] Make fsock module thread-safe --- ext/standard/fsock.c | 78 ++++++++++++++++++++++++++++---------------- ext/standard/fsock.h | 23 +++++++++++++ main/main.c | 10 +----- 3 files changed, 73 insertions(+), 38 deletions(-) diff --git a/ext/standard/fsock.c b/ext/standard/fsock.c index 76737de34c..4840324174 100644 --- a/ext/standard/fsock.c +++ b/ext/standard/fsock.c @@ -14,6 +14,7 @@ +----------------------------------------------------------------------+ | Authors: Paul Panotzki - Bunyip Information Systems | | Jim Winstead (jimw@php.net) | + | Sascha Schumann | +----------------------------------------------------------------------+ */ @@ -68,7 +69,10 @@ #include "url.h" #include "fsock.h" -#ifndef ZTS +#ifdef ZTS +static int fsock_globals_id; +#else +static php_fsock_globals fsock_globals; extern int le_fp; #endif @@ -105,8 +109,6 @@ struct php3i_sockbuf { size_t chunk_size; }; -static struct php3i_sockbuf *phpsockbuf; - typedef struct php3i_sockbuf php3i_sockbuf; php3_module_entry fsock_module_entry = { @@ -387,17 +389,15 @@ PHP_FUNCTION(pfsockopen) if(sock->readbuf) pefree(sock->readbuf, sock->persistent); \ if(sock->prev) sock->prev->next = sock->next; \ if(sock->next) sock->next->prev = sock->prev; \ - if(sock == phpsockbuf) \ - phpsockbuf = sock->next; \ + if(sock == FG(phpsockbuf)) \ + FG(phpsockbuf) = sock->next; \ pefree(sock, sock->persistent) -static size_t def_chunk_size = CHUNK_SIZE; - -static void php_cleanup_sockbuf(int persistent) +static void php_cleanup_sockbuf(int persistent FLS_DC) { php3i_sockbuf *now, *next; - for(now = phpsockbuf; now; now = next) { + for(now = FG(phpsockbuf); now; now = next) { next = now->next; if(now->persistent == persistent) { SOCK_DESTROY(now); @@ -410,14 +410,15 @@ static void php_cleanup_sockbuf(int persistent) #define WRITEPTR(sock) ((sock)->readbuf + (sock)->writepos) #define SOCK_FIND(sock,socket) \ php3i_sockbuf *sock; \ - sock = _php3_sock_find(socket); \ - if(!sock) sock = _php3_sock_create(socket) + FLS_FETCH(); \ + sock = _php3_sock_find(socket FLS_CC); \ + if(!sock) sock = _php3_sock_create(socket FLS_CC) -static php3i_sockbuf *_php3_sock_find(int socket) +static php3i_sockbuf *_php3_sock_find(int socket FLS_DC) { php3i_sockbuf *buf = NULL, *tmp; - for(tmp = phpsockbuf; tmp; tmp = tmp->next) + for(tmp = FG(phpsockbuf); tmp; tmp = tmp->next) if(tmp->socket == socket) { buf = tmp; break; @@ -426,19 +427,19 @@ static php3i_sockbuf *_php3_sock_find(int socket) return buf; } -static php3i_sockbuf *_php3_sock_create(int socket) +static php3i_sockbuf *_php3_sock_create(int socket FLS_DC) { php3i_sockbuf *sock; int persistent = _php3_is_persistent_sock(socket); sock = pecalloc(sizeof(*sock), 1, persistent); sock->socket = socket; - if((sock->next = phpsockbuf)) - phpsockbuf->prev = sock; + if((sock->next = FG(phpsockbuf))) + FG(phpsockbuf)->prev = sock; sock->persistent = persistent; sock->is_blocked = 1; - sock->chunk_size = def_chunk_size; - phpsockbuf = sock; + sock->chunk_size = FG(def_chunk_size); + FG(phpsockbuf) = sock; return sock; } @@ -446,11 +447,12 @@ static php3i_sockbuf *_php3_sock_create(int socket) size_t _php3_sock_set_def_chunk_size(size_t size) { size_t old; + FLS_FETCH(); - old = def_chunk_size; + old = FG(def_chunk_size); if(size <= CHUNK_SIZE || size > 0) - def_chunk_size = size; + FG(def_chunk_size) = size; return old; } @@ -459,8 +461,9 @@ int _php3_sock_destroy(int socket) { int ret = 0; php3i_sockbuf *sock; + FLS_FETCH(); - sock = _php3_sock_find(socket); + sock = _php3_sock_find(socket FLS_CC); if(sock) { ret = 1; SOCK_DESTROY(sock); @@ -485,8 +488,9 @@ int _php3_sock_close(int socket) { int ret = 0; php3i_sockbuf *sock; + FLS_FETCH(); - sock = _php3_sock_find(socket); + sock = _php3_sock_find(socket FLS_CC); if(sock) { if(!sock->persistent) { SOCK_CLOSE(sock->socket); @@ -709,11 +713,27 @@ int php_msock_destroy(int *data) /* }}} */ /* {{{ php3_minit_fsock */ +static void fsock_globals_ctor(FLS_D) +{ + zend_hash_init(&FG(ht_fsock_keys), 0, NULL, NULL, 1); + zend_hash_init(&FG(ht_fsock_socks), 0, NULL, (int (*)(void *))php_msock_destroy, 1); + FG(def_chunk_size) = CHUNK_SIZE; + FG(phpsockbuf) = NULL; +} + +static void fsock_globals_dtor(FLS_D) +{ + zend_hash_destroy(&FG(ht_fsock_socks)); + zend_hash_destroy(&FG(ht_fsock_keys)); + php_cleanup_sockbuf(1 FLS_CC); +} + PHP_MINIT_FUNCTION(fsock) { -#ifndef ZTS - zend_hash_init(&PG(ht_fsock_keys), 0, NULL, NULL, 1); - zend_hash_init(&PG(ht_fsock_socks), 0, NULL, (int (*)(void *))php_msock_destroy, 1); +#ifdef ZTS + fsock_globals_id = ts_allocate_id(sizeof(php_fsock_globals), fsock_globals_ctor, fsock_globals_dtor); +#else + fsock_globals_ctor(FLS_C); #endif return SUCCESS; } @@ -723,10 +743,8 @@ PHP_MINIT_FUNCTION(fsock) PHP_MSHUTDOWN_FUNCTION(fsock) { #ifndef ZTS - zend_hash_destroy(&PG(ht_fsock_socks)); - zend_hash_destroy(&PG(ht_fsock_keys)); + fsock_globals_dtor(FLS_C); #endif - php_cleanup_sockbuf(1); return SUCCESS; } /* }}} */ @@ -734,7 +752,9 @@ PHP_MSHUTDOWN_FUNCTION(fsock) PHP_RSHUTDOWN_FUNCTION(fsock) { - php_cleanup_sockbuf(0); + FLS_FETCH(); + + php_cleanup_sockbuf(0 FLS_CC); return SUCCESS; } diff --git a/ext/standard/fsock.h b/ext/standard/fsock.h index aaa8be6a21..9189586ac0 100644 --- a/ext/standard/fsock.h +++ b/ext/standard/fsock.h @@ -77,4 +77,27 @@ PHP_MINIT_FUNCTION(fsock); PHP_MSHUTDOWN_FUNCTION(fsock); PHP_RSHUTDOWN_FUNCTION(fsock); +typedef struct { + HashTable ht_fsock_keys; + HashTable ht_fsock_socks; + struct php3i_sockbuf *phpsockbuf; + size_t def_chunk_size; +} php_fsock_globals; + +#ifdef ZTS +#define FLS_D php_fsock_globals *fsock_globals +#define FLS_DC , FLS_D +#define FLS_C fsock_globals +#define FLS_CC , FLS_C +#define FG(v) (fsock_globals->v) +#define FLS_FETCH() php_fsock_globals *fsock_globals = ts_resource(fsock_globals_id) +#else +#define FLS_D +#define FLS_DC +#define FLS_C +#define FLS_CC +#define FG(v) (fsock_globals.v) +#define FLS_FETCH() +#endif + #endif /* _FSOCK_H */ diff --git a/main/main.c b/main/main.c index 27c12fc795..fb4ea759d6 100644 --- a/main/main.c +++ b/main/main.c @@ -850,16 +850,8 @@ static void php_new_thread_end_handler(THREAD_T thread_id) static void core_globals_ctor(php_core_globals *core_globals) { memset(core_globals,0,sizeof(*core_globals)); - zend_hash_init(&core_globals->ht_fsock_keys, 0, NULL, NULL, 1); - zend_hash_init(&core_globals->ht_fsock_socks, 0, NULL, (int (*)(void *))php_msock_destroy, 1); } - -static void core_globals_dtor(php_core_globals *core_globals) -{ - zend_hash_destroy(&core_globals->ht_fsock_keys); - zend_hash_destroy(&core_globals->ht_fsock_socks); -} #endif @@ -904,7 +896,7 @@ int php_module_startup(sapi_module_struct *sf) #ifdef ZTS tsrm_set_new_thread_end_handler(php_new_thread_end_handler); executor_globals = ts_resource(executor_globals_id); - core_globals_id = ts_allocate_id(sizeof(php_core_globals), core_globals_ctor, core_globals_dtor); + core_globals_id = ts_allocate_id(sizeof(php_core_globals), core_globals_ctor, NULL); core_globals = ts_resource(core_globals_id); #endif EG(error_reporting) = E_ALL & ~E_NOTICE; -- 2.40.0