forked from enlightenment/efl
stringshare buckets -> 1024 + debugging for testing.
SVN revision: 34509
This commit is contained in:
parent
69a1a1a2e0
commit
6c439dbd46
|
@ -6,32 +6,70 @@ typedef struct _Evas_Stringshare_El Evas_Stringshare_El;
|
|||
|
||||
struct _Evas_Stringshare
|
||||
{
|
||||
Evas_Stringshare_El *buckets[256];
|
||||
Evas_Stringshare_El *buckets[1024];
|
||||
};
|
||||
|
||||
struct _Evas_Stringshare_El
|
||||
{
|
||||
Evas_Stringshare_El *next;
|
||||
// int op;
|
||||
int references;
|
||||
};
|
||||
|
||||
static inline int
|
||||
_evas_stringshare_hash_gen(const char *str, int *len)
|
||||
{
|
||||
unsigned int hash_num = 5381, i;
|
||||
const unsigned char *ptr;
|
||||
|
||||
for (i = 0, ptr = (unsigned char *)str; *ptr; ptr++, i++)
|
||||
hash_num = (hash_num * 33) ^ *ptr;
|
||||
|
||||
hash_num &= 0xff;
|
||||
*len = i;
|
||||
return (int)hash_num;
|
||||
}
|
||||
|
||||
static Evas_Stringshare share =
|
||||
{
|
||||
{
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
|
@ -51,6 +89,25 @@ static Evas_Stringshare share =
|
|||
}
|
||||
};
|
||||
|
||||
//static int op = 0;
|
||||
//static FILE *f = NULL;
|
||||
|
||||
static inline int
|
||||
_evas_stringshare_hash_gen(const char *str, int *len)
|
||||
{
|
||||
unsigned int hash_num = 5381;
|
||||
const unsigned char *ptr;
|
||||
|
||||
for (ptr = (const unsigned char *)str; *ptr; ptr++)
|
||||
{
|
||||
hash_num = (hash_num * 33) ^ *ptr;
|
||||
}
|
||||
|
||||
hash_num &= 0x3ff;
|
||||
*len = ptr - (const unsigned char *)str;
|
||||
return (int)hash_num;
|
||||
}
|
||||
|
||||
EAPI const char *
|
||||
evas_stringshare_add(const char *str)
|
||||
{
|
||||
|
@ -59,6 +116,12 @@ evas_stringshare_add(const char *str)
|
|||
Evas_Stringshare_El *el, *pel = NULL;
|
||||
|
||||
if (!str) return NULL;
|
||||
// if (!f)
|
||||
// {
|
||||
// char bf[256];
|
||||
// snprintf(bf, sizeof(bf), "strlog-%i", getpid());
|
||||
// f = fopen(bf, "w");
|
||||
// }
|
||||
hash_num = _evas_stringshare_hash_gen(str, &slen);
|
||||
for (el = share.buckets[hash_num]; el; pel = el, el = el->next)
|
||||
{
|
||||
|
@ -72,7 +135,8 @@ evas_stringshare_add(const char *str)
|
|||
share.buckets[hash_num] = el;
|
||||
}
|
||||
el->references++;
|
||||
// printf("SSHARE + \"%s\", ref %i\n", el_str, el->references);
|
||||
// fprintf(f, "strings[%i] = str->add(strings[%i]);\n", el->op, el->op);
|
||||
// fflush(f);
|
||||
return el_str;
|
||||
}
|
||||
}
|
||||
|
@ -82,6 +146,10 @@ evas_stringshare_add(const char *str)
|
|||
el->references = 1;
|
||||
el->next = share.buckets[hash_num];
|
||||
share.buckets[hash_num] = el;
|
||||
// el->op = op;
|
||||
// fprintf(f, "strings[%i] = str->add(\"%s\");\n", el->op, el_str);
|
||||
// fflush(f);
|
||||
// op++;
|
||||
return el_str;
|
||||
}
|
||||
|
||||
|
@ -100,6 +168,8 @@ evas_stringshare_del(const char *str)
|
|||
if (el_str == str)
|
||||
{
|
||||
el->references--;
|
||||
// fprintf(f, "str->del(strings[%i]);\n", el->op);
|
||||
// fflush(f);
|
||||
if (el->references == 0)
|
||||
{
|
||||
if (pel) pel->next = el->next;
|
||||
|
|
Loading…
Reference in New Issue