diff --git a/src/lib/eo/Eo.h b/src/lib/eo/Eo.h index 0e45fd06f6..fb7ccc2501 100644 --- a/src/lib/eo/Eo.h +++ b/src/lib/eo/Eo.h @@ -70,7 +70,7 @@ typedef short Eo_Callback_Priority; * Don't touch it if you don't know what you are doing. * @internal */ -EAPI extern Eina_Lock _eo_class_creation_lock; +EAPI extern Eina_Spinlock _eo_class_creation_lock; /** * @internal @@ -334,31 +334,31 @@ class_get_func_name(void) \ { \ const Eo_Class *_tmp_parent_class; \ static volatile char lk_init = 0; \ - static Eina_Lock _my_lock; \ + static Eina_Spinlock _my_lock; \ static const Eo_Class * volatile _my_class = NULL; \ if (EINA_LIKELY(!!_my_class)) return _my_class; \ \ - eina_lock_take(&_eo_class_creation_lock); \ + eina_spinlock_take(&_eo_class_creation_lock); \ if (!lk_init) \ - eina_lock_new(&_my_lock); \ - if (lk_init < 2) eina_lock_take(&_my_lock); \ + eina_spinlock_new(&_my_lock); \ + if (lk_init < 2) eina_spinlock_take(&_my_lock); \ if (!lk_init) \ lk_init = 1; \ else \ { \ - if (lk_init < 2) eina_lock_release(&_my_lock); \ - eina_lock_release(&_eo_class_creation_lock); \ + if (lk_init < 2) eina_spinlock_release(&_my_lock); \ + eina_spinlock_release(&_eo_class_creation_lock); \ return _my_class; \ } \ - eina_lock_release(&_eo_class_creation_lock); \ + eina_spinlock_release(&_eo_class_creation_lock); \ _tmp_parent_class = parent_class; \ _my_class = eo_class_new(class_desc, _tmp_parent_class, __VA_ARGS__); \ - eina_lock_release(&_my_lock); \ + eina_spinlock_release(&_my_lock); \ \ - eina_lock_take(&_eo_class_creation_lock); \ - eina_lock_free(&_my_lock); \ + eina_spinlock_take(&_eo_class_creation_lock); \ + eina_spinlock_free(&_my_lock); \ lk_init = 2; \ - eina_lock_release(&_eo_class_creation_lock); \ + eina_spinlock_release(&_eo_class_creation_lock); \ return _my_class; \ } diff --git a/src/lib/eo/eo.c b/src/lib/eo/eo.c index b15bd84404..3e1d3c1c21 100644 --- a/src/lib/eo/eo.c +++ b/src/lib/eo/eo.c @@ -13,7 +13,7 @@ #define EO_OP_IDS_FIRST 1 /* Used inside the class_get functions of classes, see #EO_DEFINE_CLASS */ -EAPI Eina_Lock _eo_class_creation_lock; +EAPI Eina_Spinlock _eo_class_creation_lock; int _eo_log_dom = -1; static _Eo_Class **_eo_classes; @@ -691,8 +691,8 @@ eo_class_free(_Eo_Class *klass) EINA_TRASH_CLEAN(&klass->iterators.trash, data) free(data); - eina_lock_free(&klass->objects.trash_lock); - eina_lock_free(&klass->iterators.trash_lock); + eina_spinlock_free(&klass->objects.trash_lock); + eina_spinlock_free(&klass->iterators.trash_lock); free(klass); } @@ -889,8 +889,8 @@ eo_class_new(const Eo_Class_Description *desc, const Eo_Class *parent_id, ...) #ifndef HAVE_EO_ID EINA_MAGIC_SET((Eo_Base *) klass, EO_CLASS_EINA_MAGIC); #endif - eina_lock_new(&klass->objects.trash_lock); - eina_lock_new(&klass->iterators.trash_lock); + eina_spinlock_new(&klass->objects.trash_lock); + eina_spinlock_new(&klass->iterators.trash_lock); klass->parent = parent; klass->desc = desc; klass->extensions = (const _Eo_Class **) ((char *) klass + _eo_class_sz); @@ -999,7 +999,7 @@ eo_class_new(const Eo_Class_Description *desc, const Eo_Class *parent_id, ...) } } - eina_lock_take(&_eo_class_creation_lock); + eina_spinlock_take(&_eo_class_creation_lock); klass->header.id = ++_eo_classes_last_id; { /* FIXME: Handle errors. */ @@ -1014,7 +1014,7 @@ eo_class_new(const Eo_Class_Description *desc, const Eo_Class *parent_id, ...) _eo_classes = tmp; _eo_classes[klass->header.id - 1] = klass; } - eina_lock_release(&_eo_class_creation_lock); + eina_spinlock_release(&_eo_class_creation_lock); _eo_class_constructor(klass); @@ -1065,7 +1065,7 @@ eo_add_internal(const char *file, int line, const Eo_Class *klass_id, Eo *parent return NULL; } - eina_lock_take(&klass->objects.trash_lock); + eina_spinlock_take(&klass->objects.trash_lock); obj = eina_trash_pop(&klass->objects.trash); if (obj) { @@ -1076,7 +1076,7 @@ eo_add_internal(const char *file, int line, const Eo_Class *klass_id, Eo *parent { obj = calloc(1, klass->obj_size); } - eina_lock_release(&klass->objects.trash_lock); + eina_spinlock_release(&klass->objects.trash_lock); obj->refcount++; obj->klass = klass; @@ -1424,7 +1424,7 @@ eo_init(void) return EINA_FALSE; } - if (!eina_lock_new(&_eo_class_creation_lock)) + if (!eina_spinlock_new(&_eo_class_creation_lock)) { EINA_LOG_ERR("Could not init lock."); return EINA_FALSE; @@ -1471,7 +1471,7 @@ eo_shutdown(void) if (_eo_classes) free(_eo_classes); - eina_lock_free(&_eo_class_creation_lock); + eina_spinlock_free(&_eo_class_creation_lock); _eo_free_ids_tables(); diff --git a/src/lib/eo/eo_base_class.c b/src/lib/eo/eo_base_class.c index a5a7c62f29..0e32a99beb 100644 --- a/src/lib/eo/eo_base_class.c +++ b/src/lib/eo/eo_base_class.c @@ -197,7 +197,7 @@ _eo_children_iterator_free(Eo_Children_Iterator *it) klass = (_Eo_Class*) it->obj->klass; obj = it->obj; - eina_lock_take(&klass->iterators.trash_lock); + eina_spinlock_take(&klass->iterators.trash_lock); if (klass->iterators.trash_count < 8) { klass->iterators.trash_count++; @@ -207,7 +207,7 @@ _eo_children_iterator_free(Eo_Children_Iterator *it) { free(it); } - eina_lock_release(&klass->iterators.trash_lock); + eina_spinlock_release(&klass->iterators.trash_lock); _eo_unref(obj); } @@ -228,7 +228,7 @@ _children_iterator_new(Eo *obj_id, void *class_data, va_list *list) klass = (_Eo_Class *) obj->klass; - eina_lock_take(&klass->iterators.trash_lock); + eina_spinlock_take(&klass->iterators.trash_lock); *it = eina_trash_pop(&klass->iterators.trash); if (*it) { @@ -239,7 +239,7 @@ _children_iterator_new(Eo *obj_id, void *class_data, va_list *list) { *it = calloc(1, sizeof (Eo_Children_Iterator)); } - eina_lock_release(&klass->iterators.trash_lock); + eina_spinlock_release(&klass->iterators.trash_lock); if (!*it) return ; EINA_MAGIC_SET(&(*it)->iterator, EINA_MAGIC_ITERATOR); diff --git a/src/lib/eo/eo_private.h b/src/lib/eo/eo_private.h index d2765757d6..1d9976895f 100644 --- a/src/lib/eo/eo_private.h +++ b/src/lib/eo/eo_private.h @@ -143,15 +143,15 @@ struct _Eo_Class /* cached object for faster allocation */ struct { Eina_Trash *trash; - Eina_Lock trash_lock; + Eina_Spinlock trash_lock; unsigned int trash_count; } objects; /* cached iterator for faster allocation cycle */ struct { - Eina_Trash *trash; - Eina_Lock trash_lock; - unsigned int trash_count; + Eina_Trash *trash; + Eina_Spinlock trash_lock; + unsigned int trash_count; } iterators; unsigned int obj_size; /**< size of an object of this class */ @@ -254,7 +254,7 @@ _eo_free(_Eo_Object *obj) #endif _eo_id_release((Eo_Id) _eo_id_get(obj)); - eina_lock_take(&klass->objects.trash_lock); + eina_spinlock_take(&klass->objects.trash_lock); if (klass->objects.trash_count <= 8) { eina_trash_push(&klass->objects.trash, obj); @@ -264,7 +264,7 @@ _eo_free(_Eo_Object *obj) { free(obj); } - eina_lock_release(&klass->objects.trash_lock); + eina_spinlock_release(&klass->objects.trash_lock); } static inline _Eo_Object *