| 228 | } |
| 229 | |
| 230 | void worker_thread_func(void* param) { |
| 231 | WorkerData* worker_data = (WorkerData*)param; |
| 232 | WorkerMessagePort* message_port = worker_data->messagePort; |
| 233 | |
| 234 | Isolate::CreateParams create_params; |
| 235 | create_params.array_buffer_allocator = v8::ArrayBuffer::Allocator::NewDefaultAllocator(); |
| 236 | Isolate* isolate = Isolate::New(create_params); |
| 237 | Locker locker(isolate); |
| 238 | Isolate::Scope isolate_scope(isolate); |
| 239 | HandleScope handle_scope(isolate); |
| 240 | |
| 241 | Local<ObjectTemplate> global = ObjectTemplate::New(isolate); |
| 242 | |
| 243 | Local<External> extern_message_port = External::New(isolate, message_port); |
| 244 | global->Set(String::NewFromUtf8(isolate, "postMessage").ToLocalChecked(), FunctionTemplate::New(isolate, worker_post_message, extern_message_port)); |
| 245 | global->SetAccessor(String::NewFromUtf8(isolate, "onmessage").ToLocalChecked(), (AccessorGetterCallback)worker_onmessage_get, (AccessorSetterCallback)worker_onmessage_set, extern_message_port); |
| 246 | global->Set(String::NewFromUtf8(isolate, "addEventListener").ToLocalChecked(), FunctionTemplate::New(isolate, worker_add_event_listener, extern_message_port)); |
| 247 | |
| 248 | IntervalFunctions interval_functions; |
| 249 | interval_functions.latestId = 0; |
| 250 | Local<External> extern_interval_functions = External::New(isolate, &interval_functions); |
| 251 | |
| 252 | global->Set(String::NewFromUtf8(isolate, "setInterval").ToLocalChecked(), FunctionTemplate::New(isolate, worker_set_interval, extern_interval_functions)); |
| 253 | global->Set(String::NewFromUtf8(isolate, "clearInterval").ToLocalChecked(), FunctionTemplate::New(isolate, worker_clear_interval, extern_interval_functions)); |
| 254 | |
| 255 | Local<Context> context = Context::New(isolate, nullptr, global); |
| 256 | Global<Context> global_context; |
| 257 | global_context.Reset(isolate, context); |
| 258 | Context::Scope context_scope(context); |
| 259 | |
| 260 | bind_worker_class(isolate, global_context); |
| 261 | |
| 262 | kinc_file_reader_t reader; |
| 263 | if (!kinc_file_reader_open(&reader, worker_data->fileName, KINC_FILE_TYPE_ASSET)) { |
| 264 | kinc_log(KINC_LOG_LEVEL_ERROR, "Could not load file %s for worker thread", worker_data->fileName); |
| 265 | exit(1); |
| 266 | } |
| 267 | |
| 268 | size_t file_size = kinc_file_reader_size(&reader); |
| 269 | char* code = new char[file_size + 1]; |
| 270 | kinc_file_reader_read(&reader, code, file_size); |
| 271 | code[file_size] = 0; |
| 272 | kinc_file_reader_close(&reader); |
| 273 | |
| 274 | Local<String> source = String::NewFromUtf8(isolate, code, NewStringType::kNormal).ToLocalChecked(); |
| 275 | |
| 276 | TryCatch try_catch(isolate); |
| 277 | Local<Script> compiled_script = Script::Compile(isolate->GetCurrentContext(), source).ToLocalChecked(); |
| 278 | |
| 279 | Local<Value> result; |
| 280 | if (!compiled_script->Run(context).ToLocal(&result)) { |
| 281 | handle_exception(isolate, &try_catch); |
| 282 | } |
| 283 | |
| 284 | while (!message_port->isTerminated) { |
| 285 | double time = kinc_time(); |
| 286 | for (int i = 0; i < interval_functions.functions.size(); ++i) { |
| 287 | if (interval_functions.functions[i].nextCallTime <= time) { |
nothing calls this directly
no test coverage detected