Changeset: a5c8604793b5 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a5c8604793b5 Modified Files: gdk/gdk_stalker.c Branch: mlogger Log Message:
Re-enabled mutexes (fixed locks) diffs (137 lines): diff --git a/gdk/gdk_stalker.c b/gdk/gdk_stalker.c --- a/gdk/gdk_stalker.c +++ b/gdk/gdk_stalker.c @@ -11,7 +11,8 @@ #include "gdk_stalker.h" pthread_t flushing_thread; -pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; +pthread_mutex_t stalker_mutex = PTHREAD_MUTEX_INITIALIZER; +pthread_mutex_t secondary_stalker_mutex = PTHREAD_MUTEX_INITIALIZER; // 0 -> stalker // 1 -> secondary_stalker @@ -178,18 +179,28 @@ gdk_return GDKstalker_log(LOG_LEVEL leve { // Select a stalker gdk_stalker *fill_stalker; + pthread_mutex_t mutex; + bool SWITCH_STALKER = true; + int bytes_written = 0; + if(ATOMIC_GET(&SELECTED_STALKER_ID) == stalker.id) + { fill_stalker = &stalker; + mutex = stalker_mutex; + } else + { fill_stalker = &secondary_stalker; - + mutex = secondary_stalker_mutex; + } + printf("Selected stalker -> %lu\n", fill_stalker->id); - // pthread_mutex_lock(&mutex); - // { + pthread_mutex_lock(&mutex); + { va_list va; va_start(va, fmt); - int bytes_written = _GDKstalker_fill_stalker(fill_stalker, fmt, va); + bytes_written = _GDKstalker_fill_stalker(fill_stalker, fmt, va); va_end(va); // The message fits the buffer OR the buffer is empty (we don't care if it fits - just cut it off) @@ -198,17 +209,29 @@ gdk_return GDKstalker_log(LOG_LEVEL leve { printf("Filling stalker %lu\n", fill_stalker->id); fill_stalker->allocated_size += bytes_written; + SWITCH_STALKER = false; + } + } + pthread_mutex_unlock(&mutex); + + if(SWITCH_STALKER) + { + printf("Flushing stalker %lu", fill_stalker->id); + + // Switch stalker + if(ATOMIC_GET(&SELECTED_STALKER_ID) == stalker.id) + { + fill_stalker = &secondary_stalker; + mutex = secondary_stalker_mutex; } else { - printf("Flushing stalker %lu", fill_stalker->id); - - // Switch stalker - if(ATOMIC_GET(&SELECTED_STALKER_ID) == stalker.id) - fill_stalker = &secondary_stalker; - else - fill_stalker = &stalker; - + fill_stalker = &stalker; + mutex = stalker_mutex; + } + + pthread_mutex_lock(&mutex); + { printf(" and filling stalker %lu\n", fill_stalker->id); // Flush current stalker @@ -233,10 +256,9 @@ gdk_return GDKstalker_log(LOG_LEVEL leve ATOMIC_SET(&SELECTED_STALKER_ID, fill_stalker->id); printf("Updated selected stalker to %lu\n", fill_stalker->id); } - // } - // pthread_mutex_lock(&mutex); - - + pthread_mutex_unlock(&mutex); + } + // Flush the current buffer in case the event is // important depending on the flush-level if(event_id >= (int) ATOMIC_GET(&CUR_FLUSH_LEVEL)) @@ -256,17 +278,24 @@ gdk_return GDKstalker_flush_buffer() { // Select a stalker gdk_stalker *fl_stalker; + pthread_mutex_t mutex; if(ATOMIC_GET(&SELECTED_STALKER_ID) == stalker.id) + { fl_stalker = &stalker; + mutex = stalker_mutex; + } else + { fl_stalker = &secondary_stalker; - + mutex = secondary_stalker_mutex; + } + // No reason to flush a buffer with no content if(fl_stalker->allocated_size == 0) return GDK_SUCCEED; - // pthread_mutex_lock(&mutex); - // { + pthread_mutex_lock(&mutex); + { fwrite(&fl_stalker->buffer, fl_stalker->allocated_size, 1, output_file); fflush(output_file); @@ -276,8 +305,8 @@ gdk_return GDKstalker_flush_buffer() // Reset buffer memset(fl_stalker->buffer, 0, BUFFER_SIZE); fl_stalker->allocated_size = 0; - // } - // pthread_mutex_unlock(&mutex); + } + pthread_mutex_unlock(&mutex); // Even if the existing file is full, the logger should not create // a new file in case GDKstalker_stop has been called _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list