From: Brian Paul Date: Mon, 31 Jan 2000 23:11:39 +0000 (+0000) Subject: added mutexes for thread safety X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=9560f05deffaf0321bba1bd0fcc8eeef4199e6e0;p=mesa.git added mutexes for thread safety --- diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c index 4525d45c86a..881dc0f0935 100644 --- a/src/mesa/main/context.c +++ b/src/mesa/main/context.c @@ -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 ); } diff --git a/src/mesa/main/hash.c b/src/mesa/main/hash.c index a7364b4dac5..88e94e7884d 100644 --- a/src/mesa/main/hash.c +++ b/src/mesa/main/hash.c @@ -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); } diff --git a/src/mesa/main/texobj.c b/src/mesa/main/texobj.c index 471ed75b143..b24470e8933 100644 --- a/src/mesa/main/texobj.c +++ b/src/mesa/main/texobj.c @@ -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) {