From 040e5573d972239b46b7b662d63fd67035aa4543 Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Thu, 25 Sep 2008 09:02:41 +0000 Subject: [PATCH] Patch from Arnaud de Turckheim "quarium" . Use magic inside stringshare without slowdown of benchmark. Fix magic when not in DEBUG mode. SVN revision: 36246 --- legacy/eina/AUTHORS | 1 + legacy/eina/src/include/eina_magic.h | 14 +++--- legacy/eina/src/include/eina_private.h | 34 +++++++++++-- legacy/eina/src/lib/eina_magic.c | 2 +- legacy/eina/src/lib/eina_stringshare.c | 69 +++++++++++++++++++++----- 5 files changed, 97 insertions(+), 23 deletions(-) diff --git a/legacy/eina/AUTHORS b/legacy/eina/AUTHORS index 26d931daa6..3e71883156 100644 --- a/legacy/eina/AUTHORS +++ b/legacy/eina/AUTHORS @@ -6,3 +6,4 @@ Gustavo Sverzut Barbieri Tilman Sauerbeck Cedric Bail Peter "pfritz" Wehrfritz +Arnaud de Turckheim "quarium" diff --git a/legacy/eina/src/include/eina_magic.h b/legacy/eina/src/include/eina_magic.h index 95902567fb..58b16f538d 100644 --- a/legacy/eina/src/include/eina_magic.h +++ b/legacy/eina/src/include/eina_magic.h @@ -29,7 +29,7 @@ #define EINA_MAGIC_SET(d, m) (d)->__magic = (m) #define EINA_MAGIC_CHECK(d, m) ((d) && ((d)->__magic == (m))) -#define EINA_MAGIC_FAIL(d, m) eina_magic_fail((d), (d) ? (d)->__magic : 0, (m), __FILE__, __FUNCTION__, __LINE__); +#define EINA_MAGIC_FAIL(d, m) eina_magic_fail((void*)(d), (d) ? (d)->__magic : 0, (m), __FILE__, __FUNCTION__, __LINE__); typedef unsigned int Eina_Magic; @@ -43,16 +43,16 @@ EAPI void eina_magic_fail(void *d, Eina_Magic m, Eina_Magic req_m, #else -#define EINA_MAGIC_NONE (void) +#define EINA_MAGIC_NONE ((void) 0) #define EINA_MAGIC -#define EINA_MAGIC_SET(d, m) (void) +#define EINA_MAGIC_SET(d, m) ((void) 0) #define EINA_MAGIC_CHECK(d, m) (1) -#define EINA_MAGIC_FAIL(d, m) (void) +#define EINA_MAGIC_FAIL(d, m) ((void) 0) #define eina_magic_string_get(Magic) (NULL) -#define eina_magic_string_set(Magic, Magic_Name) (void) -#define eina_magic_fail(d, m, req_m, file, fnx, line) (void) -#define eina_magic_string_init() (0) +#define eina_magic_string_set(Magic, Magic_Name) ((void) 0) +#define eina_magic_fail(d, m, req_m, file, fnx, line) ((void) 0) +#define eina_magic_string_init() (1) #define eina_magic_string_shutdown() (0) #endif diff --git a/legacy/eina/src/include/eina_private.h b/legacy/eina/src/include/eina_private.h index d92811833c..8a746bf5de 100644 --- a/legacy/eina/src/include/eina_private.h +++ b/legacy/eina/src/include/eina_private.h @@ -21,6 +21,7 @@ #include +#include "eina_magic.h" #include "eina_iterator.h" #include "eina_accessor.h" @@ -46,15 +47,42 @@ #define READBUFSIZ 65536 +/* eina magic types */ +#define EINA_MAGIC_STRINGSHARE 0x10452571 +#define EINA_MAGIC_STRINGSHARE_NODE 0x95204152 +#define EINA_MAGIC_STRINGSHARE_HEAD 0x35294051 + /* undef the following, we want out version */ #undef FREE -#define FREE(ptr) free(ptr); ptr = NULL; +#define FREE(ptr) \ + do { \ + free(ptr); \ + ptr = NULL; \ + } while(0); #undef IF_FREE -#define IF_FREE(ptr) if (ptr) free(ptr); ptr = NULL; +#define IF_FREE(ptr) \ + do { \ + if (ptr) { \ + free(ptr); \ + ptr = NULL; \ + } \ + } while(0); #undef IF_FN_DEL -#define IF_FN_DEL(_fn, ptr) if (ptr) { _fn(ptr); ptr = NULL; } +#define IF_FN_DEL(_fn, ptr) \ + do { \ + if (ptr) { \ + _fn(ptr); \ + ptr = NULL; \ + } \ + } while(0); + +#define MAGIC_FREE(ptr) \ + do { \ + EINA_MAGIC_SET(ptr, EINA_MAGIC_NONE); \ + FREE(ptr); \ + } while(0); inline void eina_print_warning(const char *function, const char *sparam); diff --git a/legacy/eina/src/lib/eina_magic.c b/legacy/eina/src/lib/eina_magic.c index 961f26eb88..d12e68cf8d 100644 --- a/legacy/eina/src/lib/eina_magic.c +++ b/legacy/eina/src/lib/eina_magic.c @@ -24,12 +24,12 @@ #include "eina_array.h" #include "eina_error.h" -#include "eina_private.h" #ifndef DEBUG # define DEBUG #endif #include "eina_magic.h" +#include "eina_private.h" /*============================================================================* * Local * diff --git a/legacy/eina/src/lib/eina_stringshare.c b/legacy/eina/src/lib/eina_stringshare.c index 91a7b87f12..cb05fd4e25 100644 --- a/legacy/eina/src/lib/eina_stringshare.c +++ b/legacy/eina/src/lib/eina_stringshare.c @@ -72,6 +72,7 @@ #include "eina_rbtree.h" #include "eina_error.h" #include "eina_private.h" +#include "eina_magic.h" /*============================================================================* * Local * @@ -84,6 +85,18 @@ #define EINA_STRINGSHARE_BUCKETS 256 #define EINA_STRINGSHARE_MASK 0xFF +#define EINA_MAGIC_CHECK_STRINGSHARE_HEAD(d) \ + do { \ + if (!EINA_MAGIC_CHECK((d), EINA_MAGIC_STRINGSHARE_HEAD)) \ + EINA_MAGIC_FAIL((d), EINA_MAGIC_STRINGSHARE_HEAD); \ + } while (0); + +#define EINA_MAGIC_CHECK_STRINGSHARE_NODE(d) \ + do { \ + if (!EINA_MAGIC_CHECK((d), EINA_MAGIC_STRINGSHARE_NODE)) \ + EINA_MAGIC_FAIL((d), EINA_MAGIC_STRINGSHARE_NODE); \ + } while (0); + typedef struct _Eina_Stringshare Eina_Stringshare; typedef struct _Eina_Stringshare_Node Eina_Stringshare_Node; typedef struct _Eina_Stringshare_Head Eina_Stringshare_Head; @@ -91,11 +104,14 @@ typedef struct _Eina_Stringshare_Head Eina_Stringshare_Head; struct _Eina_Stringshare { Eina_Stringshare_Head *buckets[EINA_STRINGSHARE_BUCKETS]; + + EINA_MAGIC; }; struct _Eina_Stringshare_Head { EINA_RBTREE; + EINA_MAGIC; int hash; Eina_Stringshare_Node *head; @@ -103,6 +119,8 @@ struct _Eina_Stringshare_Head struct _Eina_Stringshare_Node { + EINA_MAGIC; + Eina_Stringshare_Node *next; int length; @@ -115,14 +133,19 @@ static Eina_Stringshare *share = NULL; static int _eina_stringshare_init_count = 0; static int -_eina_stringshare_cmp(const Eina_Stringshare_Head *node, const int *hash, __UNUSED__ int length, __UNUSED__ void *data) +_eina_stringshare_cmp(const Eina_Stringshare_Head *ed, const int *hash, __UNUSED__ int length, __UNUSED__ void *data) { - return node->hash - *hash; + EINA_MAGIC_CHECK_STRINGSHARE_HEAD(ed); + + return ed->hash - *hash; } static Eina_Rbtree_Direction _eina_stringshare_node(const Eina_Stringshare_Head *left, const Eina_Stringshare_Head *right, __UNUSED__ void *data) { + EINA_MAGIC_CHECK_STRINGSHARE_HEAD(left); + EINA_MAGIC_CHECK_STRINGSHARE_HEAD(right); + if (left->hash - right->hash < 0) return EINA_RBTREE_LEFT; return EINA_RBTREE_RIGHT; @@ -131,14 +154,17 @@ _eina_stringshare_node(const Eina_Stringshare_Head *left, const Eina_Stringshare static void _eina_stringshare_head_free(Eina_Stringshare_Head *ed, __UNUSED__ void *data) { + EINA_MAGIC_CHECK_STRINGSHARE_HEAD(ed); + while (ed->head) { Eina_Stringshare_Node *el = ed->head; ed->head = ed->head->next; - if (el->begin == EINA_FALSE) free(el); + if (el->begin == EINA_FALSE) + MAGIC_FREE(el); } - free(ed); + MAGIC_FREE(ed); } /** @@ -206,11 +232,20 @@ eina_stringshare_init() share = calloc(1, sizeof(Eina_Stringshare)); if (!share) return 0; - eina_error_init(); - } - _eina_stringshare_init_count++; - return _eina_stringshare_init_count; + eina_error_init(); + eina_magic_string_init(); + + eina_magic_string_set(EINA_MAGIC_STRINGSHARE, + "Eina Stringshare"); + eina_magic_string_set(EINA_MAGIC_STRINGSHARE_HEAD, + "Eina Stringshare Head"); + eina_magic_string_set(EINA_MAGIC_STRINGSHARE_NODE, + "Eina Stringshare Node"); + EINA_MAGIC_SET(share, EINA_MAGIC_STRINGSHARE); + } + + return ++_eina_stringshare_init_count; } /** @@ -237,9 +272,9 @@ eina_stringshare_shutdown() eina_rbtree_delete(EINA_RBTREE_GET(share->buckets[i]), EINA_RBTREE_FREE_CB(_eina_stringshare_head_free), NULL); share->buckets[i] = NULL; } - free(share); - share = NULL; + MAGIC_FREE(share); + eina_magic_string_shutdown(); eina_error_shutdown(); } @@ -284,14 +319,19 @@ eina_stringshare_add(const char *str) ed->hash = hash; ed->head = NULL; + EINA_MAGIC_SET(ed, EINA_MAGIC_STRINGSHARE_HEAD); + share->buckets[hash_num] = (Eina_Stringshare_Head*) eina_rbtree_inline_insert((Eina_Rbtree*) share->buckets[hash_num], EINA_RBTREE_GET(ed), EINA_RBTREE_CMP_NODE_CB(_eina_stringshare_node), NULL); nel = (Eina_Stringshare_Node*) (ed + 1); + EINA_MAGIC_SET(nel, EINA_MAGIC_STRINGSHARE_NODE); nel->begin = EINA_TRUE; } + EINA_MAGIC_CHECK_STRINGSHARE_HEAD(ed); + for (el = ed->head, tmp = NULL; el && slen != el->length && memcmp(str, (const char*) (el + 1), slen) != 0; tmp = el, el = el->next) @@ -315,6 +355,8 @@ eina_stringshare_add(const char *str) nel = malloc(sizeof (Eina_Stringshare_Node) + slen); if (!nel) return NULL; nel->begin = EINA_FALSE; + + EINA_MAGIC_SET(nel, EINA_MAGIC_STRINGSHARE_NODE); } nel->references = 1; @@ -357,6 +399,8 @@ eina_stringshare_del(const char *str) EINA_RBTREE_CMP_KEY_CB(_eina_stringshare_cmp), NULL); if (!ed) goto on_error; + EINA_MAGIC_CHECK_STRINGSHARE_HEAD(ed); + for (prev = NULL, el = ed->head; el && (const char*) (el + 1) != str; el = el->next) @@ -369,7 +413,8 @@ eina_stringshare_del(const char *str) { if (prev) prev->next = el->next; else ed->head = el->next; - if (el->begin == EINA_FALSE) free(el); + if (el->begin == EINA_FALSE) + MAGIC_FREE(el); if (ed->head == NULL) { @@ -377,7 +422,7 @@ eina_stringshare_del(const char *str) EINA_RBTREE_GET(ed), EINA_RBTREE_CMP_NODE_CB(_eina_stringshare_node), NULL); - free(ed); + MAGIC_FREE(ed); } } return ;