Changeset: b819b8de110e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/b819b8de110e
Modified Files:
        monetdb5/mal/mal_namespace.c
Branch: Dec2025
Log Message:

Cleanup.
- Code reuse (use strHash instead of a copy);
- Reduce locking during initialization;
- Use proper defines.


diffs (171 lines):

diff --git a/monetdb5/mal/mal_namespace.c b/monetdb5/mal/mal_namespace.c
--- a/monetdb5/mal/mal_namespace.c
+++ b/monetdb5/mal/mal_namespace.c
@@ -19,35 +19,19 @@
 #include "mal_exception.h"
 #include "mal_private.h"
 
-#define MAXIDENTIFIERS 4096
-#define HASHMASK  4095
+#define HASHSIZE       (1 << 12)               /* power of two */
+#define HASHMASK       (HASHSIZE - 1)
 
 MT_Lock mal_namespaceLock = MT_LOCK_INITIALIZER(mal_namespaceLock);
 
-/* taken from gdk_atoms */
-__attribute__((__pure__))
-static inline size_t
-nme_hash(const char *key, size_t len)
-{
-       size_t y = 0;
-
-       for (size_t i = 0; i < len && key[i]; i++) {
-               y += key[i];
-               y += (y << 10);
-               y ^= (y >> 6);
-       }
-       y += (y << 3);
-       y ^= (y >> 11);
-       y += (y << 15);
-       return y & HASHMASK;
-}
+#define nme_hash(key)  ((size_t) (strHash(key) & HASHMASK))
 
 typedef struct NAME {
        struct NAME *next;
        char nme[IDLENGTH + 1];
 } *NamePtr;
 
-static NamePtr hash[MAXIDENTIFIERS];
+static NamePtr hash[HASHSIZE];
 
 static struct namespace {
        struct namespace *next;
@@ -63,19 +47,17 @@ static struct fixnamespace {
        int count;
        struct fixname data[1024];
 } fixnamespace;
-static struct fixname *fixhash[4096];
+static struct fixname *fixhash[HASHSIZE];
 
 static void
 fixName(const char *name)
 {
-       size_t key = nme_hash(name, 1024 /* something large */);
-       MT_lock_set(&mal_namespaceLock);
+       size_t key = nme_hash(name);
        struct fixname **n;
        for (n = &fixhash[key]; *n; n = &(*n)->next) {
                if ((*n)->name == name || strcmp((*n)->name, name) == 0) {
                        /* name is already there; this can happen when
                         * reinitializing */
-                       MT_lock_unset(&mal_namespaceLock);
                        return;
                }
        }
@@ -85,7 +67,6 @@ fixName(const char *name)
                .name = name,
        };
        *n = new;
-       MT_lock_unset(&mal_namespaceLock);
 }
 
 #define NAME_DEFINE(NAME) const char NAME##Ref[] = #NAME
@@ -102,6 +83,7 @@ const char plusRef[] = "+";
 void
 initNamespace(void)
 {
+       MT_lock_set(&mal_namespaceLock);
        FOREACH_NAME(NAME_FIX);
        fixName(divRef);
        fixName(eqRef);
@@ -109,6 +91,7 @@ initNamespace(void)
        fixName(modRef);
        fixName(mulRef);
        fixName(plusRef);
+       MT_lock_unset(&mal_namespaceLock);
 }
 
 void
@@ -133,27 +116,23 @@ mal_namespace_reset(void)
 }
 
 static const char *
-findName(const char *nme, size_t len, bool allocate)
+findName(const char *nme, bool allocate)
 {
        NamePtr *n, m;
        size_t key;
 
-       assert(len == 0 || nme != NULL);
-       if (len == 0 || nme == NULL)
+       if (nme == NULL)
                return NULL;
-       if (len > IDLENGTH) {
-               len = IDLENGTH;
-       }
-       key = nme_hash(nme, len);
+       key = nme_hash(nme);
        MT_lock_set(&mal_namespaceLock);
        for (struct fixname *p = fixhash[key]; p; p = p->next) {
-               if (p->name == nme || (strncmp(p->name, nme, len) == 0 && 
p->name[len] == 0)) {
+               if (p->name == nme || (strcmp(p->name, nme) == 0)) {
                        MT_lock_unset(&mal_namespaceLock);
                        return p->name;
                }
        }
        for (n = &hash[key]; *n; n = &(*n)->next) {
-               if (strncmp(nme, (*n)->nme, len) == 0 && (*n)->nme[len] == 0) {
+               if (strcmp(nme, (*n)->nme) == 0) {
                        MT_lock_unset(&mal_namespaceLock);
                        return (*n)->nme;
                }
@@ -175,8 +154,7 @@ findName(const char *nme, size_t len, bo
        }
        m = &namespace->data[namespace->count++];
        assert(m->nme != nme);
-       strncpy(m->nme, nme, len);
-       m->nme[len] = 0;
+       strcpy_len(m->nme, nme, sizeof(m->nme));
        m->next = *n;
        *n = m;
        MT_lock_unset(&mal_namespaceLock);
@@ -187,26 +165,34 @@ const char *
 getName(const char *nme)
 {
        if (nme != NULL)
-               nme = findName(nme, strlen(nme), false);
+               nme = findName(nme, false);
        return nme;
 }
 
 const char *
 getNameLen(const char *nme, size_t len)
 {
-       return findName(nme, len, false);
+       char name[IDLENGTH + 1];
+       if (len > IDLENGTH)
+               len = IDLENGTH;
+       strcpy_len(name, nme, len + 1);
+       return findName(name, false);
 }
 
 const char *
 putName(const char *nme)
 {
        if (nme != NULL)
-               nme = findName(nme, strlen(nme), true);
+               nme = findName(nme, true);
        return nme;
 }
 
 const char *
 putNameLen(const char *nme, size_t len)
 {
-       return findName(nme, len, true);
+       char name[IDLENGTH + 1];
+       if (len > IDLENGTH)
+               len = IDLENGTH;
+       strcpy_len(name, nme, len + 1);
+       return findName(name, true);
 }
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to