forked from LeenkxTeam/LNXRNT
Multithread
This commit is contained in:
@ -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();
|
||||
|
||||
Reference in New Issue
Block a user