summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJosé Fonseca <[email protected]>2010-02-12 11:00:22 +0000
committerJosé Fonseca <[email protected]>2010-02-12 11:40:05 +0000
commite475ae920a4f6026b78b0bbe80c83cf4060f610e (patch)
treec94566160150d64ddb0977bd10de93d87f4c2c85 /src
parent8ce747defa2dafebfa99f03913342d6aca995341 (diff)
wgl: Do not reach out and destroy contexts on cleanup.
Simply skip cleanup when contexts are still active. This addresses two issues: - in some situations the ICD DLL may be unloaded before the DLL that is using GL contexts is, so we may receive GL calls after stw_cleanup. - when aborting (exception, or control-c) the contexts may have been left in an inconsistent state and attempting to destroy can cause unpredictable results.
Diffstat (limited to 'src')
-rw-r--r--src/gallium/state_trackers/wgl/stw_device.c22
1 files changed, 12 insertions, 10 deletions
diff --git a/src/gallium/state_trackers/wgl/stw_device.c b/src/gallium/state_trackers/wgl/stw_device.c
index 7785aba4677..ce6fe5f4ef5 100644
--- a/src/gallium/state_trackers/wgl/stw_device.c
+++ b/src/gallium/state_trackers/wgl/stw_device.c
@@ -152,24 +152,26 @@ stw_cleanup_thread(void)
void
stw_cleanup(void)
{
- unsigned i;
+ DHGLRC dhglrc;
debug_printf("%s\n", __FUNCTION__);
if (!stw_dev)
return;
+ /*
+ * Abort cleanup if there are still active contexts. In some situations
+ * this DLL may be unloaded before the DLL that is using GL contexts is.
+ */
pipe_mutex_lock( stw_dev->ctx_mutex );
- {
- /* Ensure all contexts are destroyed */
- i = handle_table_get_first_handle(stw_dev->ctx_table);
- while (i) {
- DrvDeleteContext(i);
- i = handle_table_get_next_handle(stw_dev->ctx_table, i);
- }
- handle_table_destroy(stw_dev->ctx_table);
- }
+ dhglrc = handle_table_get_first_handle(stw_dev->ctx_table);
pipe_mutex_unlock( stw_dev->ctx_mutex );
+ if (dhglrc) {
+ debug_printf("%s: contexts still active -- cleanup aborted\n", __FUNCTION__);
+ return;
+ }
+
+ handle_table_destroy(stw_dev->ctx_table);
stw_framebuffer_cleanup();