forked from enlightenment/efl
attempt to fix image preload thread bugs 1: module refcount.
image preload will use modules from threads, there is a possibility to crash due wrong reference counting. actually much more can fail, we need to check modules don't keep that needs exclusive access in globals or per-Evas_Module, but that's another issue. TODO: replace spinlocks with atomic operations. SVN revision: 38309
This commit is contained in:
parent
de8b6a7bbd
commit
48d7998c6e
|
@ -174,6 +174,9 @@ evas_module_init(void)
|
|||
em->handle = NULL;
|
||||
em->data = NULL;
|
||||
em->loaded = 0;
|
||||
#if defined(HAVE_PTHREAD_H) && defined(BUILD_ASYNC_PRELOAD)
|
||||
pthread_spin_init(&em->lock, PTHREAD_PROCESS_PRIVATE);
|
||||
#endif
|
||||
if (em->type == EVAS_MODULE_TYPE_ENGINE)
|
||||
{
|
||||
Evas_Module_Engine *eme;
|
||||
|
@ -306,20 +309,35 @@ evas_module_unload(Evas_Module *em)
|
|||
em->func.close = NULL;
|
||||
em->api = NULL;
|
||||
em->loaded = 0;
|
||||
#if defined(HAVE_PTHREAD_H) && defined(BUILD_ASYNC_PRELOAD)
|
||||
pthread_spin_destroy(&em->lock);
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
evas_module_ref(Evas_Module *em)
|
||||
{
|
||||
#if defined(HAVE_PTHREAD_H) && defined(BUILD_ASYNC_PRELOAD)
|
||||
pthread_spin_lock(&em->lock);
|
||||
#endif
|
||||
em->ref++;
|
||||
/* printf("M: %s ref++ = %i\n", em->name, em->ref); */
|
||||
#if defined(HAVE_PTHREAD_H) && defined(BUILD_ASYNC_PRELOAD)
|
||||
pthread_spin_unlock(&em->lock);
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
evas_module_unref(Evas_Module *em)
|
||||
{
|
||||
#if defined(HAVE_PTHREAD_H) && defined(BUILD_ASYNC_PRELOAD)
|
||||
pthread_spin_lock(&em->lock);
|
||||
#endif
|
||||
em->ref--;
|
||||
/* printf("M: %s ref-- = %i\n", em->name, em->ref); */
|
||||
#if defined(HAVE_PTHREAD_H) && defined(BUILD_ASYNC_PRELOAD)
|
||||
pthread_spin_unlock(&em->lock);
|
||||
#endif
|
||||
}
|
||||
|
||||
static int use_count = 0;
|
||||
|
|
|
@ -50,6 +50,10 @@ struct _Evas_Module
|
|||
int ref; /* how many refs */
|
||||
int last_used; /* the cycle count when it was last used */
|
||||
|
||||
#if defined(HAVE_PTHREAD_H) && defined(BUILD_ASYNC_PRELOAD)
|
||||
pthread_spinlock_t lock;
|
||||
#endif
|
||||
|
||||
unsigned char loaded : 1;
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue