Store the winsock per-thread data in NtCurrentTeb()->WinSockData
instead of using TlsAlloc.
diff --git a/dlls/winsock/socket.c b/dlls/winsock/socket.c
index 5de9b5a..c4f652b 100644
--- a/dlls/winsock/socket.c
+++ b/dlls/winsock/socket.c
@@ -222,7 +222,6 @@
int pe_len;
};
-static DWORD tls_index = TLS_OUT_OF_INDEXES; /* TLS index for per-thread data */
static INT num_startup; /* reference counter */
static FARPROC blocking_hook = WSA_DefaultBlockingHook;
@@ -405,19 +404,19 @@
static struct per_thread_data *get_per_thread_data(void)
{
- struct per_thread_data * ptb = TlsGetValue( tls_index );
+ struct per_thread_data * ptb = NtCurrentTeb()->WinSockData;
/* lazy initialization */
if (!ptb)
{
ptb = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*ptb) );
- TlsSetValue( tls_index, ptb );
+ NtCurrentTeb()->WinSockData = ptb;
}
return ptb;
}
static void free_per_thread_data(void)
{
- struct per_thread_data * ptb = TlsGetValue( tls_index );
+ struct per_thread_data * ptb = NtCurrentTeb()->WinSockData;
if (!ptb) return;
@@ -430,6 +429,7 @@
ptb->pe_buffer = NULL;
HeapFree( GetProcessHeap(), 0, ptb );
+ NtCurrentTeb()->WinSockData = NULL;
}
/***********************************************************************
@@ -440,11 +440,9 @@
TRACE("%p 0x%lx %p\n", hInstDLL, fdwReason, fImpLoad);
switch (fdwReason) {
case DLL_PROCESS_ATTACH:
- tls_index = TlsAlloc();
break;
case DLL_PROCESS_DETACH:
free_per_thread_data();
- TlsFree( tls_index );
num_startup = 0;
break;
case DLL_THREAD_DETACH:
diff --git a/include/thread.h b/include/thread.h
index baaf6c1..697c417 100644
--- a/include/thread.h
+++ b/include/thread.h
@@ -110,12 +110,20 @@
PVOID DeallocationStack; /* -2- e0c Base of the stack */
LPVOID TlsSlots[64]; /* -2- e10 Thread local storage */
LIST_ENTRY TlsLinks; /* -2- f10 */
- DWORD pad8[1]; /* --n f18 */
- PVOID ReservedForNtRpc; /* -2- f1c used by rpcrt4 */
- DWORD pad9[24]; /* --n f20 */
- PVOID ReservedForOle; /* -2- f80 used by ole32 (IErrorInfo*) */
- PVOID pad10[4]; /* --n f84 */
- PVOID *TlsExpansionSlots; /* -2- f94 */
+ PVOID Vdm; /* f18 */
+ PVOID ReservedForNtRpc; /* f1c */
+ PVOID DbgSsReserved[2]; /* f20 */
+ ULONG HardErrorDisabled; /* f28 */
+ PVOID Instrumentation[16]; /* f2c */
+ PVOID WinSockData; /* f6c */
+ ULONG GdiBatchCount; /* f70 */
+ ULONG Spare2; /* f74 */
+ ULONG Spare3; /* f78 */
+ ULONG Spare4; /* f7c */
+ PVOID ReservedForOle; /* f80 */
+ ULONG WaitingOnLoaderLock; /* f84 */
+ PVOID Reserved5[3]; /* f88 */
+ PVOID *TlsExpansionSlots; /* f94 */
} TEB;
#endif /* WINE_TEB_DEFINED */