Changeset: 80be6b7adaf4 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/80be6b7adaf4
Branch: default
Log Message:

Merge with Jun2023 branch.


diffs (173 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
@@ -23,21 +23,23 @@
 MT_Lock mal_namespaceLock = MT_LOCK_INITIALIZER(mal_namespaceLock);
 
 /* taken from gdk_atoms */
-#define NME_HASH(_key,y,K)                                                     
        \
-       do {                                                                    
                        \
-               size_t _i;                                                      
                        \
-               for (_i = y = 0; _i < K && _key[_i]; _i++) {    \
-                       y += _key[_i];                                          
                \
-                       y += (y << 10);                                         
                \
-                       y ^= (y >> 6);                                          
                \
-               }                                                               
                                \
-               y += (y << 3);                                                  
                \
-               y ^= (y >> 11);                                                 
                \
-               y += (y << 15);                                                 
                \
-               y = y & HASHMASK;                                               
                \
-       } while (0)
+static inline size_t __attribute__((__pure__))
+nme_hash(const char *key, size_t len)
+{
+       size_t y = 0;
 
-typedef struct NAME{
+       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;
+}
+
+typedef struct NAME {
        struct NAME *next;
        char nme[IDLENGTH + 1];
        unsigned short length;
@@ -51,15 +53,18 @@ static struct namespace {
        struct namespace *next;
        int count;
        struct NAME data[4096];
-} *namespace;
+} namespace1, *namespace = &namespace1;
 
-void initNamespace(void) {
-       namespace = NULL;
+void
+initNamespace(void)
+{
        optimizerRef = putName("optimizer");
        totalRef = putName("total");
 }
 
-void mal_namespace_reset(void) {
+void
+mal_namespace_reset(void)
+{
        struct namespace *ns;
 
        /* assume we are at the end of the server session */
@@ -67,9 +72,13 @@ void mal_namespace_reset(void) {
        memset(hash, 0, sizeof(hash));
        while (namespace) {
                ns = namespace->next;
-               GDKfree(namespace);
+               if (namespace != &namespace1)
+                       GDKfree(namespace);
                namespace = ns;
        }
+       namespace1.count = 0;
+       namespace1.next = NULL;
+       namespace = &namespace1;
        MT_lock_unset(&mal_namespaceLock);
 }
 
@@ -80,7 +89,8 @@ void mal_namespace_reset(void) {
  * is conflict free.
  */
 
-static const char *findName(const char *nme, size_t len, bool allocate)
+static const char *
+findName(const char *nme, size_t len, bool allocate)
 {
        NamePtr *n, m;
        size_t key;
@@ -91,31 +101,13 @@ static const char *findName(const char *
        if (len > IDLENGTH) {
                len = IDLENGTH;
        }
-       NME_HASH(nme, key, len);
+       key = nme_hash(nme, len);
        MT_lock_set(&mal_namespaceLock);
        for (n = &hash[key]; *n; n = &(*n)->next) {
-#ifdef KEEP_SORTED
-               /* keep each list sorted on length, then name */
-               if (len < (*n)->length)
-                       continue;
-               if (len == (*n)->length) {
-                       int c;
-                       if ((c = strncmp(nme, (*n)->nme, len)) < 0)
-                               continue;
-                       if (c == 0) {
-                               MT_lock_unset(&mal_namespaceLock);
-                               return (*n)->nme;
-                       }
-                       break;
-               }
-               break;
-#else
-               /* append entries to list */
                if (len == (*n)->length && strncmp(nme, (*n)->nme, len) == 0) {
                        MT_lock_unset(&mal_namespaceLock);
                        return (*n)->nme;
                }
-#endif
        }
        /* item not found */
        if (!allocate) {
@@ -127,7 +119,6 @@ static const char *findName(const char *
                if (ns == NULL) {
                        /* error we cannot recover from */
                        GDKfatal(MAL_MALLOC_FAIL);
-                       exit(1);
                }
                ns->next = namespace;
                ns->count = 0;
@@ -140,23 +131,33 @@ static const char *findName(const char *
        m->next = *n;
        *n = m;
        MT_lock_unset(&mal_namespaceLock);
-       return (*n)->nme;
+       return m->nme;
 }
 
-const char *getName(const char *nme) {
-       return findName(nme, nme?strlen(nme):0, false);
+const char *
+getName(const char *nme)
+{
+       if (nme != NULL)
+               nme = findName(nme, strlen(nme), false);
+       return nme;
 }
 
-const char *getNameLen(const char *nme, size_t len)
+const char *
+getNameLen(const char *nme, size_t len)
 {
        return findName(nme, len, false);
 }
 
-const char *putName(const char *nme) {
-       return findName(nme, nme?strlen(nme):0, true);
+const char *
+putName(const char *nme)
+{
+       if (nme != NULL)
+               nme = findName(nme, strlen(nme), true);
+       return nme;
 }
 
-const char *putNameLen(const char *nme, size_t len)
+const char *
+putNameLen(const char *nme, size_t len)
 {
        return findName(nme, len, true);
 }
diff --git a/sql/test/BugTracker-2023/Tests/SingleServer 
b/sql/test/BugTracker-2023/Tests/SingleServer
new file mode 100644
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to