]> granicus.if.org Git - php/commitdiff
Misc. win32 thread safety fixes.
authorWez Furlong <wez@php.net>
Thu, 29 Jul 2004 02:59:44 +0000 (02:59 +0000)
committerWez Furlong <wez@php.net>
Thu, 29 Jul 2004 02:59:44 +0000 (02:59 +0000)
ext/standard/basic_functions.c
ext/standard/syslog.c
win32/build/config.w32
win32/globals.c [new file with mode: 0755]
win32/php_win32_globals.h [new file with mode: 0755]
win32/pwd.c
win32/time.c
win32/wsyslog.c

index 6fd7d04915f99ba16ffe4d64107113cc99bb14c5..edb2200a0bf9104bdbee18bea6676b250485ee0b 100644 (file)
 #include "ext/standard/dns.h"
 #include "ext/standard/php_uuencode.h"
 
+#ifdef PHP_WIN32
+#include "win32/php_win32_globals.h"
+#endif
+
 typedef struct yy_buffer_state *YY_BUFFER_STATE;
 
 #include "zend.h"
@@ -1005,8 +1009,14 @@ PHP_MINIT_FUNCTION(basic)
 {
 #ifdef ZTS
        ts_allocate_id(&basic_globals_id, sizeof(php_basic_globals), (ts_allocate_ctor) basic_globals_ctor, (ts_allocate_dtor) basic_globals_dtor);
+#ifdef PHP_WIN32
+       ts_allocate_id(&php_win32_core_globals_id, sizeof(php_win32_core_globals), (ts_allocate_ctor)php_win32_core_globals_ctor, NULL);
+#endif
 #else
        basic_globals_ctor(&basic_globals TSRMLS_CC);
+#ifdef PHP_WIN32
+       php_win32_core_globals_ctor(&php_win32_core_globals TSRMLS_CC);
+#endif
 #endif
 
        REGISTER_LONG_CONSTANT("CONNECTION_ABORTED", PHP_CONNECTION_ABORTED, CONST_CS | CONST_PERSISTENT);
@@ -1105,6 +1115,9 @@ PHP_MSHUTDOWN_FUNCTION(basic)
 {
 #ifdef ZTS
        ts_free_id(basic_globals_id);
+#ifdef PHP_WIN32
+       ts_free_id(php_win32_core_globals_id);
+#endif
 #else
        basic_globals_dtor(&basic_globals TSRMLS_CC);
 #endif
@@ -1214,6 +1227,7 @@ PHP_RSHUTDOWN_FUNCTION(basic)
        PHP_RSHUTDOWN(assert)(SHUTDOWN_FUNC_ARGS_PASSTHRU);
        PHP_RSHUTDOWN(url_scanner_ex)(SHUTDOWN_FUNC_ARGS_PASSTHRU);
        PHP_RSHUTDOWN(streams)(SHUTDOWN_FUNC_ARGS_PASSTHRU);
+       PHP_RSHUTDOWN(win32_core_globals)(SHUTDOWN_FUNC_ARGS_PASSTHRU);
 
        if (BG(user_tick_functions)) {
                zend_llist_destroy(BG(user_tick_functions));
index eeb6849c86151ea2a199f79ba76a244d034135fc..9710ea4d60228526e276e9d90097bad3dbe5d489 100644 (file)
@@ -119,6 +119,9 @@ PHP_RSHUTDOWN_FUNCTION(syslog)
        if (BG(syslog_device)) {
                efree(BG(syslog_device));
        }
+#ifdef PHP_WIN32
+       closelog();
+#endif
        return SUCCESS;
 }
 
index 2dfe853c6f9e0c18928f16b93a632a2f3a3e528f..2fc451aa9ed6798ddd2bb7fa3f00a0a05749e911 100644 (file)
@@ -194,7 +194,7 @@ ADD_SOURCES("main/streams", "streams.c cast.c memory.c filter.c plain_wrapper.c
        userspace.c transports.c xp_socket.c mmap.c");
 
 ADD_SOURCES("win32", "crypt_win32.c flock.c glob.c md5crypt.c pwd.c readdir.c \
-       registry.c select.c sendmail.c time.c wfile.c winutil.c wsyslog.c");
+       registry.c select.c sendmail.c time.c wfile.c winutil.c wsyslog.c globals.c");
 
 ADD_SOURCES("regex", "regcomp.c regerror.c regexec.c regfree.c");
 
diff --git a/win32/globals.c b/win32/globals.c
new file mode 100755 (executable)
index 0000000..6cd15e2
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+   +----------------------------------------------------------------------+
+   | PHP Version 5                                                        |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1997-2004 The PHP Group                                |
+   +----------------------------------------------------------------------+
+   | This source file is subject to version 3.0 of the PHP license,       |
+   | that is bundled with this package in the file LICENSE, and is        |
+   | available through the world-wide-web at the following url:           |
+   | http://www.php.net/license/3_0.txt.                                  |
+   | If you did not receive a copy of the PHP license and are unable to   |
+   | obtain it through the world-wide-web, please send a note to          |
+   | license@php.net so we can mail you a copy immediately.               |
+   +----------------------------------------------------------------------+
+   | Author: Wez Furlong <wez@php.net>                                    |
+   +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+
+#include "php.h"
+#include "php_win32_globals.h"
+
+#ifdef ZTS
+PHPAPI int php_win32_core_globals_id;
+#else
+php_win32_core_globals php_win32_core_globals;
+#endif
+
+void php_win32_core_globals_ctor(void *vg TSRMLS_DC)
+{
+       php_win32_core_globals *wg = (php_win32_core_globals*)vg;
+       memset(wg, 0, sizeof(*wg));
+}
+
+PHP_RSHUTDOWN_FUNCTION(win32_core_globals)
+{
+       php_win32_core_globals *wg =
+#ifdef ZTS
+               ts_resource(php_win32_core_globals_id)
+#else
+               &php_win32_core_globals
+#endif
+               ;
+
+       STR_FREE(wg->login_name);
+       
+       memset(wg, 0, sizeof(*wg));
+}
+
diff --git a/win32/php_win32_globals.h b/win32/php_win32_globals.h
new file mode 100755 (executable)
index 0000000..7153478
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+   +----------------------------------------------------------------------+
+   | PHP Version 5                                                        |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1997-2004 The PHP Group                                |
+   +----------------------------------------------------------------------+
+   | This source file is subject to version 3.0 of the PHP license,       |
+   | that is bundled with this package in the file LICENSE, and is        |
+   | available through the world-wide-web at the following url:           |
+   | http://www.php.net/license/3_0.txt.                                  |
+   | If you did not receive a copy of the PHP license and are unable to   |
+   | obtain it through the world-wide-web, please send a note to          |
+   | license@php.net so we can mail you a copy immediately.               |
+   +----------------------------------------------------------------------+
+   | Author: Wez Furlong <wez@php.net>                                    |
+   +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+
+#ifndef PHP_WIN32_GLOBALS_H
+#define PHP_WIN32_GLOBALS_H
+
+/* misc globals for thread-safety under win32 */
+
+#include "pwd.h"
+
+typedef struct _php_win32_core_globals php_win32_core_globals;
+
+#ifdef ZTS
+# define PW32G(v)              TSRMG(php_win32_core_globals_id, php_win32_core_globals*, v)
+extern PHPAPI int php_win32_core_globals_id;
+#else
+# define PW32G(v)              (php_win32_core_globals.v)
+extern PHPAPI struct _php_win32_core_globals php_win32_core_globals;
+#endif
+
+struct _php_win32_core_globals {
+       /* syslog */
+       char *log_header;
+       HANDLE log_source;
+
+       /* getpwuid */
+       struct passwd pwd;
+
+       /* getlogin */
+       char *login_name;
+
+       /* time */
+       struct timeval starttime;
+       __int64                 lasttime, freq;
+};
+
+void php_win32_core_globals_ctor(void *vg TSRMLS_DC);
+PHP_RSHUTDOWN_FUNCTION(win32_core_globals);
+
+#endif
+
index 2c76480cead6a30e50d6cd156e90cc56e874fb31..311e2c6380b7e7f41d552ec1822836f33cfca533 100644 (file)
 #include <lmapibuf.h>
 #include "pwd.h"
 #include "grp.h"
-
-#ifndef THREAD_SAFE
-static struct passwd pwd;
-#endif
+#include "php_win32_globals.h"
 
 static char *home_dir = ".";
 static char *login_shell = "not command.com!";
@@ -44,21 +41,26 @@ getpwnam(char *name)
 char *
 getlogin()
 {
-       static char name[256];
+       char name[256];
        DWORD max_len = 256;
+       TSRMLS_FETCH();
 
+       STR_FREE(PW32G(login_name));    
        GetUserName(name, &max_len);
-       return name;
+       name[max_len] = '\0';
+       PW32G(login_name) = strdup(name);
+       return PW32G(login_name);
 }
 
 struct passwd *
 getpwuid(int user_id)
 {
-       pwd.pw_name = getlogin();
-       pwd.pw_dir = home_dir;
-       pwd.pw_shell = login_shell;
-       pwd.pw_uid = 0;
+       TSRMLS_FETCH();
+       PW32G(pwd).pw_name = getlogin();
+       PW32G(pwd).pw_dir = home_dir;
+       PW32G(pwd).pw_shell = login_shell;
+       PW32G(pwd).pw_uid = 0;
 
-       return &pwd;
+       return &PW32G(pwd);
 }
 
index 9a3e004a4d5c404bbf654f05d603160834c58eda..693f07418536ed0a6273208d4cddaa49d112d249 100644 (file)
@@ -33,6 +33,7 @@
 #include <winbase.h>
 #include <mmsystem.h>
 #include <errno.h>
+#include "php_win32_globals.h"
 
 int getfilesystemtime(struct timeval *time_Info) 
 {
@@ -51,64 +52,61 @@ __int64 ff;
 
 PHPAPI int gettimeofday(struct timeval *time_Info, struct timezone *timezone_Info)
 {
-
-       static struct timeval starttime = {0, 0};
-       static __int64 lasttime = 0;
-       static __int64 freq = 0;
        __int64 timer;
        LARGE_INTEGER li;
        BOOL b;
        double dt;
+       TSRMLS_FETCH();
 
        /* Get the time, if they want it */
        if (time_Info != NULL) {
-               if (starttime.tv_sec == 0) {
+               if (PW32G(starttime).tv_sec == 0) {
             b = QueryPerformanceFrequency(&li);
             if (!b) {
-                starttime.tv_sec = -1;
+                PW32G(starttime).tv_sec = -1;
             }
             else {
-                freq = li.QuadPart;
+                PW32G(freq) = li.QuadPart;
                 b = QueryPerformanceCounter(&li);
                 if (!b) {
-                    starttime.tv_sec = -1;
+                    PW32G(starttime).tv_sec = -1;
                 }
                 else {
-                    getfilesystemtime(&starttime);
+                    getfilesystemtime(&PW32G(starttime));
                     timer = li.QuadPart;
-                    dt = (double)timer/freq;
-                    starttime.tv_usec -= (int)((dt-(int)dt)*1000000);
-                    if (starttime.tv_usec < 0) {
-                        starttime.tv_usec += 1000000;
-                        --starttime.tv_sec;
+                    dt = (double)timer/PW32G(freq);
+                    PW32G(starttime).tv_usec -= (int)((dt-(int)dt)*1000000);
+                    if (PW32G(starttime).tv_usec < 0) {
+                        PW32G(starttime).tv_usec += 1000000;
+                        --PW32G(starttime).tv_sec;
                     }
-                    starttime.tv_sec -= (int)dt;
+                    PW32G(starttime).tv_sec -= (int)dt;
                 }
             }
         }
-        if (starttime.tv_sec > 0) {
+        if (PW32G(starttime).tv_sec > 0) {
             b = QueryPerformanceCounter(&li);
             if (!b) {
-                starttime.tv_sec = -1;
+                PW32G(starttime).tv_sec = -1;
             }
             else {
                 timer = li.QuadPart;
-                if (timer < lasttime) {
+                if (timer < PW32G(lasttime)) {
                     getfilesystemtime(time_Info);
-                    dt = (double)timer/freq;
-                    starttime = *time_Info;
-                    starttime.tv_usec -= (int)((dt-(int)dt)*1000000);
-                    if (starttime.tv_usec < 0) {
-                        starttime.tv_usec += 1000000;
-                        --starttime.tv_sec;
+                    dt = (double)timer/PW32G(freq);
+                    PW32G(starttime) = *time_Info;
+                    PW32G(starttime).tv_usec -= (int)((dt-(int)dt)*1000000);
+                    if (PW32G(starttime).tv_usec < 0) {
+                        PW32G(starttime).tv_usec += 1000000;
+                        --PW32G(starttime).tv_sec;
                     }
-                    starttime.tv_sec -= (int)dt;
+                    PW32G(starttime).tv_sec -= (int)dt;
                 }
                 else {
-                    lasttime = timer;
-                    dt = (double)timer/freq;
-                    time_Info->tv_sec = starttime.tv_sec + (int)dt;
-                    time_Info->tv_usec = starttime.tv_usec + (int)((dt-(int)dt)*1000000);
+                    PW32G(lasttime) = timer;
+                    dt = (double)timer/PW32G(freq);
+                    time_Info->tv_sec = PW32G(starttime).tv_sec + (int)dt;
+                    time_Info->tv_usec = PW32G(starttime).tv_usec + (int)((dt-(int)dt)*1000000);
                     if (time_Info->tv_usec > 1000000) {
                         time_Info->tv_usec -= 1000000;
                         ++time_Info->tv_sec;
@@ -116,7 +114,7 @@ PHPAPI int gettimeofday(struct timeval *time_Info, struct timezone *timezone_Inf
                 }
             }
         }
-        if (starttime.tv_sec < 0) {
+        if (PW32G(starttime).tv_sec < 0) {
             getfilesystemtime(time_Info);
         }
 
@@ -144,6 +142,7 @@ void usleep(unsigned int useconds)
        CloseHandle(timer);
 }
 
+#if 0 /* looks pretty ropey in here */
 #ifdef HAVE_SETITIMER
 
 
@@ -225,3 +224,5 @@ PHPAPI int setitimer(int which, const struct itimerval *value, struct itimerval
 }
 
 #endif
+#endif
+
index 7db5156011cb59aae81a2766144ef3934aa117ab..ca1e45b9ca4f029fc8e1f1616b124c0b74a8b944 100644 (file)
 #include <fcntl.h>
 #include <process.h>
 
-#ifndef THREAD_SAFE
-static char *loghdr;                   /* log file header string */
-static HANDLE loghdl = NULL;   /* handle of event source */
-#endif
+#include "php_win32_globals.h"
 
 void closelog(void)
 {
-       DeregisterEventSource(loghdl);
-       efree(loghdr);
+       TSRMLS_FETCH();
+       DeregisterEventSource(PW32G(log_source));
+       STR_FREE(PW32G(log_header));
+       PW32G(log_header) = NULL;
 }
 
 /* Emulator for BSD syslog() routine
@@ -77,12 +76,14 @@ void syslog(int priority, const char *message, ...)
 {
        va_list args;
        LPTSTR strs[2];
-       char tmp[1024];                         /* callers must be careful not to pop this */
        unsigned short etype;
-       
+       char *tmp = NULL;
+       TSRMLS_FETCH();
+
        /* default event source */
-               if (!loghdl)
-               openlog("c-client", LOG_PID, LOG_MAIL);
+       if (!PW32G(log_source))
+               openlog("php", LOG_PID, LOG_SYSLOG);
+
        switch (priority) {                     /* translate UNIX type into NT type */
                case LOG_ALERT:
                        etype = EVENTLOG_ERROR_TYPE;
@@ -94,12 +95,13 @@ void syslog(int priority, const char *message, ...)
                        etype = EVENTLOG_WARNING_TYPE;
        }
        va_start(args, message);        /* initialize vararg mechanism */
-       vsprintf(tmp, message, args);   /* build message */
-       strs[0] = loghdr;       /* write header */
+       vspprintf(&tmp, 0, message, args);      /* build message */
+       strs[0] = PW32G(log_header);    /* write header */
        strs[1] = tmp;                          /* then the message */
        /* report the event */
-       ReportEvent(loghdl, etype, (unsigned short) priority, 2000, NULL, 2, 0, strs, NULL);
+       ReportEvent(PW32G(log_source), etype, (unsigned short) priority, 2000, NULL, 2, 0, strs, NULL);
        va_end(args);
+       efree(tmp);
 }
 
 
@@ -111,12 +113,14 @@ void syslog(int priority, const char *message, ...)
 
 void openlog(const char *ident, int logopt, int facility)
 {
-       char tmp[1024];
+       TSRMLS_FETCH();
 
-       if (loghdl) {
+       if (PW32G(log_source)) {
                closelog();
        }
-       loghdl = RegisterEventSource(NULL, ident);
-       sprintf(tmp, (logopt & LOG_PID) ? "%s[%d]" : "%s", ident, getpid());
-       loghdr = estrdup(tmp);  /* save header for later */
+
+       STR_FREE(PW32G(log_header));
+
+       PW32G(log_source) = RegisterEventSource(NULL, ident);
+       spprintf(&PW32G(log_header), 0, (logopt & LOG_PID) ? "%s[%d]" : "%s", ident, getpid());
 }