Changeset: bc90f8a2b19d for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/bc90f8a2b19d
Modified Files:
monetdb5/mal/mal_namespace.c
Branch: Jun2023
Log Message:
One (biggish) malloc less. Also some cleanup.
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
@@ -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);
}
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]