Changeset: ae6edfa8ed6a for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ae6edfa8ed6a Modified Files: gdk/gdk_system.c gdk/gdk_system.h Branch: default Log Message:
Debug help: maintain last (un)locker of each lock. Only maintained when NDEBUG is not defined (i.e., no assertions). To be printed from the debugger by calling the function GDKlockstatistics. diffs (99 lines): diff --git a/gdk/gdk_system.c b/gdk/gdk_system.c --- a/gdk/gdk_system.c +++ b/gdk/gdk_system.c @@ -142,15 +142,17 @@ GDKlockstatistics(int what) return; } GDKlocklist = sortlocklist(GDKlocklist); + fprintf(stderr, "# lock name\tcount\tcontention\tsleep\tlocked\t(un)locker\n"); for (l = GDKlocklist; l; l = l->next) if (what == 0 || (what == 1 && l->count) || (what == 2 && l->contention) || (what == 3 && l->lock)) - fprintf(stderr, "#lock %-18s\t" SZFMT "\t" SZFMT "\t" SZFMT "%s\n", + fprintf(stderr, "# %-18s\t" SZFMT "\t" SZFMT "\t" SZFMT "\t%s\t%s\n", l->name ? l->name : "unknown", l->count, l->contention, l->sleep, - what != 3 && l->lock ? "\tlocked" : ""); + l->lock ? "locked" : "", + l->locker ? l->locker : ""); fprintf(stderr, "#total lock count " SZFMT "\n", (size_t) GDKlockcnt); fprintf(stderr, "#lock contention " SZFMT "\n", (size_t) GDKlockcontentioncnt); fprintf(stderr, "#lock sleep count " SZFMT "\n", (size_t) GDKlocksleepcnt); diff --git a/gdk/gdk_system.h b/gdk/gdk_system.h --- a/gdk/gdk_system.h +++ b/gdk/gdk_system.h @@ -205,12 +205,13 @@ typedef struct MT_Lock { size_t sleep; struct MT_Lock * volatile next; const char *name; + const char *locker; #endif } MT_Lock; #ifndef NDEBUG -#define MT_LOCK_INITIALIZER(name) = {0, 0, 0, 0, (struct MT_Lock *) -1, name} +#define MT_LOCK_INITIALIZER(name) = {0, 0, 0, 0, (struct MT_Lock *) -1, name, NULL} gdk_export void GDKlockstatistics(int); gdk_export MT_Lock * volatile GDKlocklist; @@ -219,6 +220,7 @@ gdk_export ATOMIC_TYPE volatile GDKlockc gdk_export ATOMIC_TYPE volatile GDKlockcontentioncnt; gdk_export ATOMIC_TYPE volatile GDKlocksleepcnt; #define _DBG_LOCK_COUNT_0(l, n) ATOMIC_INC(GDKlockcnt, dummy, n) +#define _DBG_LOCK_LOCKER(l, n) ((l)->locker = (n)) #define _DBG_LOCK_CONTENTION(l, n) \ do { \ TEMDEBUG fprintf(stderr, "#lock %s contention in %s\n", (l)->name, n); \ @@ -248,7 +250,8 @@ gdk_export ATOMIC_TYPE volatile GDKlocks #define _DBG_LOCK_INIT(l, n) \ do { \ (l)->count = (l)->contention = (l)->sleep = 0; \ - (l)->name = n; \ + (l)->name = (n); \ + _DBG_LOCK_LOCKER(l, NULL); \ while (ATOMIC_TAS(GDKlocklistlock, dummy, "") != 0) \ ; \ (l)->next = GDKlocklist; \ @@ -277,13 +280,14 @@ gdk_export ATOMIC_TYPE volatile GDKlocks #define MT_LOCK_INITIALIZER(name) = ATOMIC_FLAG_INIT -#define _DBG_LOCK_COUNT_0(l, n) ((void) n) -#define _DBG_LOCK_CONTENTION(l, n) ((void) n) -#define _DBG_LOCK_SLEEP(l, n) ((void) n) +#define _DBG_LOCK_COUNT_0(l, n) ((void) (n)) +#define _DBG_LOCK_CONTENTION(l, n) ((void) (n)) +#define _DBG_LOCK_SLEEP(l, n) ((void) (n)) #define _DBG_LOCK_COUNT_1(l) ((void) 0) #define _DBG_LOCK_COUNT_2(l) ((void) 0) -#define _DBG_LOCK_INIT(l, n) ((void) n) +#define _DBG_LOCK_INIT(l, n) ((void) (n)) #define _DBG_LOCK_DESTROY(l) ((void) 0) +#define _DBG_LOCK_LOCKER(l, n) ((void) (n)) #endif @@ -302,6 +306,7 @@ gdk_export ATOMIC_TYPE volatile GDKlocks } while (ATOMIC_TAS((l)->lock, dummy, n) != 0); \ _DBG_LOCK_COUNT_1(l); \ } \ + _DBG_LOCK_LOCKER(l, n); \ _DBG_LOCK_COUNT_2(l); \ } while (0) #define MT_lock_init(l, n) \ @@ -309,7 +314,11 @@ gdk_export ATOMIC_TYPE volatile GDKlocks ATOMIC_CLEAR((l)->lock, dummy, n); \ _DBG_LOCK_INIT(l, n); \ } while (0) -#define MT_lock_unset(l, n) ATOMIC_CLEAR((l)->lock, dummy, n) +#define MT_lock_unset(l, n) \ + do { \ + _DBG_LOCK_LOCKER(l, n); \ + ATOMIC_CLEAR((l)->lock, dummy, n); \ + } while (0) #define MT_lock_destroy(l) _DBG_LOCK_DESTROY(l) /* return 0 on success, -1 on failure to get the lock */ #define MT_lock_try(l) ((ATOMIC_TAS((l)->lock, dummy, dummy) == 0) - 1) _______________________________________________ checkin-list mailing list checkin-list@monetdb.org http://mail.monetdb.org/mailman/listinfo/checkin-list