Changeset: c71f48705069 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/c71f48705069
Modified Files:
gdk/gdk_bbp.c
gdk/gdk_private.h
gdk/gdk_storage.c
gdk/gdk_utils.c
monetdb5/modules/mal/mal_mapi.c
Branch: default
Log Message:
Use condition variables instead of spinning to wait for status change.
diffs (truncated from 306 to 300 lines):
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -2889,13 +2889,10 @@ incref(bat i, bool logical, bool lock)
return 0;
if (lock) {
- for (;;) {
- MT_lock_set(&GDKswapLock(i));
- if (!(BBP_status(i) & (BBPUNSTABLE|BBPLOADING)))
- break;
+ MT_lock_set(&GDKswapLock(i));
+ while (BBP_status(i) & (BBPUNSTABLE|BBPLOADING)) {
/* the BATs is "unstable", try again */
- MT_lock_unset(&GDKswapLock(i));
- BBPspin(i, __func__, BBPUNSTABLE|BBPLOADING);
+ MT_cond_wait(&GDKswapCond(i), &GDKswapLock(i));
}
}
/* we have the lock */
@@ -2958,15 +2955,12 @@ decref(bat i, bool logical, bool lock, c
if (BBPcheck(i) == 0)
return -1;
- if (lock)
+ if (lock) {
MT_lock_set(&GDKswapLock(i));
-
- while (BBP_status(i) & BBPUNLOADING) {
- if (lock)
- MT_lock_unset(&GDKswapLock(i));
+ while (BBP_status(i) & BBPUNLOADING)
+ MT_cond_wait(&GDKswapCond(i), &GDKswapLock(i));
+ } else {
BBPspin(i, func, BBPUNLOADING);
- if (lock)
- MT_lock_set(&GDKswapLock(i));
}
b = (BBP_status(i) & BBPLOADED) ? BBP_desc(i) : NULL;
@@ -3084,6 +3078,7 @@ decref(bat i, bool logical, bool lock, c
BBPclear(i);
} else {
BBP_status_off(i, BBPUNLOADING);
+ MT_cond_broadcast(&GDKswapCond(i));
}
}
return refs;
@@ -3131,13 +3126,10 @@ BATdescriptor(bat i)
if (BBPcheck(i)) {
bool lock = locked_by == 0 || locked_by != MT_getpid();
if (lock) {
- for (;;) {
- MT_lock_set(&GDKswapLock(i));
- if (!(BBP_status(i) & (BBPUNSTABLE|BBPLOADING)))
- break;
+ MT_lock_set(&GDKswapLock(i));
+ while (BBP_status(i) & (BBPUNSTABLE|BBPLOADING)) {
/* the BATs is "unstable", try again */
- MT_lock_unset(&GDKswapLock(i));
- BBPspin(i, __func__, BBPUNSTABLE|BBPLOADING);
+ MT_cond_wait(&GDKswapCond(i), &GDKswapLock(i));
}
}
if (incref(i, false, false) > 0) {
@@ -3179,9 +3171,7 @@ getBBPdescriptor(bat i)
b = BBP_desc(i);
if ((status & BBPLOADED) == 0 || status & BBPWAITING) {
while (BBP_status(i) & BBPWAITING) { /* wait for bat to be
loaded by other thread */
- MT_lock_unset(&GDKswapLock(i));
- BBPspin(i, __func__, BBPWAITING);
- MT_lock_set(&GDKswapLock(i));
+ MT_cond_wait(&GDKswapCond(i), &GDKswapLock(i));
}
if (BBPvalid(i)) {
if ((BBP_status(i) & BBPLOADED) == 0) {
@@ -3199,6 +3189,7 @@ getBBPdescriptor(bat i)
BBP_status_off(i, BBPLOADING);
CHECKDEBUG if (b != NULL)
BATassertProps(b);
+ MT_cond_broadcast(&GDKswapCond(i));
}
return b;
}
@@ -3232,9 +3223,13 @@ BBPsave(BAT *b)
if (BBP_status(bid) & BBPSAVING) {
/* wait until save in other thread completes */
- if (lock)
+ if (lock) {
+ while (BBP_status(bid) & BBPSAVING)
+ MT_cond_wait(&GDKswapCond(bid),
&GDKswapLock(bid));
MT_lock_unset(&GDKswapLock(bid));
- BBPspin(bid, __func__, BBPSAVING);
+ } else {
+ BBPspin(bid, __func__, BBPSAVING);
+ }
} else {
/* save it */
unsigned flags = BBPSAVING;
@@ -3261,6 +3256,7 @@ BBPsave(BAT *b)
}
/* clearing bits can be done without the lock */
BBP_status_off(bid, BBPSAVING);
+ MT_cond_broadcast(&GDKswapCond(bid));
}
return ret;
}
@@ -3318,6 +3314,7 @@ BBPfree(BAT *b)
}
TRC_DEBUG(BAT_, "turn off unloading %d\n", bid);
BBP_status_off(bid, BBPUNLOADING);
+ MT_cond_broadcast(&GDKswapCond(bid));
BBP_unload_dec();
return ret;
}
@@ -3344,8 +3341,9 @@ BBPquickdesc(bat bid)
}
return NULL;
}
- BBPspin(bid, __func__, BBPWAITING);
+// BBPspin(bid, __func__, BBPWAITING);
b = BBP_desc(bid);
+ MT_lock_set(&b->theaplock);
if (b->ttype < 0) {
const char *aname = ATOMunknown_name(b->ttype);
int tt = ATOMindex(aname);
@@ -3356,6 +3354,7 @@ BBPquickdesc(bat bid)
b->ttype = tt;
}
}
+ MT_lock_unset(&b->theaplock);
return b;
}
@@ -3363,25 +3362,31 @@ BBPquickdesc(bat bid)
* @+ Global Commit
*/
static BAT *
-dirty_bat(bat *i, bool subcommit)
+dirty_bat(bat *i, bool subcommit, bool lock)
{
- if (BBPvalid(*i)) {
+ const bat bid = *i;
+ if (BBPvalid(bid)) {
BAT *b;
- BBPspin(*i, __func__, BBPSAVING);
- if (BBP_status(*i) & BBPLOADED) {
- b = BBP_desc(*i);
+ if (lock) {
+ while (BBP_status(bid) & BBPSAVING)
+ MT_cond_wait(&GDKswapCond(bid),
&GDKswapLock(bid));
+ } else {
+ BBPspin(bid, __func__, BBPSAVING);
+ }
+ if (BBP_status(bid) & BBPLOADED) {
+ b = BBP_desc(bid);
MT_lock_set(&b->theaplock);
- if ((BBP_status(*i) & BBPNEW) &&
+ if ((BBP_status(bid) & BBPNEW) &&
BATcheckmodes(b, false) != GDK_SUCCEED) /* check
mmap modes */
- *i = -*i; /* error */
- else if ((BBP_status(*i) & BBPPERSISTENT) &&
+ *i = -bid; /* error */
+ else if ((BBP_status(bid) & BBPPERSISTENT) &&
(subcommit || BATdirty(b))) {
MT_lock_unset(&b->theaplock);
return b; /* the bat is loaded,
persistent and dirty */
}
MT_lock_unset(&b->theaplock);
} else if (subcommit)
- return BBP_desc(*i);
+ return BBP_desc(bid);
}
return NULL;
}
@@ -3829,12 +3834,11 @@ BBPsync(int cnt, bat *restrict subcommit
BBP_status_on(bid, BBPSYNCING);
/* wait until unloading is finished before
* attempting to make a backup */
- while (BBP_status(bid) & BBPUNLOADING) {
- if (lock)
- MT_lock_unset(&GDKswapLock(bid));
+ if (lock) {
+ while (BBP_status(bid) & BBPUNLOADING)
+ MT_cond_wait(&GDKswapCond(bid),
&GDKswapLock(bid));
+ } else {
BBPspin(bid, __func__, BBPUNLOADING);
- if (lock)
- MT_lock_set(&GDKswapLock(bid));
}
BAT *b = BBP_desc(bid);
if (subcommit && b->ttype != TYPE_void) {
@@ -3871,7 +3875,7 @@ BBPsync(int cnt, bat *restrict subcommit
fname, BAKDIR, SUBDIR);
}
}
- b = dirty_bat(&i, subcommit != NULL);
+ b = dirty_bat(&i, subcommit != NULL, lock);
if (i <= 0)
ret = GDK_FAIL;
else if (BBP_status(bid) & BBPEXISTING &&
@@ -3912,13 +3916,11 @@ BBPsync(int cnt, bat *restrict subcommit
* can set it, wait for
* BBPUNLOADING before
* attempting to save */
- for (;;) {
- if (lock)
- MT_lock_set(&GDKswapLock(i));
- if (!(BBP_status(i) &
(BBPSAVING|BBPUNLOADING)))
- break;
- if (lock)
- MT_lock_unset(&GDKswapLock(i));
+ if (lock) {
+ MT_lock_set(&GDKswapLock(i));
+ while (BBP_status(i) &
(BBPSAVING|BBPUNLOADING))
+ MT_cond_wait(&GDKswapCond(i),
&GDKswapLock(i));
+ } else {
BBPspin(i, __func__,
BBPSAVING|BBPUNLOADING);
}
BBP_status_on(i, BBPSAVING);
@@ -3926,6 +3928,7 @@ BBPsync(int cnt, bat *restrict subcommit
MT_lock_unset(&GDKswapLock(i));
ret = BATsave_iter(b, &bi, size);
BBP_status_off(i, BBPSAVING);
+ MT_cond_broadcast(&GDKswapCond(i));
}
bip = &bi;
} else {
@@ -4007,6 +4010,7 @@ BBPsync(int cnt, bat *restrict subcommit
for (int idx = 1; idx < cnt; idx++) {
bat i = subcommit ? subcommit[idx] : idx;
BBP_status_off(i, BBPSYNCING);
+ MT_cond_broadcast(&GDKswapCond(i));
}
return ret;
diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h
--- a/gdk/gdk_private.h
+++ b/gdk/gdk_private.h
@@ -400,6 +400,7 @@ struct Strimps {
typedef struct {
MT_Lock swap;
+ MT_Cond cond;
} batlock_t;
typedef char long_str[IDLENGTH]; /* standard GDK static string */
@@ -433,6 +434,7 @@ extern size_t GDK_mmap_pagesize; /* mmap
} while (0)
#define GDKswapLock(x) GDKbatLock[(x)&BBP_BATMASK].swap
+#define GDKswapCond(x) GDKbatLock[(x)&BBP_BATMASK].cond
#define HEAPREMOVE ((ATOMIC_BASE_TYPE) 1 << (sizeof(ATOMIC_BASE_TYPE) * 8
- 1))
#define DELAYEDREMOVE ((ATOMIC_BASE_TYPE) 1 << (sizeof(ATOMIC_BASE_TYPE) * 8
- 2))
diff --git a/gdk/gdk_storage.c b/gdk/gdk_storage.c
--- a/gdk/gdk_storage.c
+++ b/gdk/gdk_storage.c
@@ -620,7 +620,7 @@ GDKload(int farmid, const char *nme, con
static BAT *
DESCload(int i)
{
- const char *s, *nme = BBP_physical(i);
+ const char *nme = BBP_physical(i);
BAT *b = NULL;
int tt;
@@ -636,7 +636,8 @@ DESCload(int i)
MT_lock_set(&b->theaplock);
tt = b->ttype;
if (tt < 0) {
- if ((tt = ATOMindex(s = ATOMunknown_name(tt))) < 0) {
+ const char *s = ATOMunknown_name(tt);
+ if ((tt = ATOMindex(s)) < 0) {
MT_lock_unset(&b->theaplock);
GDKerror("atom '%s' unknown, in BAT '%s'.\n", s, nme);
return NULL;
diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c
--- a/gdk/gdk_utils.c
+++ b/gdk/gdk_utils.c
@@ -1016,6 +1016,7 @@ GDKinit(opt *set, int setlen, bool embed
char name[MT_NAME_LEN];
snprintf(name, sizeof(name), "GDKswapLock%d", i);
MT_lock_init(&GDKbatLock[i].swap, name);
+ MT_cond_init(&GDKbatLock[i].cond, name);
}
if (mnstr_init() < 0) {
TRC_CRITICAL(GDK, "mnstr_init failed\n");
diff --git a/monetdb5/modules/mal/mal_mapi.c b/monetdb5/modules/mal/mal_mapi.c
--- a/monetdb5/modules/mal/mal_mapi.c
+++ b/monetdb5/modules/mal/mal_mapi.c
@@ -2012,12 +2012,10 @@ SERVERput(Client cntxt, MalBlkPtr mb, Ma
/* generate a tuple batch */
/* and reload it into the proper format */
str ht, tt;
- BAT *b = BBPquickdesc(BBPindex(*nme));
size_t len;
- if (!b)
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]