cvs: /php4 main.c /php4/ext/standard fsock.c fsock.h
| From: | Sascha Schumann | Date: | Wed, 01 Dec 1999 17:07:56 +0000 |
| Subject: | cvs: /php4 main.c /php4/ext/standard fsock.c fsock.h | ||
| Groups: | php.version4 | ||
| Request: | Send a blank email to php-version4+get-7185@lists.php.net to get a copy of this message | ||
sas Wed Dec 1 12:07:56 1999 EDT
Modified files:
/php4 main.c
/php4/ext/standard fsock.c fsock.h
Log:
Make fsock module thread-safe
Index: php4/main.c
diff -u php4/main.c:1.141 php4/main.c:1.142
--- php4/main.c:1.141 Tue Nov 30 15:18:06 1999
+++ php4/main.c Wed Dec 1 12:07:24 1999
@@ -19,7 +19,7 @@
*/
-/* $Id: main.c,v 1.141 1999/11/30 20:18:06 andi Exp $ */
+/* $Id: main.c,v 1.142 1999/12/01 17:07:24 sas Exp $ */
#include <stdio.h>
@@ -850,16 +850,8 @@
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 @@
#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;
Index: php4/ext/standard/fsock.c
diff -u php4/ext/standard/fsock.c:1.26 php4/ext/standard/fsock.c:1.27
--- php4/ext/standard/fsock.c:1.26 Sun Oct 24 14:16:16 1999
+++ php4/ext/standard/fsock.c Wed Dec 1 12:07:25 1999
@@ -14,10 +14,11 @@
+----------------------------------------------------------------------+
| Authors: Paul Panotzki - Bunyip Information Systems |
| Jim Winstead (jimw@php.net) |
+ | Sascha Schumann <sascha@schumann.cx> |
+----------------------------------------------------------------------+
*/
-/* $Id: fsock.c,v 1.26 1999/10/24 18:16:16 thies Exp $ */
+/* $Id: fsock.c,v 1.27 1999/12/01 17:07:25 sas Exp $ */
/* Synced with php3 revision 1.121 1999-06-18 [ssb] */
/* Synced with php3 revision 1.133 1999-07-21 [sas] */
@@ -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 @@
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 @@
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 @@
#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 @@
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 @@
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 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 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 @@
/* }}} */
/* {{{ 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_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_RSHUTDOWN_FUNCTION(fsock)
{
- php_cleanup_sockbuf(0);
+ FLS_FETCH();
+
+ php_cleanup_sockbuf(0 FLS_CC);
return SUCCESS;
}
Index: php4/ext/standard/fsock.h
diff -u php4/ext/standard/fsock.h:1.13 php4/ext/standard/fsock.h:1.14
--- php4/ext/standard/fsock.h:1.13 Wed Aug 25 12:24:14 1999
+++ php4/ext/standard/fsock.h Wed Dec 1 12:07:25 1999
@@ -27,7 +27,7 @@
| Jim Winstead (jimw@php.net) |
+----------------------------------------------------------------------+
*/
-/* $Id: fsock.h,v 1.13 1999/08/25 16:24:14 andi Exp $ */
+/* $Id: fsock.h,v 1.14 1999/12/01 17:07:25 sas Exp $ */
/* Synced with php3 revision 1.24 1999-06-18 [ssb] */
@@ -76,5 +76,28 @@
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 */