diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/nvim/log.c | 24 | ||||
| -rw-r--r-- | src/nvim/main.c | 1 | ||||
| -rw-r--r-- | src/nvim/msgpack_rpc/channel.c | 3 | 
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  | 
