@@ -66,13 +66,10 @@ Isolate::rt_base::rt_base(Isolate* cur)
6666
6767 fb->m_c_entry_fp_ = _fi.entry_fp ;
6868 fb->m_handler_ = _fi.handle ;
69-
70- m_isolate->m_in_use = 0 ;
7169}
7270
7371Isolate::rt_base::~rt_base ()
7472{
75- m_isolate->m_in_use = 1 ;
7673}
7774
7875static void fb_GCCallback (v8::Isolate* js_isolate, v8::GCType type, v8::GCCallbackFlags flags)
@@ -191,72 +188,20 @@ void Isolate::start_profiler()
191188 m_pendding.dec ();
192189 }
193190}
194-
195- class CallbackData : public obj_base {
196- public:
197- CallbackData (Isolate* isolate, v8::InterruptCallback callback, void * data)
198- : m_isolate(isolate)
199- , m_callback(callback)
200- , m_data(data)
201- {
202- }
203-
204- void invoke ()
205- {
206- if (m_invoked.CompareAndSwap (0 , 1 ) == 0 )
207- m_callback (m_isolate->m_isolate , m_data);
208- }
209-
210- public:
211- Isolate* m_isolate;
212- v8::InterruptCallback m_callback;
213- void * m_data;
214- exlib::atomic m_invoked;
215- };
216-
217- static result_t js_timer (CallbackData* cd)
191+ void InvokeApiInterruptCallbacks (v8::Isolate* isolate);
192+ static result_t js_timer (Isolate* isolate)
218193{
219194 JSFiber::scope s;
220- cd-> invoke () ;
221- cd-> Unref ( );
195+ isolate-> m_has_timer = 0 ;
196+ InvokeApiInterruptCallbacks (isolate-> m_isolate );
222197 return 0 ;
223198}
224199
225- static void _InterruptCallback (v8::Isolate* isolate, void * data)
226- {
227- CallbackData* cd = (CallbackData*)data;
228- cd->invoke ();
229- cd->Unref ();
230- }
231-
232200void Isolate::RequestInterrupt (v8::InterruptCallback callback, void * data)
233201{
234- CallbackData* cd = new CallbackData (this , callback, data);
235- cd->Ref ();
236-
237- if (IsInUse ()) {
238- cd->Ref ();
239- m_isolate->RequestInterrupt (_InterruptCallback, cd);
240-
241- exlib::OSThread::sleep (1 );
242-
243- if (!cd->m_invoked ) {
244- cd->Ref ();
245- syncCall (this , js_timer, cd);
246- }
247- } else {
248- cd->Ref ();
249- syncCall (this , js_timer, cd);
250-
251- exlib::OSThread::sleep (1 );
252-
253- if (IsInUse () && !cd->m_invoked ) {
254- cd->Ref ();
255- m_isolate->RequestInterrupt (_InterruptCallback, cd);
256- }
257- }
258-
259- cd->Unref ();
202+ m_isolate->RequestInterrupt (callback, data);
203+ if (m_has_timer.CompareAndSwap (0 , 1 ) == 0 )
204+ syncCall (this , js_timer, this );
260205}
261206
262207} /* namespace fibjs */
0 commit comments