This is an ABI/API break for Eo, you will need to rebuild everything that use Eo.
* 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
{ \
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; \
}
#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;
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);
}
#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);
}
}
- eina_lock_take(&_eo_class_creation_lock);
+ eina_spinlock_take(&_eo_class_creation_lock);
klass->header.id = ++_eo_classes_last_id;
{
/* FIXME: Handle errors. */
_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);
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)
{
{
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;
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;
if (_eo_classes)
free(_eo_classes);
- eina_lock_free(&_eo_class_creation_lock);
+ eina_spinlock_free(&_eo_class_creation_lock);
_eo_free_ids_tables();
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++;
{
free(it);
}
- eina_lock_release(&klass->iterators.trash_lock);
+ eina_spinlock_release(&klass->iterators.trash_lock);
_eo_unref(obj);
}
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)
{
{
*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);
/* 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 */
#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);
{
free(obj);
}
- eina_lock_release(&klass->objects.trash_lock);
+ eina_spinlock_release(&klass->objects.trash_lock);
}
static inline _Eo_Object *