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 -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org