wgl: Move the framebuffer list to the device. Avoid recursive locking.
authorJosé Fonseca <jfonseca@vmware.com>
Thu, 9 Apr 2009 13:58:17 +0000 (14:58 +0100)
committerJosé Fonseca <jfonseca@vmware.com>
Thu, 9 Apr 2009 14:22:15 +0000 (15:22 +0100)
src/gallium/state_trackers/wgl/shared/stw_context.c
src/gallium/state_trackers/wgl/shared/stw_device.c
src/gallium/state_trackers/wgl/shared/stw_device.h
src/gallium/state_trackers/wgl/shared/stw_framebuffer.c

index f01151ba533640ecbd85215ba117733d5fc504e0..07d7452eb565062d5d468278b47d5d1f7cbe0853 100644 (file)
@@ -59,8 +59,8 @@ stw_copy_context(
 
    pipe_mutex_lock( stw_dev->mutex );
    
-   src = stw_lookup_context( hglrcSrc );
-   dst = stw_lookup_context( hglrcDst );
+   src = stw_lookup_context_locked( hglrcSrc );
+   dst = stw_lookup_context_locked( hglrcDst );
 
    if (src && dst) { 
       /* FIXME */
@@ -155,9 +155,7 @@ stw_create_layer_context(
    ctx->st->ctx->DriverCtx = ctx;
 
    pipe_mutex_lock( stw_dev->mutex );
-   {
-      hglrc = handle_table_add(stw_dev->ctx_table, ctx);
-   }
+   hglrc = handle_table_add(stw_dev->ctx_table, ctx);
    pipe_mutex_unlock( stw_dev->mutex );
 
    /* Success?
@@ -187,8 +185,10 @@ stw_delete_context(
       return FALSE;
 
    pipe_mutex_lock( stw_dev->mutex );
+   ctx = stw_lookup_context_locked(hglrc);
+   handle_table_remove(stw_dev->ctx_table, hglrc);
+   pipe_mutex_unlock( stw_dev->mutex );
 
-   ctx = stw_lookup_context(hglrc);
    if (ctx) {
       GLcontext *glctx = ctx->st->ctx;
       GET_CURRENT_CONTEXT( glcurctx );
@@ -206,19 +206,12 @@ stw_delete_context(
       if (WindowFromDC( ctx->hdc ) != NULL)
          ReleaseDC( WindowFromDC( ctx->hdc ), ctx->hdc );
 
-      pipe_mutex_lock(stw_dev->mutex);
-      {
-         st_destroy_context(ctx->st);
-         FREE(ctx);
-         handle_table_remove(stw_dev->ctx_table, hglrc);
-      }
-      pipe_mutex_unlock(stw_dev->mutex);
+      st_destroy_context(ctx->st);
+      FREE(ctx);
 
       ret = TRUE;
    }
 
-   pipe_mutex_unlock( stw_dev->mutex );
-   
    return ret;
 }
 
@@ -226,32 +219,27 @@ BOOL
 stw_release_context(
    UINT_PTR hglrc )
 {
-   BOOL ret = FALSE;
+   struct stw_context *ctx;
 
    if (!stw_dev)
-      return ret;
+      return FALSE;
 
    pipe_mutex_lock( stw_dev->mutex );
-   {
-      struct stw_context *ctx;
-
-      /* XXX: The expectation is that ctx is the same context which is
-       * current for this thread.  We should check that and return False
-       * if not the case.
-       */
-      ctx = stw_lookup_context( hglrc );
-      if (ctx == NULL) 
-         goto done;
+   ctx = stw_lookup_context_locked( hglrc );
+   pipe_mutex_unlock( stw_dev->mutex );
 
-      if (stw_make_current( NULL, 0 ) == FALSE)
-         goto done;
+   if (!ctx)
+      return FALSE;
+   
+   /* XXX: The expectation is that ctx is the same context which is
+    * current for this thread.  We should check that and return False
+    * if not the case.
+    */
 
-      ret = TRUE;
-   }
-done:
-   pipe_mutex_unlock( stw_dev->mutex );
+   if (stw_make_current( NULL, 0 ) == FALSE)
+      return FALSE;
 
-   return ret;
+   return TRUE;
 }
 
 /* Find the width and height of the window named by hdc.
@@ -300,7 +288,7 @@ stw_make_current(
       return FALSE;
 
    pipe_mutex_lock( stw_dev->mutex ); 
-   ctx = stw_lookup_context( hglrc );
+   ctx = stw_lookup_context_locked( hglrc );
    pipe_mutex_unlock( stw_dev->mutex );
 
    stw_tls_get_data()->currentDC = hdc;
index 78d3ac831353c07b02d8a2c07b22f08024a10f69..c6d59afa0334902bb69afd588c9dae7e148794c2 100644 (file)
@@ -189,7 +189,7 @@ st_cleanup(void)
 
 
 struct stw_context *
-stw_lookup_context( UINT_PTR dhglrc )
+stw_lookup_context_locked( UINT_PTR dhglrc )
 {
    if (dhglrc == 0)
       return NULL;
index 703cb67081625b01da6bed5c694b6fa347f495f4..0ce0d54cac6460a9c99acae213829bece9c882f1 100644 (file)
@@ -35,6 +35,7 @@
 
 
 struct pipe_screen;
+struct stw_framebuffer;
 
 struct stw_device
 {
@@ -50,13 +51,15 @@ struct stw_device
 
    struct handle_table *ctx_table;
    
+   struct stw_framebuffer *fb_head;
+   
 #ifdef DEBUG
    unsigned long memdbg_no;
 #endif
 };
 
 struct stw_context *
-stw_lookup_context( UINT_PTR hglrc );
+stw_lookup_context_locked( UINT_PTR hglrc );
 
 extern struct stw_device *stw_dev;
 
index a1202ab14d613bc0359005c2a867292934a74c73..d6cf6fb53476387583f5ba4919fd7862326c39a6 100644 (file)
@@ -53,8 +53,6 @@ stw_framebuffer_resize(
    st_resize_framebuffer( fb->stfb, width, height );
 }
 
-static struct stw_framebuffer *fb_head = NULL;
-
 static LRESULT CALLBACK
 stw_window_proc(
    HWND hWnd,
@@ -64,9 +62,11 @@ stw_window_proc(
 {
    struct stw_framebuffer *fb;
 
-   for (fb = fb_head; fb != NULL; fb = fb->next)
+   pipe_mutex_lock( stw_dev->mutex );
+   for (fb = stw_dev->fb_head; fb != NULL; fb = fb->next)
       if (fb->hWnd == hWnd)
          break;
+   pipe_mutex_unlock( stw_dev->mutex );
    assert( fb != NULL );
 
    if (uMsg == WM_SIZE && wParam != SIZE_MINIMIZED)
@@ -201,8 +201,11 @@ stw_framebuffer_create(
          (LONG_PTR) stw_window_proc );
    }
 
-   fb->next = fb_head;
-   fb_head = fb;
+   pipe_mutex_lock( stw_dev->mutex );
+   fb->next = stw_dev->fb_head;
+   stw_dev->fb_head = fb;
+   pipe_mutex_unlock( stw_dev->mutex );
+
    return fb;
 }
 
@@ -210,29 +213,28 @@ void
 stw_framebuffer_destroy(
    struct stw_framebuffer *fb )
 {
-   struct stw_framebuffer **link = &fb_head;
-   struct stw_framebuffer *pfb = fb_head;
-
-   while (pfb != NULL) {
-      if (pfb == fb) {
-         if (fb->hWnd != NULL) {
-            SetWindowLongPtr(
-               fb->hWnd,
-               GWLP_WNDPROC,
-               (LONG_PTR) fb->WndProc );
-         }
-
-         *link = fb->next;
-         FREE( fb );
-         return;
-      }
-
-      link = &pfb->next;
-      pfb = pfb->next;
-   }
+   struct stw_framebuffer **link;
+
+   pipe_mutex_lock( stw_dev->mutex );
+
+   link = &stw_dev->fb_head;
+   while (link && *link != fb)
+      link = &(*link)->next;
+   assert(*link);
+   if (link)
+      *link = fb->next;
+   fb->next = NULL;
+
+   pipe_mutex_unlock( stw_dev->mutex );
+
+   if (fb->hWnd)
+      SetWindowLongPtr( fb->hWnd, GWLP_WNDPROC, (LONG_PTR)fb->WndProc );
+
+   FREE( fb );
 }
 
-/* Given an hdc, return the corresponding stw_framebuffer.
+/**
+ * Given an hdc, return the corresponding stw_framebuffer.
  */
 struct stw_framebuffer *
 stw_framebuffer_from_hdc(
@@ -240,10 +242,13 @@ stw_framebuffer_from_hdc(
 {
    struct stw_framebuffer *fb;
 
-   for (fb = fb_head; fb != NULL; fb = fb->next)
+   pipe_mutex_lock( stw_dev->mutex );
+   for (fb = stw_dev->fb_head; fb != NULL; fb = fb->next)
       if (fb->hDC == hdc)
-         return fb;
-   return NULL;
+         break;
+   pipe_mutex_unlock( stw_dev->mutex );
+
+   return fb;
 }