From 3841dafd05dff43c5355057052470d762e3119f7 Mon Sep 17 00:00:00 2001 From: cedric Date: Wed, 18 May 2011 07:56:11 +0000 Subject: [PATCH] eina: fix eina_share_common_init. git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/eina@59485 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- ChangeLog | 3 +++ src/lib/eina_share_common.c | 19 +++++++++++++++---- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index a545942..ffd57a1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -82,3 +82,6 @@ * Added eina_binbuf: This is just like strbuf but for binary blobs. Requested by discomfitor and honestly it looks needed. +2011-05-18 Cedric Bail + + * Fix eina_share_common_init to be called only once. diff --git a/src/lib/eina_share_common.c b/src/lib/eina_share_common.c index 72740bb..ae2842b 100644 --- a/src/lib/eina_share_common.c +++ b/src/lib/eina_share_common.c @@ -97,6 +97,7 @@ static const char EINA_MAGIC_SHARE_STR[] = "Eina Share"; static const char EINA_MAGIC_SHARE_HEAD_STR[] = "Eina Share Head"; +static int _eina_share_common_count = 0; #define EINA_MAGIC_CHECK_SHARE_COMMON_HEAD(d, unlock, ...) \ do { \ @@ -599,9 +600,12 @@ eina_share_common_init(Eina_Share **_share, const char *node_magic_STR) { Eina_Share *share; + + if (_eina_share_common_count++ != 0) + return EINA_TRUE; + share = *_share = calloc(sizeof(Eina_Share), 1); - if (!share) - return EINA_FALSE; + if (!share) goto on_error; if (_eina_share_common_log_dom < 0) /*Only register if not already */ _eina_share_common_log_dom = eina_log_domain_register( @@ -611,7 +615,7 @@ eina_share_common_init(Eina_Share **_share, if (_eina_share_common_log_dom < 0) { EINA_LOG_ERR("Could not register log domain: eina_share_common"); - return EINA_FALSE; + goto on_error; } share->share = calloc(1, sizeof(Eina_Share_Common)); @@ -623,7 +627,7 @@ eina_share_common_init(Eina_Share **_share, _eina_share_common_log_dom = -1; } - return EINA_FALSE; + goto on_error; } share->node_magic = node_magic; @@ -638,6 +642,10 @@ eina_share_common_init(Eina_Share **_share, eina_lock_new(&_mutex_big); return EINA_TRUE; + + on_error: + _eina_share_common_count--; + return EINA_FALSE; } /** @@ -657,6 +665,9 @@ eina_share_common_shutdown(Eina_Share **_share) unsigned int i; Eina_Share *share = *_share; + if (--_eina_share_common_count != 0) + return EINA_TRUE; + eina_lock_take(&_mutex_big); _eina_share_common_population_stats(share); -- 2.7.4