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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list