added mutexes for thread safety
authorBrian Paul <brian.paul@tungstengraphics.com>
Mon, 31 Jan 2000 23:11:39 +0000 (23:11 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Mon, 31 Jan 2000 23:11:39 +0000 (23:11 +0000)
src/mesa/main/context.c
src/mesa/main/hash.c
src/mesa/main/texobj.c

index 4525d45c86a1f184aa4d353b92667c3fae1b3905..881dc0f09354863281d02ad34872d39b98adeb4b 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: context.c,v 1.36 2000/01/28 20:17:42 brianp Exp $ */
+/* $Id: context.c,v 1.37 2000/01/31 23:11:39 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -44,6 +44,7 @@
 #include "get.h"
 #include "glapi.h"
 #include "glapinoop.h"
+#include "glthread.h"
 #include "hash.h"
 #include "light.h"
 #include "lines.h"
@@ -424,12 +425,16 @@ void gl_destroy_framebuffer( GLframebuffer *buffer )
 /**********************************************************************/
 
 
+_glthread_DECLARE_STATIC_MUTEX(OneTimeLock);
+
+
 /*
  * This function just calls all the various one-time-init functions in Mesa.
  */
 static void one_time_init( void )
 {
    static GLboolean alreadyCalled = GL_FALSE;
+   _glthread_LOCK_MUTEX(OneTimeLock);
    if (!alreadyCalled) {
       /* do some implementation tests */
       assert( sizeof(GLbyte) == 1 );
@@ -465,6 +470,7 @@ static void one_time_init( void )
 
       alreadyCalled = GL_TRUE;
    }
+   _glthread_UNLOCK_MUTEX(OneTimeLock);
 }
 
 
@@ -1325,7 +1331,9 @@ GLboolean gl_initialize_context_data( GLcontext *ctx,
          return GL_FALSE;
       }
    }
+   _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
    ctx->Shared->RefCount++;
+   _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
 
    init_attrib_groups( ctx );
 
@@ -1434,9 +1442,11 @@ void gl_free_context_data( GLcontext *ctx )
 
    gl_vb_free( ctx->VB );
 
+   _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
    ctx->Shared->RefCount--;
-   assert(ctx->Shared->RefCount>=0);
-   if (ctx->Shared->RefCount==0) {
+   assert(ctx->Shared->RefCount >= 0);
+   _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
+   if (ctx->Shared->RefCount == 0) {
       /* free shared state */
       free_shared_state( ctx, ctx->Shared );
    }
index a7364b4dac5bf2658e7ba809fdff70bd7ebf1698..88e94e7884d19d2d764993746040dcaf8589e057 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: hash.c,v 1.6 2000/01/24 16:19:54 brianp Exp $ */
+/* $Id: hash.c,v 1.7 2000/01/31 23:11:39 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -29,6 +29,7 @@
 #include "all.h"
 #else
 #include "glheader.h"
+#include "glthread.h"
 #include "hash.h"
 #include "mem.h"
 #endif
@@ -53,6 +54,7 @@ struct HashEntry {
 struct _mesa_HashTable {
    struct HashEntry *Table[TABLE_SIZE];
    GLuint MaxKey;
+   _glthread_Mutex Mutex;
 };
 
 
@@ -130,6 +132,8 @@ void _mesa_HashInsert(struct _mesa_HashTable *table, GLuint key, void *data)
    assert(table);
    assert(key);
 
+   _glthread_LOCK_MUTEX(table->Mutex);
+
    if (key > table->MaxKey)
       table->MaxKey = key;
 
@@ -139,6 +143,7 @@ void _mesa_HashInsert(struct _mesa_HashTable *table, GLuint key, void *data)
       if (entry->Key == key) {
          /* replace entry's data */
         entry->Data = data;
+         _glthread_UNLOCK_MUTEX(table->Mutex);
         return;
       }
       entry = entry->Next;
@@ -150,6 +155,8 @@ void _mesa_HashInsert(struct _mesa_HashTable *table, GLuint key, void *data)
    entry->Data = data;
    entry->Next = table->Table[pos];
    table->Table[pos] = entry;
+
+   _glthread_UNLOCK_MUTEX(table->Mutex);
 }
 
 
@@ -167,6 +174,8 @@ void _mesa_HashRemove(struct _mesa_HashTable *table, GLuint key)
    assert(table);
    assert(key);
 
+   _glthread_LOCK_MUTEX(table->Mutex);
+
    pos = key & (TABLE_SIZE-1);
    prev = NULL;
    entry = table->Table[pos];
@@ -180,11 +189,14 @@ void _mesa_HashRemove(struct _mesa_HashTable *table, GLuint key)
             table->Table[pos] = entry->Next;
          }
          FREE(entry);
+         _glthread_UNLOCK_MUTEX(table->Mutex);
         return;
       }
       prev = entry;
       entry = entry->Next;
    }
+
+   _glthread_UNLOCK_MUTEX(table->Mutex);
 }
 
 
index 471ed75b1432e0266bf32a6d119e7dd039b9dab0..b24470e893376a044ace62cb8fa81306a4253171 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: texobj.c,v 1.12 2000/01/24 20:53:32 brianp Exp $ */
+/* $Id: texobj.c,v 1.13 2000/01/31 23:11:39 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -84,8 +84,10 @@ gl_alloc_texture_object( struct gl_shared_state *shared, GLuint name,
 
       /* insert into linked list */
       if (shared) {
+         _glthread_LOCK_MUTEX(shared->Mutex);
          obj->Next = shared->TexObjectList;
          shared->TexObjectList = obj;
+         _glthread_UNLOCK_MUTEX(shared->Mutex);
       }
 
       if (name > 0) {
@@ -118,6 +120,7 @@ void gl_free_texture_object( struct gl_shared_state *shared,
 
    /* unlink t from the linked list */
    if (shared) {
+      _glthread_LOCK_MUTEX(shared->Mutex);
       tprev = NULL;
       tcurr = shared->TexObjectList;
       while (tcurr) {
@@ -133,6 +136,7 @@ void gl_free_texture_object( struct gl_shared_state *shared,
          tprev = tcurr;
          tcurr = tcurr->Next;
       }
+      _glthread_UNLOCK_MUTEX(shared->Mutex);
    }
 
    if (t->Name) {