Changeset: 55fc817ec341 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/55fc817ec341
Modified Files:
gdk/gdk.h
gdk/gdk_bbp.c
Branch: multi-cachelock
Log Message:
introduce the general free list
diffs (90 lines):
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -947,7 +947,7 @@ typedef struct {
char physical[24]; /* dir + basename for storage */
#endif
bat next; /* next BBP slot in linked list */
- int pidx; /* preferred index of associated thread mask */
+ int pidx; /* preferred index of associated thread mask */
// TODO multi-cachelock 2) See if this can be removed or replaced by pid
int refs; /* in-memory references on which the loaded
status of a BAT relies */
int lrefs; /* logical references on which the existence of
a BAT relies */
ATOMIC_TYPE status; /* status mask used for spin locking */
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -121,10 +121,13 @@ static bat BBP_mask = 0; /* number of b
#else
#define threadmask(y) ((int) (mix_int(y) & BBP_THREADMASK))
#endif
+#define GENERAL_LIST_IDX (BBP_THREADMASK + 1)
+#define FREE_CHUNK_ALLOC_SIZE 10
static struct {
MT_Lock cache;
bat free;
-} GDKbbpLock[BBP_THREADMASK + 1];
+} GDKbbpLock[GENERAL_LIST_IDX + 1]; // last GDKbbpLock, i.e.
GDKbbpLock[GENERAL_LIST_IDX], is the general free list
+
#define GDKcacheLock(y) GDKbbpLock[y].cache
#define BBP_free(y) GDKbbpLock[y].free
@@ -2450,7 +2453,27 @@ BBPgetsubdir(str s, bat i)
*/
static gdk_return
maybeextend(int idx) {
- /* release the current gdkcachelock first to avoid dealocks when
extending the common pool */
+ MT_lock_set(&GDKcacheLock(GENERAL_LIST_IDX));
+ if (BBP_free(GENERAL_LIST_IDX) > 0) {
+ /* take a chunk out of the general free list on top of my own
free list */
+ int i = 1;
+ bat cf = BBP_free(GENERAL_LIST_IDX);
+ BBP_pidx(cf) = idx;
+ while (BBP_next(cf) && i < FREE_CHUNK_ALLOC_SIZE) {
+ cf = BBP_next(cf);
+ BBP_pidx(cf) = idx;
+ i++;
+ }
+ BBP_free(GENERAL_LIST_IDX) = BBP_next(cf);
+ MT_lock_unset(&GDKcacheLock(GENERAL_LIST_IDX));
+ BBP_next(cf) = 0;
+ BBP_free(idx) = cf;
+ return GDK_SUCCEED;
+ }
+ /* there wasn't anything left on the general free list */
+ MT_lock_unset(&GDKcacheLock(GENERAL_LIST_IDX));
+
+ /* release the current gdkcachelock first to avoid deadlocks when
extending the common pool */
MT_lock_unset(&GDKcacheLock(idx));
MT_lock_set(&BBPnameLock);
MT_lock_set(&GDKcacheLock(idx));
@@ -2463,9 +2486,9 @@ maybeextend(int idx) {
bat size = (bat) ATOMIC_GET(&BBPsize);
/* if the common pool has no more space, extend it */
- if (size >= BBPlimit) {
+ if (size + FREE_CHUNK_ALLOC_SIZE > BBPlimit) {
/* extend the common pool */
- gdk_return r = BBPextend(true, size + 1);
+ gdk_return r = BBPextend(true, size + FREE_CHUNK_ALLOC_SIZE);
if (r != GDK_SUCCEED) {
MT_lock_unset(&BBPnameLock);
return GDK_FAIL;
@@ -2473,10 +2496,14 @@ maybeextend(int idx) {
}
/* extend the thread list */
- BBP_free(idx) = size;
- BBP_pidx(size) = idx;
-
- ATOMIC_SET(&BBPsize, size + 1);
+ BBP_free(idx) = size;
+ BBP_pidx(size) = idx;
+ for (bat i = size + 1; i < (size + FREE_CHUNK_ALLOC_SIZE); i++) {
+ BBP_next(i - 1) = i;
+ BBP_pidx(i) = idx;
+ }
+
+ ATOMIC_SET(&BBPsize, size + FREE_CHUNK_ALLOC_SIZE);
MT_lock_unset(&BBPnameLock);
return GDK_SUCCEED;
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]