diff --git a/bridge/core/executing_context.cc b/bridge/core/executing_context.cc index 26b5651e39..b20419b375 100644 --- a/bridge/core/executing_context.cc +++ b/bridge/core/executing_context.cc @@ -45,6 +45,7 @@ ExecutingContext::ExecutingContext(DartIsolateContext* dart_isolate_context, // #endif // @FIXME: maybe contextId will larger than MAX_JS_CONTEXT + assert_m(valid_contexts[contextId] != true, "Conflict context found!"); valid_contexts[contextId] = true; if (contextId > running_context_list) running_context_list = contextId; diff --git a/bridge/include/webf_bridge.h b/bridge/include/webf_bridge.h index 97ad56772a..e9fed56e0c 100644 --- a/bridge/include/webf_bridge.h +++ b/bridge/include/webf_bridge.h @@ -36,6 +36,10 @@ WEBF_EXPORT_C void* initDartIsolateContext(uint64_t* dart_methods, int32_t dart_methods_len); WEBF_EXPORT_C void* allocateNewPage(void* dart_isolate_context, int32_t targetContextId); + +WEBF_EXPORT_C +int64_t newPageId(); + WEBF_EXPORT_C void disposePage(void* dart_isolate_context, void* page); WEBF_EXPORT_C diff --git a/bridge/webf_bridge.cc b/bridge/webf_bridge.cc index a276bbe270..786d24abc0 100644 --- a/bridge/webf_bridge.cc +++ b/bridge/webf_bridge.cc @@ -37,6 +37,8 @@ #define SYSTEM_NAME "unknown" #endif +static std::atomic unique_page_id{0}; + void* initDartIsolateContext(uint64_t* dart_methods, int32_t dart_methods_len) { void* ptr = new webf::DartIsolateContext(dart_methods, dart_methods_len); return ptr; @@ -51,6 +53,10 @@ void* allocateNewPage(void* dart_isolate_context, int32_t targetContextId) { return ptr; } +int64_t newPageId() { + return unique_page_id++; +} + void disposePage(void* dart_isolate_context, void* page_) { auto* page = reinterpret_cast(page_); assert(std::this_thread::get_id() == page->currentThread()); diff --git a/webf/lib/src/bridge/bridge.dart b/webf/lib/src/bridge/bridge.dart index 076d1e321c..ec809b8cfa 100644 --- a/webf/lib/src/bridge/bridge.dart +++ b/webf/lib/src/bridge/bridge.dart @@ -10,12 +10,6 @@ import 'binding.dart'; import 'from_native.dart'; import 'to_native.dart'; -int _contextId = 0; - -int newContextId() { - return ++_contextId; -} - class DartContext { DartContext() : pointer = initDartIsolateContext(makeDartMethodsData()) { initDartDynamicLinking(); @@ -31,7 +25,7 @@ int initBridge(WebFViewController view) { // Setup binding bridge. BindingBridge.setup(); - int pageId = newContextId(); + int pageId = newPageId(); allocateNewPage(pageId); return pageId; diff --git a/webf/lib/src/bridge/to_native.dart b/webf/lib/src/bridge/to_native.dart index 31ac901f4e..fa9e90df6a 100644 --- a/webf/lib/src/bridge/to_native.dart +++ b/webf/lib/src/bridge/to_native.dart @@ -237,6 +237,15 @@ void disposePage(int contextId) { _allocatedPages.remove(contextId); } +typedef NativeNewPageId = Int64 Function(); +typedef DartNewPageId = int Function(); + +final DartNewPageId _newPageId = WebFDynamicLibrary.ref.lookup>('newPageId').asFunction(); + +int newPageId() { + return _newPageId(); +} + typedef NativeAllocateNewPage = Pointer Function(Pointer, Int32); typedef DartAllocateNewPage = Pointer Function(Pointer, int);