eina: use Eina_Spinlock in Eina_Stringshare instead of Eina_Lock.

This commit is contained in:
Cedric Bail 2013-10-10 17:25:39 +09:00
parent 82d86ea42d
commit 0aa77d7dde
4 changed files with 38 additions and 37 deletions

View File

@ -1,7 +1,8 @@
2013-10-11 Cedric Bail
* Eina: add Eina_Spinlock API,
use Eina_Spinlock in Eina_Log.
use Eina_Spinlock in Eina_Log,
replace Eina_Lock by Eina_Spinlock in Eina_Stringshare.
2013-10-10 Carsten Haitzler (The Rasterman)

2
NEWS
View File

@ -198,7 +198,7 @@ Improvements:
- Eina_Tiler now take tile size into account.
- Improve support for 64bits system.
- eina_strlcat now work with a NULL source.
- Use Eina_Spinlock for eina_log.
- Use Eina_Spinlock for eina_log, eina_stringshare.
* Eet:
- Display more information with eet -l -v.
- Force thread to always run during eet_cache_concurrency test.

View File

@ -174,7 +174,7 @@ struct _Eina_Share_Common_Head
Eina_Bool _share_common_threads_activated = EINA_FALSE;
static Eina_Lock _mutex_big;
static Eina_Spinlock _mutex_big;
#ifdef EINA_STRINGSHARE_USAGE
@ -256,9 +256,9 @@ eina_share_common_population_nolock_add(Eina_Share *share, int slen)
void
eina_share_common_population_add(Eina_Share *share, int slen)
{
eina_lock_take(&_mutex_big);
eina_spinlock_take(&_mutex_big);
eina_share_common_population_nolock_add(share, slen);
eina_lock_release(&_mutex_big);
eina_spinlock_release(&_mutex_big);
}
static void
@ -272,9 +272,9 @@ eina_share_common_population_nolock_del(Eina_Share *share, int slen)
void
eina_share_common_population_del(Eina_Share *share, int slen)
{
eina_lock_take(&_mutex_big);
eina_spinlock_take(&_mutex_big);
eina_share_common_population_nolock_del(chare, slen);
eina_lock_release(&_mutex_big);
eina_spinlock_release(&_mutex_big);
}
static void
@ -634,7 +634,7 @@ eina_share_common_init(Eina_Share **_share,
if (_eina_share_common_count++ != 0)
return EINA_TRUE;
eina_lock_new(&_mutex_big);
eina_spinlock_new(&_mutex_big);
return EINA_TRUE;
on_error:
@ -659,7 +659,7 @@ eina_share_common_shutdown(Eina_Share **_share)
unsigned int i;
Eina_Share *share = *_share;
eina_lock_take(&_mutex_big);
eina_spinlock_take(&_mutex_big);
_eina_share_common_population_stats(share);
@ -676,7 +676,7 @@ eina_share_common_shutdown(Eina_Share **_share)
_eina_share_common_population_shutdown(share);
eina_lock_release(&_mutex_big);
eina_spinlock_release(&_mutex_big);
free(*_share);
*_share = NULL;
@ -685,7 +685,7 @@ eina_share_common_shutdown(Eina_Share **_share)
if (--_eina_share_common_count != 0)
return EINA_TRUE;
eina_lock_free(&_mutex_big);
eina_spinlock_free(&_mutex_big);
return EINA_TRUE;
}
@ -752,7 +752,7 @@ eina_share_common_add_length(Eina_Share *share,
hash = eina_hash_superfast(str, slen);
eina_lock_take(&_mutex_big);
eina_spinlock_take(&_mutex_big);
p_bucket = share->share->buckets + EINA_SHARE_COMMON_BUCKET_IDX(hash);
ed = _eina_share_common_find_hash(*p_bucket, EINA_SHARE_COMMON_NODE_HASH(hash));
@ -764,27 +764,27 @@ eina_share_common_add_length(Eina_Share *share,
str,
slen,
null_size);
eina_lock_release(&_mutex_big);
eina_spinlock_release(&_mutex_big);
return s;
}
EINA_MAGIC_CHECK_SHARE_COMMON_HEAD(ed, eina_lock_release(&_mutex_big), NULL);
EINA_MAGIC_CHECK_SHARE_COMMON_HEAD(ed, eina_spinlock_release(&_mutex_big), NULL);
el = _eina_share_common_head_find(ed, str, slen);
if (el)
{
EINA_MAGIC_CHECK_SHARE_COMMON_NODE(el,
share->node_magic,
eina_lock_release(&_mutex_big));
eina_spinlock_release(&_mutex_big));
el->references++;
eina_lock_release(&_mutex_big);
eina_spinlock_release(&_mutex_big);
return el->str;
}
el = _eina_share_common_node_alloc(slen, null_size);
if (!el)
{
eina_lock_release(&_mutex_big);
eina_spinlock_release(&_mutex_big);
return NULL;
}
@ -793,7 +793,7 @@ eina_share_common_add_length(Eina_Share *share,
ed->head = el;
_eina_share_common_population_head_add(share, ed);
eina_lock_release(&_mutex_big);
eina_spinlock_release(&_mutex_big);
return el->str;
}
@ -806,18 +806,18 @@ eina_share_common_ref(Eina_Share *share, const char *str)
if (!str)
return NULL;
eina_lock_take(&_mutex_big);
eina_spinlock_take(&_mutex_big);
node = _eina_share_common_node_from_str(str, share->node_magic);
if (!node)
{
eina_lock_release(&_mutex_big);
eina_spinlock_release(&_mutex_big);
return str;
}
node->references++;
eina_share_common_population_nolock_add(share, node->length);
eina_lock_release(&_mutex_big);
eina_spinlock_release(&_mutex_big);
return str;
}
@ -834,7 +834,7 @@ eina_share_common_del(Eina_Share *share, const char *str)
if (!str)
return EINA_TRUE;
eina_lock_take(&_mutex_big);
eina_spinlock_take(&_mutex_big);
node = _eina_share_common_node_from_str(str, share->node_magic);
if (!node)
@ -845,7 +845,7 @@ eina_share_common_del(Eina_Share *share, const char *str)
if (node->references > 1)
{
node->references--;
eina_lock_release(&_mutex_big);
eina_spinlock_release(&_mutex_big);
return EINA_TRUE;
}
@ -855,7 +855,7 @@ eina_share_common_del(Eina_Share *share, const char *str)
if (!ed)
goto on_error;
EINA_MAGIC_CHECK_SHARE_COMMON_HEAD(ed, eina_lock_release(&_mutex_big), EINA_FALSE);
EINA_MAGIC_CHECK_SHARE_COMMON_HEAD(ed, eina_spinlock_release(&_mutex_big), EINA_FALSE);
if (node != &ed->builtin_node)
{
@ -872,12 +872,12 @@ eina_share_common_del(Eina_Share *share, const char *str)
else
_eina_share_common_population_head_del(share, ed);
eina_lock_release(&_mutex_big);
eina_spinlock_release(&_mutex_big);
return EINA_TRUE;
on_error:
eina_lock_release(&_mutex_big);
eina_spinlock_release(&_mutex_big);
/* possible segfault happened before here, but... */
return EINA_FALSE;
}
@ -913,7 +913,7 @@ eina_share_common_dump(Eina_Share *share, void (*additional_dump)(
printf("DDD: len ref string\n");
printf("DDD:-------------------\n");
eina_lock_take(&_mutex_big);
eina_spinlock_take(&_mutex_big);
for (i = 0; i < EINA_SHARE_COMMON_BUCKETS; i++)
{
if (!share->share->buckets[i])
@ -958,7 +958,7 @@ eina_share_common_dump(Eina_Share *share, void (*additional_dump)(
share->population_group[i].max);
#endif
eina_lock_release(&_mutex_big);
eina_spinlock_release(&_mutex_big);
}
/**

View File

@ -69,7 +69,7 @@ static Eina_Share *stringshare_share;
static const char EINA_MAGIC_STRINGSHARE_NODE_STR[] = "Eina Stringshare Node";
extern Eina_Bool _share_common_threads_activated;
static Eina_Lock _mutex_small;
static Eina_Spinlock _mutex_small;
/* Stringshare optimizations */
static const unsigned char _eina_stringshare_single[512] = {
@ -396,7 +396,7 @@ error:
static void
_eina_stringshare_small_init(void)
{
eina_lock_new(&_mutex_small);
eina_spinlock_new(&_mutex_small);
memset(&_eina_small_share, 0, sizeof(_eina_small_share));
}
@ -428,7 +428,7 @@ _eina_stringshare_small_shutdown(void)
*p_bucket = NULL;
}
eina_lock_free(&_mutex_small);
eina_spinlock_free(&_mutex_small);
}
static void
@ -586,9 +586,9 @@ eina_stringshare_del(Eina_Stringshare *str)
else if (slen < 4)
{
eina_share_common_population_del(stringshare_share, slen);
eina_lock_take(&_mutex_small);
eina_spinlock_take(&_mutex_small);
_eina_stringshare_small_del(str, slen);
eina_lock_release(&_mutex_small);
eina_spinlock_release(&_mutex_small);
return;
}
@ -619,9 +619,9 @@ eina_stringshare_add_length(const char *str, unsigned int slen)
const char *s;
eina_share_common_population_add(stringshare_share, slen);
eina_lock_take(&_mutex_small);
eina_spinlock_take(&_mutex_small);
s = _eina_stringshare_small_add(str, slen);
eina_lock_release(&_mutex_small);
eina_spinlock_release(&_mutex_small);
return s;
}
@ -738,9 +738,9 @@ eina_stringshare_ref(Eina_Stringshare *str)
const char *s;
eina_share_common_population_add(stringshare_share, slen);
eina_lock_take(&_mutex_small);
eina_spinlock_take(&_mutex_small);
s = _eina_stringshare_small_add(str, slen);
eina_lock_release(&_mutex_small);
eina_spinlock_release(&_mutex_small);
return s;
}