forked from enlightenment/efl
eo: use Eina_Spinlock instead of Eina_Lock.
This is an ABI/API break for Eo, you will need to rebuild everything that use Eo.
This commit is contained in:
parent
0aa77d7dde
commit
435caae51a
|
@ -70,7 +70,7 @@ typedef short Eo_Callback_Priority;
|
||||||
* Don't touch it if you don't know what you are doing.
|
* Don't touch it if you don't know what you are doing.
|
||||||
* @internal
|
* @internal
|
||||||
*/
|
*/
|
||||||
EAPI extern Eina_Lock _eo_class_creation_lock;
|
EAPI extern Eina_Spinlock _eo_class_creation_lock;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @internal
|
* @internal
|
||||||
|
@ -334,31 +334,31 @@ class_get_func_name(void) \
|
||||||
{ \
|
{ \
|
||||||
const Eo_Class *_tmp_parent_class; \
|
const Eo_Class *_tmp_parent_class; \
|
||||||
static volatile char lk_init = 0; \
|
static volatile char lk_init = 0; \
|
||||||
static Eina_Lock _my_lock; \
|
static Eina_Spinlock _my_lock; \
|
||||||
static const Eo_Class * volatile _my_class = NULL; \
|
static const Eo_Class * volatile _my_class = NULL; \
|
||||||
if (EINA_LIKELY(!!_my_class)) return _my_class; \
|
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) \
|
if (!lk_init) \
|
||||||
eina_lock_new(&_my_lock); \
|
eina_spinlock_new(&_my_lock); \
|
||||||
if (lk_init < 2) eina_lock_take(&_my_lock); \
|
if (lk_init < 2) eina_spinlock_take(&_my_lock); \
|
||||||
if (!lk_init) \
|
if (!lk_init) \
|
||||||
lk_init = 1; \
|
lk_init = 1; \
|
||||||
else \
|
else \
|
||||||
{ \
|
{ \
|
||||||
if (lk_init < 2) eina_lock_release(&_my_lock); \
|
if (lk_init < 2) eina_spinlock_release(&_my_lock); \
|
||||||
eina_lock_release(&_eo_class_creation_lock); \
|
eina_spinlock_release(&_eo_class_creation_lock); \
|
||||||
return _my_class; \
|
return _my_class; \
|
||||||
} \
|
} \
|
||||||
eina_lock_release(&_eo_class_creation_lock); \
|
eina_spinlock_release(&_eo_class_creation_lock); \
|
||||||
_tmp_parent_class = parent_class; \
|
_tmp_parent_class = parent_class; \
|
||||||
_my_class = eo_class_new(class_desc, _tmp_parent_class, __VA_ARGS__); \
|
_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_spinlock_take(&_eo_class_creation_lock); \
|
||||||
eina_lock_free(&_my_lock); \
|
eina_spinlock_free(&_my_lock); \
|
||||||
lk_init = 2; \
|
lk_init = 2; \
|
||||||
eina_lock_release(&_eo_class_creation_lock); \
|
eina_spinlock_release(&_eo_class_creation_lock); \
|
||||||
return _my_class; \
|
return _my_class; \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
#define EO_OP_IDS_FIRST 1
|
#define EO_OP_IDS_FIRST 1
|
||||||
|
|
||||||
/* Used inside the class_get functions of classes, see #EO_DEFINE_CLASS */
|
/* 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;
|
int _eo_log_dom = -1;
|
||||||
|
|
||||||
static _Eo_Class **_eo_classes;
|
static _Eo_Class **_eo_classes;
|
||||||
|
@ -691,8 +691,8 @@ eo_class_free(_Eo_Class *klass)
|
||||||
EINA_TRASH_CLEAN(&klass->iterators.trash, data)
|
EINA_TRASH_CLEAN(&klass->iterators.trash, data)
|
||||||
free(data);
|
free(data);
|
||||||
|
|
||||||
eina_lock_free(&klass->objects.trash_lock);
|
eina_spinlock_free(&klass->objects.trash_lock);
|
||||||
eina_lock_free(&klass->iterators.trash_lock);
|
eina_spinlock_free(&klass->iterators.trash_lock);
|
||||||
|
|
||||||
free(klass);
|
free(klass);
|
||||||
}
|
}
|
||||||
|
@ -889,8 +889,8 @@ eo_class_new(const Eo_Class_Description *desc, const Eo_Class *parent_id, ...)
|
||||||
#ifndef HAVE_EO_ID
|
#ifndef HAVE_EO_ID
|
||||||
EINA_MAGIC_SET((Eo_Base *) klass, EO_CLASS_EINA_MAGIC);
|
EINA_MAGIC_SET((Eo_Base *) klass, EO_CLASS_EINA_MAGIC);
|
||||||
#endif
|
#endif
|
||||||
eina_lock_new(&klass->objects.trash_lock);
|
eina_spinlock_new(&klass->objects.trash_lock);
|
||||||
eina_lock_new(&klass->iterators.trash_lock);
|
eina_spinlock_new(&klass->iterators.trash_lock);
|
||||||
klass->parent = parent;
|
klass->parent = parent;
|
||||||
klass->desc = desc;
|
klass->desc = desc;
|
||||||
klass->extensions = (const _Eo_Class **) ((char *) klass + _eo_class_sz);
|
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;
|
klass->header.id = ++_eo_classes_last_id;
|
||||||
{
|
{
|
||||||
/* FIXME: Handle errors. */
|
/* 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 = tmp;
|
||||||
_eo_classes[klass->header.id - 1] = klass;
|
_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);
|
_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;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
eina_lock_take(&klass->objects.trash_lock);
|
eina_spinlock_take(&klass->objects.trash_lock);
|
||||||
obj = eina_trash_pop(&klass->objects.trash);
|
obj = eina_trash_pop(&klass->objects.trash);
|
||||||
if (obj)
|
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);
|
obj = calloc(1, klass->obj_size);
|
||||||
}
|
}
|
||||||
eina_lock_release(&klass->objects.trash_lock);
|
eina_spinlock_release(&klass->objects.trash_lock);
|
||||||
|
|
||||||
obj->refcount++;
|
obj->refcount++;
|
||||||
obj->klass = klass;
|
obj->klass = klass;
|
||||||
|
@ -1424,7 +1424,7 @@ eo_init(void)
|
||||||
return EINA_FALSE;
|
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.");
|
EINA_LOG_ERR("Could not init lock.");
|
||||||
return EINA_FALSE;
|
return EINA_FALSE;
|
||||||
|
@ -1471,7 +1471,7 @@ eo_shutdown(void)
|
||||||
if (_eo_classes)
|
if (_eo_classes)
|
||||||
free(_eo_classes);
|
free(_eo_classes);
|
||||||
|
|
||||||
eina_lock_free(&_eo_class_creation_lock);
|
eina_spinlock_free(&_eo_class_creation_lock);
|
||||||
|
|
||||||
_eo_free_ids_tables();
|
_eo_free_ids_tables();
|
||||||
|
|
||||||
|
|
|
@ -197,7 +197,7 @@ _eo_children_iterator_free(Eo_Children_Iterator *it)
|
||||||
klass = (_Eo_Class*) it->obj->klass;
|
klass = (_Eo_Class*) it->obj->klass;
|
||||||
obj = it->obj;
|
obj = it->obj;
|
||||||
|
|
||||||
eina_lock_take(&klass->iterators.trash_lock);
|
eina_spinlock_take(&klass->iterators.trash_lock);
|
||||||
if (klass->iterators.trash_count < 8)
|
if (klass->iterators.trash_count < 8)
|
||||||
{
|
{
|
||||||
klass->iterators.trash_count++;
|
klass->iterators.trash_count++;
|
||||||
|
@ -207,7 +207,7 @@ _eo_children_iterator_free(Eo_Children_Iterator *it)
|
||||||
{
|
{
|
||||||
free(it);
|
free(it);
|
||||||
}
|
}
|
||||||
eina_lock_release(&klass->iterators.trash_lock);
|
eina_spinlock_release(&klass->iterators.trash_lock);
|
||||||
|
|
||||||
_eo_unref(obj);
|
_eo_unref(obj);
|
||||||
}
|
}
|
||||||
|
@ -228,7 +228,7 @@ _children_iterator_new(Eo *obj_id, void *class_data, va_list *list)
|
||||||
|
|
||||||
klass = (_Eo_Class *) obj->klass;
|
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);
|
*it = eina_trash_pop(&klass->iterators.trash);
|
||||||
if (*it)
|
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));
|
*it = calloc(1, sizeof (Eo_Children_Iterator));
|
||||||
}
|
}
|
||||||
eina_lock_release(&klass->iterators.trash_lock);
|
eina_spinlock_release(&klass->iterators.trash_lock);
|
||||||
if (!*it) return ;
|
if (!*it) return ;
|
||||||
|
|
||||||
EINA_MAGIC_SET(&(*it)->iterator, EINA_MAGIC_ITERATOR);
|
EINA_MAGIC_SET(&(*it)->iterator, EINA_MAGIC_ITERATOR);
|
||||||
|
|
|
@ -143,15 +143,15 @@ struct _Eo_Class
|
||||||
/* cached object for faster allocation */
|
/* cached object for faster allocation */
|
||||||
struct {
|
struct {
|
||||||
Eina_Trash *trash;
|
Eina_Trash *trash;
|
||||||
Eina_Lock trash_lock;
|
Eina_Spinlock trash_lock;
|
||||||
unsigned int trash_count;
|
unsigned int trash_count;
|
||||||
} objects;
|
} objects;
|
||||||
|
|
||||||
/* cached iterator for faster allocation cycle */
|
/* cached iterator for faster allocation cycle */
|
||||||
struct {
|
struct {
|
||||||
Eina_Trash *trash;
|
Eina_Trash *trash;
|
||||||
Eina_Lock trash_lock;
|
Eina_Spinlock trash_lock;
|
||||||
unsigned int trash_count;
|
unsigned int trash_count;
|
||||||
} iterators;
|
} iterators;
|
||||||
|
|
||||||
unsigned int obj_size; /**< size of an object of this class */
|
unsigned int obj_size; /**< size of an object of this class */
|
||||||
|
@ -254,7 +254,7 @@ _eo_free(_Eo_Object *obj)
|
||||||
#endif
|
#endif
|
||||||
_eo_id_release((Eo_Id) _eo_id_get(obj));
|
_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)
|
if (klass->objects.trash_count <= 8)
|
||||||
{
|
{
|
||||||
eina_trash_push(&klass->objects.trash, obj);
|
eina_trash_push(&klass->objects.trash, obj);
|
||||||
|
@ -264,7 +264,7 @@ _eo_free(_Eo_Object *obj)
|
||||||
{
|
{
|
||||||
free(obj);
|
free(obj);
|
||||||
}
|
}
|
||||||
eina_lock_release(&klass->objects.trash_lock);
|
eina_spinlock_release(&klass->objects.trash_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline _Eo_Object *
|
static inline _Eo_Object *
|
||||||
|
|
Loading…
Reference in New Issue