Changeset: 78eedfbc52a4 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/78eedfbc52a4
Modified Files:
        gdk/gdk_logger.c
        gdk/gdk_logger_internals.h
Branch: logger-fix
Log Message:

use rotation_lock instead of atomic_ptr


diffs (102 lines):

diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -2136,7 +2136,6 @@ log_load(int debug, const char *fn, cons
        logbat_destroy(lg->dseqs);
        ATOMIC_DESTROY(&lg->current->refcount);
        ATOMIC_DESTROY(&lg->nr_flushers);
-       ATOMIC_PTR_DESTROY(&lg->flush_ranges);
        MT_lock_destroy(&lg->lock);
        MT_lock_destroy(&lg->rotation_lock);
        GDKfree(lg->fn);
@@ -2206,7 +2205,6 @@ log_new(int debug, const char *fn, const
        MT_lock_init(&lg->flush_lock, "flush_lock");
        MT_cond_init(&lg->excl_flush_cv);
        ATOMIC_INIT(&lg->nr_flushers, 0);
-       ATOMIC_PTR_INIT(&lg->flush_ranges, NULL);
 
        if (log_load(debug, fn, logdir, lg, filename) == GDK_SUCCEED) {
                return lg;
@@ -2216,8 +2214,8 @@ log_new(int debug, const char *fn, const
 
 static logged_range*
 do_flush_range_cleanup(logger* lg) {
-
-       logged_range* frange = ATOMIC_PTR_GET(&lg->flush_ranges);
+       rotation_lock(lg);
+       logged_range* frange = lg->flush_ranges;
        logged_range* first = frange;
        
        while ( frange->next) {
@@ -2225,19 +2223,22 @@ do_flush_range_cleanup(logger* lg) {
                        break;
                frange = frange->next;
        }
-       if (first == frange)
+       if (first == frange) {
+               rotation_unlock(lg);
                return first;
+       }
 
        logged_range* flast = frange;
-       if (ATOMIC_PTR_CAS(&lg->flush_ranges, &first, flast)) {
-               for (frange = first; frange && frange != flast; frange = 
frange->next) {
-                       (void) ATOMIC_DEC(&frange->refcount);
-                       close_stream(frange->output_log);
-                       frange->output_log = NULL;
-                       frange = frange->next;
-               }
+
+       lg->flush_ranges = flast;
+       rotation_unlock(lg);
+
+       for (frange = first; frange && frange != flast; frange = frange->next) {
+               (void) ATOMIC_DEC(&frange->refcount);
+               close_stream(frange->output_log);
+               frange->output_log = NULL;
+               frange = frange->next;
        }
-       /* else some other flusher is cleaning up the flush ranges*/
 
        return flast;
 }
@@ -2248,7 +2249,7 @@ log_destroy(logger *lg)
        log_close_input(lg);
        logged_range* last = do_flush_range_cleanup(lg);
        (void) last;
-       assert(last == lg->current && last == (logged_range*) 
ATOMIC_PTR_GET(&lg->flush_ranges));
+       assert(last == lg->current && last == lg->flush_ranges);
        log_close_output(lg);
        for (logged_range *p = lg->pending; p; ){
                logged_range *n = p->next;
@@ -2288,7 +2289,6 @@ log_destroy(logger *lg)
        MT_lock_destroy(&lg->rotation_lock);
        MT_lock_destroy(&lg->flush_lock);
        ATOMIC_DESTROY(&lg->nr_flushers);
-       ATOMIC_PTR_DESTROY(&lg->flush_ranges);
        GDKfree(lg->fn);
        GDKfree(lg->dir);
        GDKfree(lg->buf);
@@ -2965,7 +2965,7 @@ gdk_return
 log_tflush(logger* lg, ulng log_file_id, ulng commit_ts) {
 
        if (lg->flushnow) {
-               logged_range* frange = ATOMIC_PTR_GET(&lg->flush_ranges);
+               logged_range* frange = lg->flush_ranges;
                assert(frange == lg->current);
                ulng end = ATOMIC_GET(&lg->current->end);
                assert(end > ATOMIC_GET(&lg->current->pend));
diff --git a/gdk/gdk_logger_internals.h b/gdk/gdk_logger_internals.h
--- a/gdk/gdk_logger_internals.h
+++ b/gdk/gdk_logger_internals.h
@@ -56,9 +56,9 @@ struct logger {
        
        // synchronized by rotation_lock
        logged_range *current;
+       logged_range *flush_ranges;
 
        // atomic
-       ATOMIC_PTR_TYPE flush_ranges;
        ATOMIC_TYPE             nr_flushers;
 
        // synchronized by store->flush
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to