summaryrefslogtreecommitdiff
path: root/rts/eventlog/EventLogWriter.c
diff options
context:
space:
mode:
Diffstat (limited to 'rts/eventlog/EventLogWriter.c')
-rw-r--r--rts/eventlog/EventLogWriter.c21
1 files changed, 20 insertions, 1 deletions
diff --git a/rts/eventlog/EventLogWriter.c b/rts/eventlog/EventLogWriter.c
index b19e617a4c..5387f932eb 100644
--- a/rts/eventlog/EventLogWriter.c
+++ b/rts/eventlog/EventLogWriter.c
@@ -28,6 +28,17 @@ static pid_t event_log_pid = -1;
// File for logging events
static FILE *event_log_file = NULL;
+#if defined(THREADED_RTS)
+// Protects event_log_file
+static Mutex event_log_mutex;
+
+static void acquire_event_log_lock(void) { ACQUIRE_LOCK(&event_log_mutex); }
+static void release_event_log_lock(void) { RELEASE_LOCK(&event_log_mutex); }
+#else
+static void acquire_event_log_lock(void) {}
+static void release_event_log_lock(void) {}
+#endif
+
static void initEventLogFileWriter(void);
static bool writeEventLogFile(void *eventlog, size_t eventlog_size);
static void flushEventLogFile(void);
@@ -89,6 +100,9 @@ initEventLogFileWriter(void)
}
stgFree(event_log_filename);
+#if defined(THREADED_RTS)
+ initMutex(&event_log_mutex);
+#endif
}
static bool
@@ -97,15 +111,17 @@ writeEventLogFile(void *eventlog, size_t eventlog_size)
unsigned char *begin = eventlog;
size_t remain = eventlog_size;
+ acquire_event_log_lock();
while (remain > 0) {
size_t written = fwrite(begin, 1, remain, event_log_file);
if (written == 0) {
+ release_event_log_lock();
return false;
}
remain -= written;
begin += written;
}
-
+ release_event_log_lock();
return true;
}
@@ -124,6 +140,9 @@ stopEventLogFileWriter(void)
fclose(event_log_file);
event_log_file = NULL;
}
+#if defined(THREADED_RTS)
+ closeMutex(&event_log_mutex);
+#endif
}
const EventLogWriter FileEventLogWriter = {