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