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