28
28
#include < boost/shared_ptr.hpp>
29
29
#include < boost/enable_shared_from_this.hpp>
30
30
#include " OSS/JS/JSIsolateManager.h"
31
+ #include " OSS/UTL/Thread.h"
31
32
32
33
33
34
namespace OSS {
@@ -46,24 +47,47 @@ class JSFunctionCallback : public boost::enable_shared_from_this<JSFunctionCallb
46
47
virtual ~JSFunctionCallback ();
47
48
virtual void execute ();
48
49
void handle_to_arg_vector (v8::Handle <v8::Value> input, ArgumentVector& output);
50
+ void dispose ();
51
+ bool & autoDisposeOnExecute ();
52
+ bool autoDisposeOnExecute () const ;
49
53
private:
50
54
v8::Persistent<v8::Function> _function;
51
55
ArgumentVector _args;
52
56
v8::Persistent<v8::Function> _resultHandler;
57
+
58
+ bool _disposed;
59
+ bool _autoDisposeOnExecute;
60
+ OSS::mutex_critic_sec _disposeMutex;
53
61
};
54
62
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 )
56
76
{
57
77
_function = v8::Persistent<v8::Function>::New (v8::Handle <v8::Function>::Cast (func));
58
78
}
59
79
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 )
61
83
{
62
84
_function = v8::Persistent<v8::Function>::New (v8::Handle <v8::Function>::Cast (func));
63
85
handle_to_arg_vector (args, _args);
64
86
}
65
87
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 )
67
91
{
68
92
_function = v8::Persistent<v8::Function>::New (v8::Handle <v8::Function>::Cast (func));
69
93
_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
72
96
73
97
inline JSFunctionCallback::~JSFunctionCallback ()
74
98
{
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
+
75
111
_function.Dispose ();
76
112
if (!_resultHandler.IsEmpty ())
77
113
{
@@ -81,6 +117,7 @@ inline JSFunctionCallback::~JSFunctionCallback()
81
117
{
82
118
iter->Dispose ();
83
119
}
120
+ _disposed = true ;
84
121
}
85
122
86
123
inline void JSFunctionCallback::handle_to_arg_vector (v8::Handle <v8::Value> input, ArgumentVector& output)
@@ -112,6 +149,11 @@ inline void JSFunctionCallback::execute()
112
149
handle_to_arg_vector (result, resultArg);
113
150
_resultHandler->Call (js_get_global (), resultArg.size (), resultArg.data ());
114
151
}
152
+
153
+ if (_autoDisposeOnExecute)
154
+ {
155
+ dispose ();
156
+ }
115
157
}
116
158
117
159
} } // OSS::JS
0 commit comments