Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix ThreadSafeCallback context and cleanup #246

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/data-channel-wrapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,10 @@ DataChannelWrapper::DataChannelWrapper(const Napi::CallbackInfo &info) : Napi::O
PLOG_DEBUG << "Constructor called";
mDataChannelPtr = *(info[0].As<Napi::External<std::shared_ptr<rtc::DataChannel>>>().Data());
PLOG_DEBUG << "Data Channel created";

// Closed callback must be set to trigger cleanup
mOnClosedCallback = std::make_unique<ThreadSafeCallback>(Napi::Function::New(info.Env(), [](const Napi::CallbackInfo&){}));

instances.insert(this);
}

Expand Down
5 changes: 5 additions & 0 deletions src/media-track-wrapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,12 @@ Napi::Object TrackWrapper::Init(Napi::Env env, Napi::Object exports)

TrackWrapper::TrackWrapper(const Napi::CallbackInfo &info) : Napi::ObjectWrap<TrackWrapper>(info)
{
PLOG_DEBUG << "Constructor called";
mTrackPtr = *(info[0].As<Napi::External<std::shared_ptr<rtc::Track>>>().Data());
PLOG_DEBUG << "Track created";

// Closed callback must be set to trigger cleanup
mOnClosedCallback = std::make_unique<ThreadSafeCallback>(Napi::Function::New(info.Env(), [](const Napi::CallbackInfo&){}));

instances.insert(this);
}
Expand Down
7 changes: 6 additions & 1 deletion src/peer-connection-wrapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -237,7 +237,7 @@ PeerConnectionWrapper::PeerConnectionWrapper(const Napi::CallbackInfo &info) : N
// Create peer-connection
try
{
PLOG_DEBUG << "Creating a new peer";
PLOG_DEBUG << "Creating a new Peer Connection";
mRtcPeerConnPtr = std::make_unique<rtc::PeerConnection>(rtcConfig);
}
catch (std::exception &ex)
Expand All @@ -246,6 +246,11 @@ PeerConnectionWrapper::PeerConnectionWrapper(const Napi::CallbackInfo &info) : N
return;
}

PLOG_DEBUG << "Peer Connection created";

// State change callback must be set to trigger cleanup on close
mOnStateChangeCallback = std::make_unique<ThreadSafeCallback>(Napi::Function::New(info.Env(), [](const Napi::CallbackInfo&){}));

instances.insert(this);
}

Expand Down
21 changes: 11 additions & 10 deletions src/thread-safe-callback.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,16 @@ const char *ThreadSafeCallback::CancelException::what() const throw()

ThreadSafeCallback::ThreadSafeCallback(Napi::Function callback)
{
if (!callback.IsFunction())
throw Napi::Error::New(callback.Env(), "Callback must be a function");

Napi::Env env = callback.Env();

receiver = Napi::Persistent(static_cast<Napi::Value>(Napi::Object::New(env)));
if (!callback.IsFunction())
throw Napi::Error::New(env, "Callback must be a function");

tsfn = tsfn_t::New(env,
std::move(callback),
"ThreadSafeCallback callback",
0, 1, &receiver);
0, // unlimited queue
1);
}

ThreadSafeCallback::~ThreadSafeCallback()
Expand All @@ -38,10 +38,10 @@ void ThreadSafeCallback::call(arg_func_t argFunc, cleanup_func_t cleanupFunc)

void ThreadSafeCallback::callbackFunc(Napi::Env env,
Napi::Function callback,
Napi::Reference<Napi::Value> *context,
ContextType *context,
CallbackData *data)
{
// if env is gone this could mean cb fn has changed. See issue#176
// if env is gone, it could mean this cb was destroyed. See issue#176
if (!data || !env)
return;

Expand All @@ -59,9 +59,10 @@ void ThreadSafeCallback::callbackFunc(Napi::Env env,
return;
}

if (env && callback)
if (callback)
{
callback.Call(context->Value(), args);
cleanup();
callback.Call(args);
}

cleanup();
}
7 changes: 3 additions & 4 deletions src/thread-safe-callback.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ class ThreadSafeCallback
};

private:
using ContextType = std::nullptr_t;
struct CallbackData
{
arg_func_t argFunc;
Expand All @@ -38,12 +39,10 @@ class ThreadSafeCallback

static void callbackFunc(Napi::Env env,
Napi::Function callback,
Napi::Reference<Napi::Value> *context,
ContextType *context,
CallbackData *data);

using tsfn_t = Napi::TypedThreadSafeFunction<Napi::Reference<Napi::Value>, CallbackData, callbackFunc>;

Napi::Reference<Napi::Value> receiver;
using tsfn_t = Napi::TypedThreadSafeFunction<ContextType, CallbackData, callbackFunc>;
tsfn_t tsfn;
};

Expand Down
8 changes: 6 additions & 2 deletions src/web-socket-wrapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,10 @@ WebSocketWrapper::WebSocketWrapper(const Napi::CallbackInfo &info) : Napi::Objec
}

PLOG_DEBUG << "WebSocket created";

// Closed callback must set to trigger cleanup
mOnClosedCallback = std::make_unique<ThreadSafeCallback>(Napi::Function::New(info.Env(), [](const Napi::CallbackInfo&){}));

instances.insert(this);
}

Expand Down Expand Up @@ -471,7 +475,7 @@ Napi::Value WebSocketWrapper::remoteAddress(const Napi::CallbackInfo &info)

if (!mWebSocketPtr)
{
return env.Undefined();
return env.Undefined();
}

try
Expand Down Expand Up @@ -500,7 +504,7 @@ Napi::Value WebSocketWrapper::path(const Napi::CallbackInfo &info)

if (!mWebSocketPtr)
{
return env.Undefined();
return env.Undefined();
}

try
Expand Down
Loading