Allocate a TLS slot once at process join and treat TlsIndex as an alias to it.

svn path=/trunk/; revision=43120
This commit is contained in:
Art Yerkes 2009-09-23 00:45:19 +00:00
parent dacdbb5e50
commit f0b6797aad
3 changed files with 12 additions and 26 deletions

View file

@ -251,9 +251,9 @@ typedef BOOL
extern HINSTANCE WsDllHandle;
extern HANDLE WsSockHeap;
extern PWAH_HANDLE_TABLE WsSockHandleTable;
extern DWORD TlsIndex;
extern PWSPROCESS CurrentWsProcess;
extern DWORD GlobalTlsIndex;
#define TlsIndex GlobalTlsIndex
extern BOOLEAN WsAsyncThreadInitialized;
extern PWS_SOCK_POST_ROUTINE WsSockPostRoutine;

View file

@ -19,7 +19,7 @@
HANDLE WsSockHeap;
HINSTANCE WsDllHandle;
DWORD GlobalTlsIndex;
DWORD GlobalTlsIndex = TLS_OUT_OF_INDEXES;
/* FUNCTIONS *****************************************************************/
@ -35,7 +35,6 @@ DllMain(HANDLE hModule,
switch (dwReason)
{
case DLL_PROCESS_ATTACH:
/* Save DLL Handle */
WsDllHandle = hModule;
@ -43,8 +42,14 @@ DllMain(HANDLE hModule,
WsSockHeap = GetProcessHeap();
/* TLS Allocation */
GlobalTlsIndex = TlsAlloc();
if (GlobalTlsIndex == TLS_OUT_OF_INDEXES) return FALSE;
if (GlobalTlsIndex == TLS_OUT_OF_INDEXES)
{
GlobalTlsIndex = TlsAlloc();
if (GlobalTlsIndex == TLS_OUT_OF_INDEXES)
{
return FALSE;
}
}
/* Initialize some critical sections */
WsCreateStartupSynchronization();
@ -61,7 +66,6 @@ DllMain(HANDLE hModule,
break;
case DLL_PROCESS_DETACH:
/* Make sure we were initialized */
if (!WsDllHandle) break;

View file

@ -9,10 +9,6 @@
/* INCLUDES ******************************************************************/
#include "ws2_32.h"
/* DATA **********************************************************************/
DWORD TlsIndex;
/* FUNCTIONS *****************************************************************/
DWORD
@ -156,16 +152,7 @@ WsThreadStartup(VOID)
INT ErrorCode = WSASYSCALLFAILURE;
/* Check if we have a valid TLS */
if (TlsIndex == TLS_OUT_OF_INDEXES)
{
/* Set the global one */
if ((TlsIndex = GlobalTlsIndex) != TLS_OUT_OF_INDEXES)
{
/* Success! */
ErrorCode = ERROR_SUCCESS;
}
}
else
if (TlsIndex != TLS_OUT_OF_INDEXES)
{
/* TLS was already OK */
ErrorCode = ERROR_SUCCESS;
@ -179,12 +166,6 @@ VOID
WSAAPI
WsThreadCleanup(VOID)
{
/* Check if we have a valid TLS */
if (TlsIndex != TLS_OUT_OF_INDEXES)
{
/* We do, invalidate it */
TlsIndex = TLS_OUT_OF_INDEXES;
}
}
DWORD
@ -250,6 +231,7 @@ WsThreadDestroyCurrentThread(VOID)
{
/* Delete it */
WsThreadDelete(Thread);
TlsSetValue(TlsIndex, 0);
}
}
}