浏览代码

Revert "feat: use once_cell for perf."

Nathan.fooo 3 年之前
父节点
当前提交
195bb9edcb
共有 2 个文件被更改,包括 15 次插入23 次删除
  1. 2 1
      frontend/rust-lib/dart-ffi/Cargo.toml
  2. 13 22
      frontend/rust-lib/dart-ffi/src/lib.rs

+ 2 - 1
frontend/rust-lib/dart-ffi/Cargo.toml

@@ -16,12 +16,13 @@ allo-isolate = {version = "^0.1", features = ["catch-unwind",]}
 byteorder = {version = "1.3.4"}
 ffi-support = {version = "0.4.2"}
 protobuf = {version = "2.20.0"}
+lazy_static = {version = "1.4.0"}
 tokio = { version = "1", features = ["rt", "rt-multi-thread"] }
 log = "0.4.14"
 serde = { version = "1.0", features = ["derive"] }
 serde_json = {version = "1.0"}
 bytes = { version = "1.0" }
-once_cell = "1"
+parking_lot = "0.11"
 
 lib-dispatch = {path = "../lib-dispatch" }
 flowy-sdk = {path = "../flowy-sdk"}

+ 13 - 22
frontend/rust-lib/dart-ffi/src/lib.rs

@@ -9,10 +9,18 @@ use crate::{
     model::{FFIRequest, FFIResponse},
 };
 use flowy_sdk::*;
+use lazy_static::lazy_static;
 use lib_dispatch::prelude::*;
-use std::{ffi::CStr, os::raw::c_char};
+use parking_lot::RwLock;
+use std::{ffi::CStr, os::raw::c_char, sync::Arc};
 
-const FLOWY_SDK: once_cell::sync::OnceCell<FlowySDK> = once_cell::sync::OnceCell::new();
+lazy_static! {
+    static ref FLOWY_SDK: RwLock<Option<Arc<FlowySDK>>> = RwLock::new(None);
+}
+
+fn dispatch() -> Arc<EventDispatcher> {
+    FLOWY_SDK.read().as_ref().unwrap().dispatcher()
+}
 
 #[no_mangle]
 pub extern "C" fn init_sdk(path: *mut c_char) -> i64 {
@@ -21,7 +29,7 @@ pub extern "C" fn init_sdk(path: *mut c_char) -> i64 {
 
     let server_config = get_client_server_configuration().unwrap();
     let config = FlowySDKConfig::new(path, server_config, "appflowy").log_filter("debug");
-    FLOWY_SDK.get_or_init(|| FlowySDK::new(config));
+    *FLOWY_SDK.write() = Some(Arc::new(FlowySDK::new(config)));
 
     0
 }
@@ -36,15 +44,7 @@ pub extern "C" fn async_event(port: i64, input: *const u8, len: usize) {
         port
     );
 
-    let dispatcher = match FLOWY_SDK.get() {
-        None => {
-            log::error!("sdk not init yet.");
-
-            return;
-        }
-        Some(e) => e.dispatcher.clone(),
-    };
-    let _ = EventDispatcher::async_send_with_callback(dispatcher, request, move |resp: EventResponse| {
+    let _ = EventDispatcher::async_send_with_callback(dispatch(), request, move |resp: EventResponse| {
         log::trace!("[FFI]: Post data to dart through {} port", port);
         Box::pin(post_to_flutter(resp, port))
     });
@@ -54,16 +54,7 @@ pub extern "C" fn async_event(port: i64, input: *const u8, len: usize) {
 pub extern "C" fn sync_event(input: *const u8, len: usize) -> *const u8 {
     let request: ModuleRequest = FFIRequest::from_u8_pointer(input, len).into();
     log::trace!("[FFI]: {} Sync Event: {:?}", &request.id, &request.event,);
-
-    let dispatcher = match FLOWY_SDK.get() {
-        None => {
-            log::error!("sdk not init yet.");
-
-            return forget_rust(vec![]);
-        }
-        Some(e) => e.dispatcher.clone(),
-    };
-    let _response = EventDispatcher::sync_send(dispatcher, request);
+    let _response = EventDispatcher::sync_send(dispatch(), request);
 
     // FFIResponse {  }
     let response_bytes = vec![];