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

Reply via email to