Changeset: 4e3fdb89ad5e for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=4e3fdb89ad5e
Modified Files:
        gdk/gdk_bbp.c
        gdk/gdk_private.h
Branch: Feb2013
Log Message:

Reduce locking contention.
The code was all there, but at least on my Fedora 18 box it didn't
work.  All thread IDs as returned by MT_getpid() end in 0x701.  If you
then use the low order 6 bits to divide the threads over buckets, they
all end up in the same bucket.  We now use a proper hash of the thread
ID.


diffs (72 lines):

diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -1621,7 +1621,7 @@ BBPinsert(BATstore *bs)
        const char *s;
        long_str dirname;
        bat i;
-       int idx = (int) (pid & BBP_THREADMASK);
+       int idx = threadmask(pid);
 
        assert(bs->B.H != NULL);
        assert(bs->B.T != NULL);
@@ -1830,7 +1830,7 @@ BBPclear(bat i)
        int lock = locked_by ? pid != locked_by : 1;
 
        if (BBPcheck(i, "BBPclear")) {
-               bbpclear(ABS(i), (int) (pid & BBP_THREADMASK), lock ? 
"BBPclear" : NULL);
+               bbpclear(ABS(i), threadmask(pid), lock ? "BBPclear" : NULL);
        }
 }
 
@@ -1879,7 +1879,7 @@ BBPrename(bat bid, const char *nme)
        if (strlen(dirname) + strLen(nme) + 1 >= IDLENGTH) {
                return BBPRENAME_LONG;
        }
-       idx = (int) (MT_getpid() & BBP_THREADMASK);
+       idx = threadmask(MT_getpid());
        MT_lock_set(&GDKtrimLock(idx), "BBPrename");
        MT_lock_set(&GDKnameLock, "BBPrename");
        i = BBP_find(nme, FALSE);
@@ -2911,9 +2911,10 @@ BBPcold(bat i)
                i = -i;
        if (BBPcheck(i, "BBPcold")) {
                MT_Id pid = MT_getpid();
+               int idx = threadmask(pid);
                int lock = locked_by ? pid != locked_by : 1;
 
-               MT_lock_set(&GDKtrimLock(pid), "BBPcold");
+               MT_lock_set(&GDKtrimLock(idx), "BBPcold");
                if (lock)
                        MT_lock_set(&GDKswapLock(i), "BBPcold");
                /* make very cold and insert on top of trim list */
@@ -2926,7 +2927,7 @@ BBPcold(bat i)
                }
                if (lock)
                        MT_lock_unset(&GDKswapLock(i), "BBPcold");
-               MT_lock_unset(&GDKtrimLock(pid), "BBPcold");
+               MT_lock_unset(&GDKtrimLock(idx), "BBPcold");
        }
 }
 
diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h
--- a/gdk/gdk_private.h
+++ b/gdk/gdk_private.h
@@ -125,9 +125,14 @@ extern MT_Lock MT_system_lock;
 
 #define GDKswapLock(x)  GDKbatLock[(x)&BBP_BATMASK].swap
 #define GDKhashLock(x)  GDKbatLock[(x)&BBP_BATMASK].hash
-#define GDKtrimLock(y)  GDKbbpLock[(y)&BBP_THREADMASK].trim
-#define GDKcacheLock(y) GDKbbpLock[(y)&BBP_THREADMASK].alloc
-#define BBP_free(y)    GDKbbpLock[(y)&BBP_THREADMASK].free
+#if SIZEOF_SIZE_T == 8
+#define threadmask(y)  ((int) ((mix_int((unsigned int) y) ^ mix_int((unsigned 
int) (y >> 32))) & BBP_THREADMASK))
+#else
+#define threadmask(y)  ((int) (mix_int(y) & BBP_THREADMASK))
+#endif
+#define GDKtrimLock(y) GDKbbpLock[y].trim
+#define GDKcacheLock(y)        GDKbbpLock[y].alloc
+#define BBP_free(y)    GDKbbpLock[y].free
 
 #define SORTloop_TYPE(b, p, q, tl, th, TYPE)                           \
        if (!BATtordered(b))                                            \
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to