* Sync up to trunk HEAD (r62285). Branch guys deserve the significant speedups too ;)
[reactos.git] / dll / opengl / opengl32 / dllmain.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS
4 * FILE: dll/opengl/opengl32/dllmain.c
5 * PURPOSE: OpenGL32 DLL
6 */
7
8 #include "opengl32.h"
9
10 #ifdef OPENGL32_USE_TLS
11 DWORD OglTlsIndex = 0xFFFFFFFF;
12 #endif
13
14 BOOL WINAPI
15 DllMain(HINSTANCE hInstance, DWORD Reason, LPVOID Reserved)
16 {
17 #ifdef OPENGL32_USE_TLS
18 struct Opengl32_ThreadData* ThreadData;
19 #endif
20 switch ( Reason )
21 {
22 /* The DLL is loading due to process
23 * initialization or a call to LoadLibrary.
24 */
25 case DLL_PROCESS_ATTACH:
26 #ifdef OPENGL32_USE_TLS
27 OglTlsIndex = TlsAlloc();
28 if(OglTlsIndex == TLS_OUT_OF_INDEXES)
29 return FALSE;
30 #endif
31 /* Fall through */
32 case DLL_THREAD_ATTACH:
33 #ifdef OPENGL32_USE_TLS
34 ThreadData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*ThreadData));
35 if(!ThreadData)
36 return FALSE;
37 TlsSetValue(OglTlsIndex, ThreadData);
38 ThreadData->glDispatchTable = &StubTable.glDispatchTable;
39 ThreadData->hglrc = NULL;
40 ThreadData->hdc = NULL;
41 ThreadData->dc_data = NULL;
42 #else
43 NtCurrentTeb()->glTable = &StubTable.glDispatchTable;
44 #endif // defined(OPENGL32_USE_TLS)
45 break;
46
47 case DLL_THREAD_DETACH:
48 /* Clean up */
49 #ifdef OPENGL32_USE_TLS
50 ThreadData = TlsGetValue(OglTlsIndex);
51 if(ThreadData)
52 HeapFree(GetProcessHeap(), 0, ThreadData);
53 #else
54 NtCurrentTeb->glTable = NULL;
55 #endif // defined(OPENGL32_USE_TLS)
56 break;
57
58 case DLL_PROCESS_DETACH:
59 /* Clean up */
60 #ifdef OPENGL32_USE_TLS
61 ThreadData = TlsGetValue(OglTlsIndex);
62 if(ThreadData)
63 HeapFree(GetProcessHeap(), 0, ThreadData);
64 TlsFree(OglTlsIndex);
65 #else
66 NtCurrentTeb->glTable = NULL;
67 #endif // defined(OPENGL32_USE_TLS)
68 break;
69 }
70
71 return TRUE;
72 }