MCPcopy Create free account
hub / github.com/armory3d/armory / worker_thread_func

Function worker_thread_func

armorcore/Sources/worker.cpp:230–324  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

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) {

Callers

nothing calls this directly

Calls 12

bind_worker_classFunction · 0.85
handle_message_queueFunction · 0.85
handle_worker_messagesFunction · 0.85
ToLocalCheckedMethod · 0.80
ToLocalMethod · 0.80
GetDataMethod · 0.80
handle_exceptionFunction · 0.70
SetMethod · 0.45
ResetMethod · 0.45
sizeMethod · 0.45
CallMethod · 0.45
GlobalMethod · 0.45

Tested by

no test coverage detected