diff options
Diffstat (limited to 'rts/eventlog/EventLogWriter.c')
-rw-r--r-- | rts/eventlog/EventLogWriter.c | 21 |
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 = { |