Skip to content

Commit 14a5e27

Browse files
committed
Add autoDispose to JS function callbacks after execution
1 parent 7d7527b commit 14a5e27

File tree

3 files changed

+52
-3
lines changed

3 files changed

+52
-3
lines changed

include/OSS/JS/JSFunctionCallback.h

+45-3
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include <boost/shared_ptr.hpp>
2929
#include <boost/enable_shared_from_this.hpp>
3030
#include "OSS/JS/JSIsolateManager.h"
31+
#include "OSS/UTL/Thread.h"
3132

3233

3334
namespace OSS {
@@ -46,24 +47,47 @@ class JSFunctionCallback : public boost::enable_shared_from_this<JSFunctionCallb
4647
virtual ~JSFunctionCallback();
4748
virtual void execute();
4849
void handle_to_arg_vector(v8::Handle<v8::Value> input, ArgumentVector& output);
50+
void dispose();
51+
bool& autoDisposeOnExecute();
52+
bool autoDisposeOnExecute() const;
4953
private:
5054
v8::Persistent<v8::Function> _function;
5155
ArgumentVector _args;
5256
v8::Persistent<v8::Function> _resultHandler;
57+
58+
bool _disposed;
59+
bool _autoDisposeOnExecute;
60+
OSS::mutex_critic_sec _disposeMutex;
5361
};
5462

55-
inline JSFunctionCallback::JSFunctionCallback(v8::Handle<v8::Value> func)
63+
inline bool& JSFunctionCallback::autoDisposeOnExecute()
64+
{
65+
return _autoDisposeOnExecute;
66+
}
67+
68+
inline bool JSFunctionCallback::autoDisposeOnExecute() const
69+
{
70+
return _autoDisposeOnExecute;
71+
}
72+
73+
inline JSFunctionCallback::JSFunctionCallback(v8::Handle<v8::Value> func) :
74+
_disposed(false),
75+
_autoDisposeOnExecute(false)
5676
{
5777
_function = v8::Persistent<v8::Function>::New(v8::Handle<v8::Function>::Cast(func));
5878
}
5979

60-
inline JSFunctionCallback::JSFunctionCallback(v8::Handle<v8::Value> func, v8::Handle<v8::Value> args)
80+
inline JSFunctionCallback::JSFunctionCallback(v8::Handle<v8::Value> func, v8::Handle<v8::Value> args) :
81+
_disposed(false),
82+
_autoDisposeOnExecute(false)
6183
{
6284
_function = v8::Persistent<v8::Function>::New(v8::Handle<v8::Function>::Cast(func));
6385
handle_to_arg_vector(args, _args);
6486
}
6587

66-
inline JSFunctionCallback::JSFunctionCallback(v8::Handle<v8::Value> func, v8::Handle<v8::Value> args, v8::Handle<v8::Value> resultHandler)
88+
inline JSFunctionCallback::JSFunctionCallback(v8::Handle<v8::Value> func, v8::Handle<v8::Value> args, v8::Handle<v8::Value> resultHandler) :
89+
_disposed(false),
90+
_autoDisposeOnExecute(false)
6791
{
6892
_function = v8::Persistent<v8::Function>::New(v8::Handle<v8::Function>::Cast(func));
6993
_resultHandler = v8::Persistent<v8::Function>::New(v8::Handle<v8::Function>::Cast(resultHandler));
@@ -72,6 +96,18 @@ inline JSFunctionCallback::JSFunctionCallback(v8::Handle<v8::Value> func, v8::Ha
7296

7397
inline JSFunctionCallback::~JSFunctionCallback()
7498
{
99+
dispose();
100+
}
101+
102+
inline void JSFunctionCallback::dispose()
103+
{
104+
OSS::mutex_critic_sec_lock lock(_disposeMutex);
105+
106+
if (_disposed)
107+
{
108+
return;
109+
}
110+
75111
_function.Dispose();
76112
if (!_resultHandler.IsEmpty())
77113
{
@@ -81,6 +117,7 @@ inline JSFunctionCallback::~JSFunctionCallback()
81117
{
82118
iter->Dispose();
83119
}
120+
_disposed = true;
84121
}
85122

86123
inline void JSFunctionCallback::handle_to_arg_vector(v8::Handle<v8::Value> input, ArgumentVector& output)
@@ -112,6 +149,11 @@ inline void JSFunctionCallback::execute()
112149
handle_to_arg_vector(result, resultArg);
113150
_resultHandler->Call(js_get_global(), resultArg.size(), resultArg.data());
114151
}
152+
153+
if (_autoDisposeOnExecute)
154+
{
155+
dispose();
156+
}
115157
}
116158

117159
} } // OSS::JS

src/js/JSFunctionCallbackQueue.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,14 @@ JSFunctionCallbackQueue::~JSFunctionCallbackQueue()
4040
void JSFunctionCallbackQueue::execute(v8::Handle<v8::Value> func, v8::Handle<v8::Value> args)
4141
{
4242
JSFunctionCallback::Ptr fun(new JSFunctionCallback(func, args));
43+
fun->autoDisposeOnExecute() = true;
4344
execute(fun);
4445
}
4546

4647
void JSFunctionCallbackQueue::execute(v8::Handle<v8::Value> func, v8::Handle<v8::Value> args, v8::Handle<v8::Value> resultHandler)
4748
{
4849
JSFunctionCallback::Ptr fun(new JSFunctionCallback(func, args, resultHandler));
50+
fun->autoDisposeOnExecute() = true;
4951
execute(fun);
5052
}
5153

src/js/JSTimer.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,11 @@ void JSTimer::onTimerExpire()
5050
JSTimer::Ptr pTimer = _pManager->removeTimer(_id);
5151
if(pTimer)
5252
{
53+
//
54+
// We must set autoDispose so that were are sure
55+
// that it happens within the isolate thread and not here
56+
//
57+
pTimer->autoDisposeOnExecute() = true;
5358
_pManager->execute(pTimer);
5459
}
5560
}

0 commit comments

Comments
 (0)