Changeset: 15d7756b3676 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/15d7756b3676
Modified Files:
        monetdb5/modules/atoms/str.c
        monetdb5/modules/atoms/str.h
        monetdb5/modules/kernel/batstr.c
Branch: Jul2021
Log Message:

Don't lock/unlock the case's from hash at every iteration


diffs (134 lines):

diff --git a/monetdb5/modules/atoms/str.c b/monetdb5/modules/atoms/str.c
--- a/monetdb5/modules/atoms/str.c
+++ b/monetdb5/modules/atoms/str.c
@@ -3165,23 +3165,37 @@ UTF8_offset(char *restrict s, int n)
        return s;
 }
 
-static str
+str
+str_case_hash_lock(bool upper)
+{
+       BAT *b = upper ? UTF8_toUpperFrom : UTF8_toLowerFrom;
+
+       if (BAThash(b) != GDK_SUCCEED)
+               throw(MAL, "str.str_case_hash_lock", GDK_EXCEPTION);
+       MT_rwlock_rdlock(&b->thashlock);
+       return MAL_SUCCEED;
+}
+
+void
+str_case_hash_unlock(bool upper)
+{
+       BAT *b = upper ? UTF8_toUpperFrom : UTF8_toLowerFrom;
+       MT_rwlock_rdunlock(&b->thashlock);
+}
+
+static inline str
 convertCase(BAT *from, BAT *to, str *buf, size_t *buflen, const char *src, 
const char *malfunc)
 {
        size_t len = strlen(src);
        char *dst;
        const char *end = src + len;
        bool lower_to_upper = from == UTF8_toUpperFrom;
-       Hash *h;
+       Hash *h = from->thash;
        size_t nextlen = len + 1;
 
        /* the from and to bats are not views */
        assert(from->tbaseoff == 0);
        assert(to->tbaseoff == 0);
-       if (BAThash(from) != GDK_SUCCEED)
-               throw(MAL, malfunc, SQLSTATE(HY013) MAL_MALLOC_FAIL);
-       MT_rwlock_rdlock(&from->thashlock);
-       h = from->thash;
        CHECK_STR_BUFFER_LENGTH(buf, buflen, nextlen, malfunc);
        dst = *buf;
        while (src < end) {
@@ -3221,7 +3235,6 @@ convertCase(BAT *from, BAT *to, str *buf
                UTF8_PUTCHAR(c, dst);
        }
        *dst = 0;
-       MT_rwlock_rdunlock(&from->thashlock);
        return MAL_SUCCEED;
 illegal:
        throw(MAL, malfunc, SQLSTATE(42000) "Illegal Unicode code point");
@@ -3539,7 +3552,13 @@ STRLower(str *res, const str *arg1)
                *res = NULL;
                if (!(buf = GDKmalloc(buflen)))
                        throw(MAL, "str.lower", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
-               if ((msg = str_lower(&buf, &buflen, s)) != MAL_SUCCEED) {
+               if ((msg = str_case_hash_lock(false))) {
+                       GDKfree(buf);
+                       return msg;
+               }
+               msg = str_lower(&buf, &buflen, s);
+               str_case_hash_unlock(false);
+               if (msg != MAL_SUCCEED) {
                        GDKfree(buf);
                        return msg;
                }
@@ -3571,7 +3590,13 @@ STRUpper(str *res, const str *arg1)
                *res = NULL;
                if (!(buf = GDKmalloc(buflen)))
                        throw(MAL, "str.upper", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
-               if ((msg = str_upper(&buf, &buflen, s)) != MAL_SUCCEED) {
+               if ((msg = str_case_hash_lock(true))) {
+                       GDKfree(buf);
+                       return msg;
+               }
+               msg = str_upper(&buf, &buflen, s);
+               str_case_hash_unlock(true);
+               if (msg != MAL_SUCCEED) {
                        GDKfree(buf);
                        return msg;
                }
diff --git a/monetdb5/modules/atoms/str.h b/monetdb5/modules/atoms/str.h
--- a/monetdb5/modules/atoms/str.h
+++ b/monetdb5/modules/atoms/str.h
@@ -120,8 +120,14 @@ extern str str_suffix(str *buf, size_t *
 extern str str_repeat(str *buf, size_t *buflen, str s, int c)
 __attribute__((__visibility__("hidden")));
 
+extern str str_case_hash_lock(bool upper)
+__attribute__((__visibility__("hidden")));
+extern void str_case_hash_unlock(bool upper)
+__attribute__((__visibility__("hidden")));
+/* Make sure the UTF8_toLowerFrom hash is locked! */
 extern str str_lower(str *buf, size_t *buflen, str s)
 __attribute__((__visibility__("hidden")));
+/* Make sure the UTF8_toUpperFrom hash is locked! */
 extern str str_upper(str *buf, size_t *buflen, str s)
 __attribute__((__visibility__("hidden")));
 
diff --git a/monetdb5/modules/kernel/batstr.c b/monetdb5/modules/kernel/batstr.c
--- a/monetdb5/modules/kernel/batstr.c
+++ b/monetdb5/modules/kernel/batstr.c
@@ -1449,13 +1449,25 @@ bailout:
 static str
 STRbatLower(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
 {
-       return do_batstr_str(cntxt, mb, stk, pci, "batstr.lower", str_lower);
+       str msg = MAL_SUCCEED;
+
+       if ((msg = str_case_hash_lock(false)))
+               return msg;
+       msg = do_batstr_str(cntxt, mb, stk, pci, "batstr.lower", str_lower);
+       str_case_hash_unlock(false);
+       return msg;
 }
 
 static str
 STRbatUpper(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
 {
-       return do_batstr_str(cntxt, mb, stk, pci, "batstr.upper", str_upper);
+       str msg = MAL_SUCCEED;
+
+       if ((msg = str_case_hash_lock(true)))
+               return msg;
+       msg = do_batstr_str(cntxt, mb, stk, pci, "batstr.upper", str_upper);
+       str_case_hash_unlock(true);
+       return msg;
 }
 
 static str
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to