use mutex instead of spinlock. older pthreads dont have spinlocks. also this

uses the same mutex macros used by the mutex on font objects, so it makes it
a bit simpler. old code is commented out for reference.



SVN revision: 39458
This commit is contained in:
Carsten Haitzler 2009-03-13 09:32:42 +00:00
parent 0dd51fa0cf
commit bb0e068fa1
2 changed files with 35 additions and 17 deletions

View File

@ -174,9 +174,12 @@ evas_module_init(void)
em->handle = NULL; em->handle = NULL;
em->data = NULL; em->data = NULL;
em->loaded = 0; em->loaded = 0;
#if defined(BUILD_PTHREAD) && defined(BUILD_ASYNC_PRELOAD) #ifdef BUILD_ASYNC_PRELOAD
pthread_spin_init(&em->lock, PTHREAD_PROCESS_PRIVATE); LKI(em->lock);
#endif #endif
//#if defined(BUILD_PTHREAD) && defined(BUILD_ASYNC_PRELOAD)
// pthread_mutex_init(&em->lock, NULL);
//#endif
if (em->type == EVAS_MODULE_TYPE_ENGINE) if (em->type == EVAS_MODULE_TYPE_ENGINE)
{ {
Evas_Module_Engine *eme; Evas_Module_Engine *eme;
@ -309,35 +312,50 @@ evas_module_unload(Evas_Module *em)
em->func.close = NULL; em->func.close = NULL;
em->api = NULL; em->api = NULL;
em->loaded = 0; em->loaded = 0;
#if defined(BUILD_PTHREAD) && defined(BUILD_ASYNC_PRELOAD) #ifdef BUILD_ASYNC_PRELOAD
pthread_spin_destroy(&em->lock); LKD(em->lock);
#endif #endif
//#if defined(BUILD_PTHREAD) && defined(BUILD_ASYNC_PRELOAD)
// pthread_mutex_destroy(&em->lock);
//#endif
} }
void void
evas_module_ref(Evas_Module *em) evas_module_ref(Evas_Module *em)
{ {
#if defined(BUILD_PTHREAD) && defined(BUILD_ASYNC_PRELOAD) #ifdef BUILD_ASYNC_PRELOAD
pthread_spin_lock(&em->lock); LKL(em->lock);
#endif #endif
//#if defined(BUILD_PTHREAD) && defined(BUILD_ASYNC_PRELOAD)
// pthread_mutex_lock(&em->lock);
//#endif
em->ref++; em->ref++;
/* printf("M: %s ref++ = %i\n", em->name, em->ref); */ /* printf("M: %s ref++ = %i\n", em->name, em->ref); */
#if defined(BUILD_PTHREAD) && defined(BUILD_ASYNC_PRELOAD) #ifdef BUILD_ASYNC_PRELOAD
pthread_spin_unlock(&em->lock); LKU(em->lock);
#endif #endif
//#if defined(BUILD_PTHREAD) && defined(BUILD_ASYNC_PRELOAD)
// pthread_mutex_unlock(&em->lock);
//#endif
} }
void void
evas_module_unref(Evas_Module *em) evas_module_unref(Evas_Module *em)
{ {
#if defined(BUILD_PTHREAD) && defined(BUILD_ASYNC_PRELOAD) #ifdef BUILD_ASYNC_PRELOAD
pthread_spin_lock(&em->lock); LKL(em->lock);
#endif #endif
//#if defined(BUILD_PTHREAD) && defined(BUILD_ASYNC_PRELOAD)
// pthread_mutex_lock(&em->lock);
//#endif
em->ref--; em->ref--;
/* printf("M: %s ref-- = %i\n", em->name, em->ref); */ /* printf("M: %s ref-- = %i\n", em->name, em->ref); */
#if defined(BUILD_PTHREAD) && defined(BUILD_ASYNC_PRELOAD) #ifdef BUILD_ASYNC_PRELOAD
pthread_spin_unlock(&em->lock); LKU(em->lock);
#endif #endif
//#if defined(BUILD_PTHREAD) && defined(BUILD_ASYNC_PRELOAD)
// pthread_mutex_unlock(&em->lock);
//#endif
} }
static int use_count = 0; static int use_count = 0;

View File

@ -50,8 +50,8 @@ struct _Evas_Module
int ref; /* how many refs */ int ref; /* how many refs */
int last_used; /* the cycle count when it was last used */ int last_used; /* the cycle count when it was last used */
#if defined(HAVE_PTHREAD_H) && defined(BUILD_ASYNC_PRELOAD) && _POSIX_SPIN_LOCKS > -1 #if defined(HAVE_PTHREAD_H) && defined(BUILD_ASYNC_PRELOAD)
pthread_spinlock_t lock; pthread_mutex_t lock;
#endif #endif
unsigned char loaded : 1; unsigned char loaded : 1;