11#include " rr.h"
2+ #include " pthread.h"
3+ #include " unistd.h"
24
35namespace rr {
46
57void Script::Init () {
68 ClassBuilder (" Script" ).
79 defineSingletonMethod (" New" , &New).
810 defineMethod (" Run" , &Run).
11+ defineMethod (" RunWithTimeout" , &RunWithTimeout).
912 store (&Class);
1013 ClassBuilder (" ScriptOrigin" ).
1114 defineSingletonMethod (" new" , &ScriptOrigin::initialize).
@@ -69,6 +72,38 @@ VALUE Script::Run(VALUE self) {
6972 return Value (Script (self)->Run ());
7073}
7174
75+ typedef struct {
76+ v8::Isolate *isolate;
77+ long timeout;
78+ } timeout_data;
79+
80+ void * breaker (void *d) {
81+ timeout_data* data = (timeout_data*)d;
82+ usleep (data->timeout *1000 );
83+ pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, NULL );
84+ v8::V8::TerminateExecution (data->isolate );
85+ return NULL ;
86+ }
87+
88+ VALUE Script::RunWithTimeout (VALUE self, VALUE timeout) {
89+ pthread_t breaker_thread;
90+ timeout_data data;
91+ VALUE rval;
92+ void *res;
93+
94+ data.isolate = v8::Isolate::GetCurrent ();
95+ data.timeout = NUM2LONG (timeout);
96+
97+ pthread_create (&breaker_thread, NULL , breaker, &data);
98+
99+ rval = Value (Script (self)->Run ());
100+
101+ pthread_cancel (breaker_thread);
102+ pthread_join (breaker_thread, &res);
103+
104+ return rval;
105+ }
106+
72107template <> void Pointer<v8::ScriptData>::unwrap(VALUE value) {
73108 Data_Get_Struct (value, class v8 ::ScriptData, pointer);
74109}
@@ -77,4 +112,4 @@ template <> void Pointer<v8::ScriptOrigin>::unwrap(VALUE value) {
77112 Data_Get_Struct (value, class v8 ::ScriptOrigin, pointer);
78113}
79114
80- } // namespace rr
115+ } // namespace rr
0 commit comments