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 -- [email protected]
To unsubscribe send an email to [email protected]