]> granicus.if.org Git - php/commitdiff
introduced DllMain for the main php DLL
authorAnatol Belski <ab@php.net>
Mon, 1 Jun 2015 19:52:35 +0000 (21:52 +0200)
committerAnatol Belski <ab@php.net>
Tue, 2 Jun 2015 13:56:32 +0000 (15:56 +0200)
The particular need on this is because of the current situation
with determining the background functionality for the
gettimeofday. DllMain allows to initialize stuff before the DLL
can be actually used. Thus, we use different time API on win7
and win8 and later, so the function pointer needs to be
initialized before anything in the DLL could even demand it.

The change also opens the door for the further optimizations,
as now we're able to do the very basic initializations for the
whole DLL before it could ever start to live. Fe on this way the
TLS initialization could be done, when utilizing the
DLL_THREAD_ATTACH/DETACH case. Whether it's really usable in
portable way should be synced with other platforms.

Be aware that it's dangerous as it possibly causes dead locks.
So to use with care. One willing to add items to DllMain should
better read the documentation twice and even then try to defer
the necessary action.

ext/libxml/libxml.c
win32/build/config.w32
win32/dllmain.c [new file with mode: 0644]
win32/time.c
win32/time.h

index b96d25aa806d93b85a8e446405b8d13a21692ea8..c54fd91d015aa32c74c2309a26d67122a8336d5c 100644 (file)
@@ -1341,7 +1341,7 @@ PHP_LIBXML_API void php_libxml_node_decrement_resource(php_libxml_node_object *o
 }
 /* }}} */
 
-#ifdef PHP_WIN32
+#if defined(PHP_WIN32) && defined(COMPILE_DL_LIBXML)
 PHP_LIBXML_API BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
 {
        return xmlDllMain(hinstDLL, fdwReason, lpvReserved);
index 70aef37799071a44aa0bd4b24bdfd0b3694ec5e6..b7e5e492209a2f6b735377144a573b7c3bb8531d 100644 (file)
@@ -159,7 +159,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 glob_wrapper.c");
 ADD_FLAG("CFLAGS_BD_MAIN_STREAMS", "/D ZEND_ENABLE_STATIC_TSRMLS_CACHE=1");
 
-ADD_SOURCES("win32", "glob.c readdir.c \
+ADD_SOURCES("win32", "dllmain.c glob.c readdir.c \
        registry.c select.c sendmail.c time.c winutil.c wsyslog.c globals.c getrusage.c");
 
 ADD_FLAG("CFLAGS_BD_WIN32", "/D ZEND_ENABLE_STATIC_TSRMLS_CACHE=1");
diff --git a/win32/dllmain.c b/win32/dllmain.c
new file mode 100644 (file)
index 0000000..9e7bcc1
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+   +----------------------------------------------------------------------+
+   | PHP Version 7                                                        |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1997-2015 The PHP Group                                |
+   +----------------------------------------------------------------------+
+   | This source file is subject to version 3.01 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_01.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.               |
+   +----------------------------------------------------------------------+
+   | Authors: Anatol Belski <ab@php.net>                                  |
+   +----------------------------------------------------------------------+
+ */
+
+#include <config.w32.h>
+
+#include <win32/time.h>
+#include <php.h>
+
+#ifdef HAVE_LIBXML
+#include <libxml/threads.h>
+#endif
+
+/* TODO this file, or part of it, could be machine generated, to
+       allow extensions and SAPIs adding their own init stuff.
+       However expected is that MINIT is enough in most cases.
+       This file is only useful for some really internal stuff,
+       eq. initializing something before the DLL even is
+       available to be called. */
+
+BOOL WINAPI DllMain(HINSTANCE inst, DWORD reason, LPVOID dummy)
+{
+       BOOL ret = TRUE;
+
+       switch (reason)
+       {
+               case DLL_PROCESS_ATTACH:
+                       ret = ret && php_win32_init_gettimeofday();
+                       break;
+#if 0 /* prepared */
+               case DLL_PROCESS_DETACH:
+                       /* pass */
+                       break;
+
+               case DLL_THREAD_ATTACH:
+                       /* pass */
+                       break;
+
+               case DLL_THREAD_DETACH:
+                       /* pass */
+                       break;
+#endif
+       }
+
+#ifdef HAVE_LIBXML
+       /* This imply that only LIBXML_STATIC_FOR_DLL is supported ATM. 
+               If that changes, this place will need some rework. 
+          TODO Also this should be revisited as no initialization
+               might be needed for TS build (libxml build with TLS
+               support. */
+       ret = ret && xmlDllMain(inst, reason, dummy);
+#endif
+
+       return ret;
+}
+
index f2487af9fc842b88c98011ee94571aa3728c41e1..dfcc46a59b6e26f29c54df00b8776ab7e23e3d9d 100644 (file)
@@ -29,10 +29,11 @@ typedef VOID (WINAPI *MyGetSystemTimeAsFileTime)(LPFILETIME lpSystemTimeAsFileTi
 
 static MyGetSystemTimeAsFileTime timefunc = NULL;
 
+#ifdef PHP_EXPORTS
 static zend_always_inline MyGetSystemTimeAsFileTime get_time_func(void)
 {
        MyGetSystemTimeAsFileTime timefunc = NULL;
-       HMODULE hMod = LoadLibrary("kernel32.dll");
+       HMODULE hMod = GetModuleHandle("kernel32.dll");
 
        if (hMod) {
                /* Max possible resolution <1us, win8/server2012 */
@@ -47,15 +48,20 @@ static zend_always_inline MyGetSystemTimeAsFileTime get_time_func(void)
        return timefunc;
 }
 
+BOOL php_win32_init_gettimeofday(void)
+{
+       timefunc = get_time_func();
+
+       return (NULL != timefunc);
+}
+#endif
+
 static zend_always_inline int getfilesystemtime(struct timeval *tv)
 {
        FILETIME ft;
        unsigned __int64 ff = 0;
        ULARGE_INTEGER fft;
 
-       if (!timefunc) {
-               timefunc = get_time_func();
-       }
        timefunc(&ft);
 
         /*
index 8f39c0481c2d1e4aa2b85741d1cbfe878a1d95f6..b46c1675ca5642a295f7167af74ba4dce83ec1ce 100644 (file)
@@ -52,4 +52,10 @@ PHPAPI int nanosleep( const struct timespec * rqtp, struct timespec * rmtp );
 
 PHPAPI int usleep(unsigned int useconds);
 
+#ifdef PHP_EXPORTS
+/* This symbols are needed only for the DllMain, but should not be exported 
+       or be available when used with PHP binaries. */
+BOOL php_win32_init_gettimeofday(void);
+#endif
+
 #endif