aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/log.c24
-rw-r--r--src/nvim/main.c1
-rw-r--r--src/nvim/msgpack_rpc/channel.c3
3 files changed, 26 insertions, 2 deletions
diff --git a/src/nvim/log.c b/src/nvim/log.c
index 3575f49e78..08b6d0483e 100644
--- a/src/nvim/log.c
+++ b/src/nvim/log.c
@@ -16,29 +16,49 @@
#define USR_LOG_FILE "$HOME/.nvimlog"
+static uv_mutex_t mutex;
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "log.c.generated.h"
#endif
+void log_init(void)
+{
+ uv_mutex_init(&mutex);
+}
+
+void log_lock(void)
+{
+ uv_mutex_lock(&mutex);
+}
+
+void log_unlock(void)
+{
+ uv_mutex_unlock(&mutex);
+}
+
bool do_log(int log_level, const char *func_name, int line_num, bool eol,
const char* fmt, ...) FUNC_ATTR_UNUSED
{
+ log_lock();
+ bool ret = false;
FILE *log_file = open_log_file();
if (log_file == NULL) {
- return false;
+ goto end;
}
va_list args;
va_start(args, fmt);
- bool ret = v_do_log_to_file(log_file, log_level, func_name, line_num, eol,
+ ret = v_do_log_to_file(log_file, log_level, func_name, line_num, eol,
fmt, args);
va_end(args);
if (log_file != stderr && log_file != stdout) {
fclose(log_file);
}
+end:
+ log_unlock();
return ret;
}
diff --git a/src/nvim/main.c b/src/nvim/main.c
index 3e096ee190..dd2b813b1c 100644
--- a/src/nvim/main.c
+++ b/src/nvim/main.c
@@ -177,6 +177,7 @@ void event_teardown(void)
/// Needed for unit tests. Must be called after `time_init()`.
void early_init(void)
{
+ log_init();
fs_init();
handle_init();
diff --git a/src/nvim/msgpack_rpc/channel.c b/src/nvim/msgpack_rpc/channel.c
index 45e78d6e79..34ff7c6374 100644
--- a/src/nvim/msgpack_rpc/channel.c
+++ b/src/nvim/msgpack_rpc/channel.c
@@ -825,6 +825,7 @@ static void log_server_msg(uint64_t channel_id,
msgpack_unpack_next(&unpacked, packed->data, packed->size, NULL);
uint64_t type = unpacked.data.via.array.ptr[0].via.u64;
DLOGN("[msgpack-rpc] nvim -> client(%" PRIu64 ") ", channel_id);
+ log_lock();
FILE *f = open_log_file();
fprintf(f, type ? (type == 1 ? RES : NOT) : REQ);
log_msg_close(f, unpacked.data);
@@ -836,6 +837,7 @@ static void log_client_msg(uint64_t channel_id,
msgpack_object msg)
{
DLOGN("[msgpack-rpc] client(%" PRIu64 ") -> nvim ", channel_id);
+ log_lock();
FILE *f = open_log_file();
fprintf(f, is_request ? REQ : RES);
log_msg_close(f, msg);
@@ -847,6 +849,7 @@ static void log_msg_close(FILE *f, msgpack_object msg)
fputc('\n', f);
fflush(f);
fclose(f);
+ log_unlock();
}
#endif