|
|
|
@ -31,7 +31,7 @@ |
|
|
|
|
* |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
#include <list> |
|
|
|
|
#include <queue> |
|
|
|
|
|
|
|
|
|
#include <node.h> |
|
|
|
|
#include <nan.h> |
|
|
|
@ -66,7 +66,7 @@ typedef struct log_args { |
|
|
|
|
|
|
|
|
|
typedef struct logger_state { |
|
|
|
|
Nan::Callback *callback; |
|
|
|
|
std::list<log_args *> *pending_args; |
|
|
|
|
std::queue<log_args *> *pending_args; |
|
|
|
|
uv_mutex_t mutex; |
|
|
|
|
uv_async_t async; |
|
|
|
|
// Indicates that a logger has been set
|
|
|
|
@ -334,14 +334,14 @@ NAN_METHOD(SetDefaultRootsPem) { |
|
|
|
|
|
|
|
|
|
NAUV_WORK_CB(LogMessagesCallback) { |
|
|
|
|
Nan::HandleScope scope; |
|
|
|
|
std::list<log_args *> args; |
|
|
|
|
std::queue<log_args *> args; |
|
|
|
|
uv_mutex_lock(&grpc_logger_state.mutex); |
|
|
|
|
args.splice(args.begin(), *grpc_logger_state.pending_args); |
|
|
|
|
grpc_logger_state.pending_args->swap(args); |
|
|
|
|
uv_mutex_unlock(&grpc_logger_state.mutex); |
|
|
|
|
/* Call the callback with each log message */ |
|
|
|
|
while (!args.empty()) { |
|
|
|
|
log_args *arg = args.front(); |
|
|
|
|
args.pop_front(); |
|
|
|
|
args.pop(); |
|
|
|
|
Local<Value> file = Nan::New(arg->core_args.file).ToLocalChecked(); |
|
|
|
|
Local<Value> line = Nan::New<Uint32, uint32_t>(arg->core_args.line); |
|
|
|
|
Local<Value> severity = Nan::New( |
|
|
|
@ -368,7 +368,7 @@ void node_log_func(gpr_log_func_args *args) { |
|
|
|
|
args_copy->timestamp = gpr_now(GPR_CLOCK_REALTIME); |
|
|
|
|
|
|
|
|
|
uv_mutex_lock(&grpc_logger_state.mutex); |
|
|
|
|
grpc_logger_state.pending_args->push_back(args_copy); |
|
|
|
|
grpc_logger_state.pending_args->push(args_copy); |
|
|
|
|
uv_mutex_unlock(&grpc_logger_state.mutex); |
|
|
|
|
|
|
|
|
|
uv_async_send(&grpc_logger_state.async); |
|
|
|
@ -376,7 +376,7 @@ void node_log_func(gpr_log_func_args *args) { |
|
|
|
|
|
|
|
|
|
void init_logger() { |
|
|
|
|
memset(&grpc_logger_state, 0, sizeof(logger_state)); |
|
|
|
|
grpc_logger_state.pending_args = new std::list<log_args *>(); |
|
|
|
|
grpc_logger_state.pending_args = new std::queue<log_args *>(); |
|
|
|
|
uv_mutex_init(&grpc_logger_state.mutex); |
|
|
|
|
uv_async_init(uv_default_loop(), |
|
|
|
|
&grpc_logger_state.async, |
|
|
|
|