diff options
Diffstat (limited to 'tls.c')
-rw-r--r-- | tls.c | 113 |
1 files changed, 113 insertions, 0 deletions
@@ -0,0 +1,113 @@ +/* + +----------------------------------------------------------------------+ + | PHP HTML Embedded Scripting Language Version 3.0 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997,1998 PHP Development Team (See Credits file) | + +----------------------------------------------------------------------+ + | This program is free software; you can redistribute it and/or modify | + | it under the terms of one of the following licenses: | + | | + | A) the GNU General Public License as published by the Free Software | + | Foundation; either version 2 of the License, or (at your option) | + | any later version. | + | | + | B) the PHP License as published by the PHP Development Team and | + | included in the distribution in the file: LICENSE | + | | + | This program is distributed in the hope that it will be useful, | + | but WITHOUT ANY WARRANTY; without even the implied warranty of | + | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | + | GNU General Public License for more details. | + | | + | You should have received a copy of both licenses referred to here. | + | If you did not, or have any questions about PHP licensing, please | + | contact core@php.net. | + +----------------------------------------------------------------------+ + | Authors: | + | | + +----------------------------------------------------------------------+ + */ +#include "tls.h" + +#if THREAD_SAFE +/*This is indeed a global!*/ +DWORD TlsIndex; +#else +php3_globals_struct *php3_globals; +#endif + +/* just copying from some samples, can replace this with +standard php error messaging */ +VOID ErrorExit (LPTSTR lpszMessage) +{ + fprintf(stderr, "%s\n", lpszMessage); + ExitProcess(0); +} + +/*all these functions are called from DllMain() + in a NON thread safe version, tls_startup and + tls_shutdown should be initiated before anything + else. This will allocate memory for globals. + + called at dll load*/ +int tls_startup(void){ +#if THREAD_SAFE + if ((TlsIndex=TlsAlloc())==0xFFFFFFFF){ + return 0; + } +#else + php3_globals=malloc(sizeof(php3_globals)); +#endif + return 1; +} +/*called at dll unload*/ +int tls_shutdown(void){ +#if THREAD_SAFE + if (!TlsFree(TlsIndex)){ + return 0; + } +#else + free(php3_globals); +#endif + return 1; +} + +#if THREAD_SAFE +/*called at start of thread*/ +int tls_create(void){ + php3_globals_struct *php3_globals; + php3_globals = (php3_globals_struct *) LocalAlloc(LPTR, sizeof(php3_globals_struct)); + if (! TlsSetValue(TlsIndex, (void *) php3_globals)) + ErrorExit("TlsSetValue error"); + + return 1; +} + +/*called at end of thread*/ +int tls_destroy(void){ + php3_globals_struct *php3_globals; + php3_globals = TlsGetValue(TlsIndex); + if (php3_globals != 0) + LocalFree((HLOCAL) php3_globals); + return 1; +} + +#endif + + +/* +accessing data inside a thread +This short function shows how the global struct +is accessed in a function. THREAD_SAFE should +only need to be defined on windows server modules + +void thread_safe_access_of_globals(VOID) +{ + TLS_VARS; + + if ((php3_globals == 0) && (GetLastError() != 0)) { + ErrorExit("TlsGetValue error"); + } +} + +*/ |