[OPENGL32]
[reactos.git] / dll / opengl / opengl32 / dllmain.c
index 9d8f9df..6564975 100644 (file)
@@ -9,6 +9,22 @@
 
 #ifdef OPENGL32_USE_TLS
 DWORD OglTlsIndex = 0xFFFFFFFF;
+
+BOOL init_tls_data(void)
+{
+    struct Opengl32_ThreadData* ThreadData;
+
+    ThreadData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*ThreadData));
+    if(!ThreadData)
+        return FALSE;
+    TlsSetValue(OglTlsIndex, ThreadData);
+    ThreadData->glDispatchTable = &StubTable.glDispatchTable;
+    ThreadData->hglrc = NULL;
+    ThreadData->hdc = NULL;
+    ThreadData->dc_data = NULL;
+    return TRUE;
+}
+
 #endif
 
 BOOL WINAPI
@@ -19,54 +35,53 @@ DllMain(HINSTANCE hInstance, DWORD Reason, LPVOID Reserved)
 #endif
     switch ( Reason )
     {
-        /* The DLL is loading due to process
-         * initialization or a call to LoadLibrary.
-         */
         case DLL_PROCESS_ATTACH:
 #ifdef OPENGL32_USE_TLS
             OglTlsIndex = TlsAlloc();
             if(OglTlsIndex == TLS_OUT_OF_INDEXES)
                 return FALSE;
 #endif
-        /* Fall through */
+            /* Initialize Context list */
+            InitializeListHead(&ContextListHead);
+            /* no break */
         case DLL_THREAD_ATTACH:
 #ifdef OPENGL32_USE_TLS
-            ThreadData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*ThreadData));
-            if(!ThreadData)
+            if (!init_tls_data())
                 return FALSE;
-            TlsSetValue(OglTlsIndex, ThreadData);
-            ThreadData->glDispatchTable = &StubTable.glDispatchTable;
-            ThreadData->hglrc = NULL;
-            ThreadData->hdc = NULL;
-            ThreadData->dc_data = NULL;
-#else
-            NtCurrentTeb()->glTable = &StubTable.glDispatchTable;
 #endif // defined(OPENGL32_USE_TLS)
             break;
 
         case DLL_THREAD_DETACH:
+            /* Set NULL context for this thread */
+            wglMakeCurrent(NULL, NULL);
             /* Clean up */
 #ifdef OPENGL32_USE_TLS
             ThreadData = TlsGetValue(OglTlsIndex);
             if(ThreadData)
                 HeapFree(GetProcessHeap(), 0, ThreadData);
 #else
-            NtCurrentTeb->glTable = NULL;
+            NtCurrentTeb()->glTable = NULL;
 #endif // defined(OPENGL32_USE_TLS)
-            break;
-        
+        break;
         case DLL_PROCESS_DETACH:
             /* Clean up */
+            if (!Reserved)
+            {
+                /* The process is not shutting down: release everything */
+                wglMakeCurrent(NULL, NULL);
+                IntDeleteAllContexts();
+                IntDeleteAllICDs();
+#ifdef OPENGL32_USE_TLS
+                ThreadData = TlsGetValue(OglTlsIndex);
+                if(ThreadData)
+                    HeapFree(GetProcessHeap(), 0, ThreadData);
+#endif
+            }
 #ifdef OPENGL32_USE_TLS
-            ThreadData = TlsGetValue(OglTlsIndex);
-            if(ThreadData)
-                HeapFree(GetProcessHeap(), 0, ThreadData);
             TlsFree(OglTlsIndex);
-#else
-            NtCurrentTeb->glTable = NULL;
-#endif // defined(OPENGL32_USE_TLS)
+#endif
             break;
     }
 
     return TRUE;
-}
\ No newline at end of file
+}