Multithread

This commit is contained in:
2026-07-09 23:51:42 -07:00
parent fbebea374b
commit e06b85c897
4 changed files with 459 additions and 110 deletions

View File

@ -95,6 +95,7 @@ bool show_window = false;
#endif
#include "async_engine.h"
#include "data_map.h"
// TODO
//#ifdef KINC_KONG
@ -233,8 +234,14 @@ namespace {
void handle_exception(TryCatch *try_catch) {
MaybeLocal<Value> trace = try_catch->StackTrace(isolate->GetCurrentContext());
if (trace.IsEmpty()) {
String::Utf8Value stack_trace(isolate, try_catch->Message()->Get());
write_stack_trace(*stack_trace);
MaybeLocal<v8::Message> message = try_catch->Message();
if (message.IsEmpty()) {
write_stack_trace("uncaught exception (no message available)");
}
else {
String::Utf8Value stack_trace(isolate, message.ToLocalChecked()->Get());
write_stack_trace(*stack_trace);
}
}
else {
String::Utf8Value stack_trace(isolate, trace.ToLocalChecked());
@ -1436,18 +1443,33 @@ namespace {
Local<Function> cb = Local<Function>::Cast(args[1]);
auto persistent_cb = std::make_shared<Global<Function>>(isolate, cb);
EngineManager::AsyncEngine::instance().execute_io([filepath, persistent_cb]() {
(void)EngineManager::AsyncEngine::instance().execute_io([filepath, persistent_cb]() {
kinc_file_reader_t reader;
bool success = kinc_file_reader_open(&reader, filepath.c_str(), KINC_FILE_TYPE_ASSET);
std::vector<uint8_t> bytes;
if (success) {
uint32_t size = (uint32_t)kinc_file_reader_size(&reader);
bytes.resize(size);
kinc_file_reader_read(&reader, bytes.data(), size);
kinc_file_reader_close(&reader);
bool success = false;
bool reader_open = false;
DataMap* dm = nullptr;
try {
success = kinc_file_reader_open(&reader, filepath.c_str(), KINC_FILE_TYPE_ASSET);
if (success) {
reader_open = true;
size_t size = kinc_file_reader_size(&reader);
dm = new DataMap();
if (!dm->map_from_reader(reader.data, size)) {
delete dm;
dm = nullptr;
success = false;
}
kinc_file_reader_close(&reader);
reader_open = false;
}
} catch (...) {
success = false;
if (dm) { dm->close(); delete dm; dm = nullptr; }
if (reader_open) { kinc_file_reader_close(&reader); reader_open = false; }
}
EngineManager::AsyncEngine::instance().push_event([persistent_cb, bytes = std::move(bytes), success]() {
EngineManager::AsyncEngine::instance().push_event([persistent_cb, dm, success]() {
Locker locker{isolate};
Isolate::Scope isolate_scope(isolate);
HandleScope handle_scope(isolate);
@ -1456,12 +1478,20 @@ namespace {
TryCatch try_catch(isolate);
Local<Function> cb = Local<Function>::New(isolate, *persistent_cb);
if (success && !bytes.empty()) {
Local<ArrayBuffer> buffer = ArrayBuffer::New(isolate, bytes.size());
memcpy(buffer->GetBackingStore()->Data(), bytes.data(), bytes.size());
if (success && dm) {
Local<ArrayBuffer> buffer;
if (dm->data) {
std::unique_ptr<BackingStore> backing =
ArrayBuffer::NewBackingStore(dm->data, dm->size, delete_map, dm);
buffer = ArrayBuffer::New(isolate, std::move(backing));
} else {
dm->close(); delete dm;
buffer = ArrayBuffer::New(isolate, 0);
}
Local<Value> argv[1] = { buffer };
(void)cb->Call(context, context->Global(), 1, argv);
} else {
if (dm) { dm->close(); delete dm; }
Local<Value> argv[1] = { Null(isolate) };
(void)cb->Call(context, context->Global(), 1, argv);
}
@ -3030,6 +3060,7 @@ namespace {
Local<Object> navigator = Object::New(isolate);
navigator->Set(context, String::NewFromUtf8(isolate, "userAgent").ToLocalChecked(), String::NewFromUtf8(isolate, "RunT/1.0").ToLocalChecked());
navigator->Set(context, String::NewFromUtf8(isolate, "platform").ToLocalChecked(), String::NewFromUtf8(isolate, "RunT").ToLocalChecked());
navigator->Set(context, String::NewFromUtf8(isolate, "hardwareConcurrency").ToLocalChecked(), Integer::New(isolate, kinc_hardware_threads()));
window->Set(context, String::NewFromUtf8(isolate, "navigator").ToLocalChecked(), navigator);
Local<Object> document = Object::New(isolate);
@ -3128,6 +3159,7 @@ namespace {
#ifdef WITH_WORKER
handle_worker_messages(isolate, global_context);
MicrotasksScope::PerformCheckpoint(isolate);
#endif
#ifdef WITH_NETWORKING
@ -4038,6 +4070,14 @@ int kickstart(int argc, char **argv) {
start_runt(snapshot_found ? NULL : code);
// TODO: find and fix
while (update_func.IsEmpty()) {
handle_worker_messages(isolate, global_context);
EngineManager::AsyncEngine::instance().process_events();
MicrotasksScope::PerformCheckpoint(isolate);
kinc_thread_sleep(1);
}
#ifdef WITH_VIEWPORT
if (viewport_server_mode) {
kinc_log(KINC_LOG_LEVEL_INFO, "Initializing viewport server: %dx%d, shmem=%s",
@ -4052,27 +4092,6 @@ int kickstart(int argc, char **argv) {
kinc_start();
// NOTE: WebSocket benchmark disabled for faster bootup
// #ifdef WITH_NETWORKING
// kinc_log(KINC_LOG_LEVEL_INFO, "=== WEBSOCKET BOOTUP BENCHMARK ===");
// {
// WebSocketBenchmark benchmark;
// kinc_log(KINC_LOG_LEVEL_INFO, "Running quick WebSocket performance check...");
// auto result = benchmark.runCollaborative3DTest(5, 10);
// kinc_log(KINC_LOG_LEVEL_INFO, "Benchmark Results:");
// kinc_log(KINC_LOG_LEVEL_INFO, "- Messages/sec: %llu", result.messagesPerSecond);
// kinc_log(KINC_LOG_LEVEL_INFO, "- Avg Latency: %.1f μs", result.averageLatency);
// kinc_log(KINC_LOG_LEVEL_INFO, "- CPU Usage: %.1f%%", result.avgCpuPercent);
// kinc_log(KINC_LOG_LEVEL_INFO, "- Memory: %zu MB", result.peakMemoryMB);
// if (result.messagesPerSecond > 100) {
// kinc_log(KINC_LOG_LEVEL_INFO, "✓ WebSocket performance: GOOD");
// } else {
// kinc_log(KINC_LOG_LEVEL_WARNING, "⚠ WebSocket performance: LOW - check system load");
// }
// }
// kinc_log(KINC_LOG_LEVEL_INFO, "=== BENCHMARK COMPLETE ===");
// #endif
#ifdef WITH_AUDIO
if (enable_audio) {
kinc_a2_shutdown();