checkpoint before android work
This commit is contained in:
		@@ -1,5 +1,4 @@
 | 
			
		||||
use crate::core_context::*;
 | 
			
		||||
use crate::intf::*;
 | 
			
		||||
use crate::veilid_api::*;
 | 
			
		||||
use crate::xx::*;
 | 
			
		||||
use log::{set_boxed_logger, set_max_level, Level, LevelFilter, Log, Metadata, Record};
 | 
			
		||||
@@ -8,8 +7,7 @@ use once_cell::sync::OnceCell;
 | 
			
		||||
struct ApiLoggerInner {
 | 
			
		||||
    level: LevelFilter,
 | 
			
		||||
    filter_ignore: Cow<'static, [Cow<'static, str>]>,
 | 
			
		||||
    join_handle: Option<JoinHandle<()>>,
 | 
			
		||||
    tx: Option<flume::Sender<(VeilidLogLevel, String)>>,
 | 
			
		||||
    update_callback: UpdateCallback,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Clone)]
 | 
			
		||||
@@ -21,21 +19,10 @@ static API_LOGGER: OnceCell<ApiLogger> = OnceCell::new();
 | 
			
		||||
 | 
			
		||||
impl ApiLogger {
 | 
			
		||||
    fn new_inner(level: LevelFilter, update_callback: UpdateCallback) -> ApiLoggerInner {
 | 
			
		||||
        let (tx, rx) = flume::unbounded::<(VeilidLogLevel, String)>();
 | 
			
		||||
        let join_handle: Option<JoinHandle<()>> = Some(spawn(async move {
 | 
			
		||||
            while let Ok(v) = rx.recv_async().await {
 | 
			
		||||
                (update_callback)(VeilidUpdate::Log {
 | 
			
		||||
                    log_level: v.0,
 | 
			
		||||
                    message: v.1,
 | 
			
		||||
                })
 | 
			
		||||
                .await;
 | 
			
		||||
            }
 | 
			
		||||
        }));
 | 
			
		||||
        ApiLoggerInner {
 | 
			
		||||
            level,
 | 
			
		||||
            filter_ignore: Default::default(),
 | 
			
		||||
            join_handle,
 | 
			
		||||
            tx: Some(tx),
 | 
			
		||||
            update_callback,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -54,20 +41,8 @@ impl ApiLogger {
 | 
			
		||||
 | 
			
		||||
    pub async fn terminate() {
 | 
			
		||||
        if let Some(api_logger) = API_LOGGER.get() {
 | 
			
		||||
            let mut join_handle = None;
 | 
			
		||||
            {
 | 
			
		||||
                let mut inner = api_logger.inner.lock();
 | 
			
		||||
 | 
			
		||||
                // Terminate channel
 | 
			
		||||
                if let Some(inner) = (*inner).as_mut() {
 | 
			
		||||
                    inner.tx = None;
 | 
			
		||||
                    join_handle = inner.join_handle.take();
 | 
			
		||||
                }
 | 
			
		||||
                *inner = None;
 | 
			
		||||
            }
 | 
			
		||||
            if let Some(jh) = join_handle {
 | 
			
		||||
                jh.await;
 | 
			
		||||
            }
 | 
			
		||||
            let mut inner = api_logger.inner.lock();
 | 
			
		||||
            *inner = None;
 | 
			
		||||
 | 
			
		||||
            // Clear everything and we're done
 | 
			
		||||
            set_max_level(LevelFilter::Off);
 | 
			
		||||
@@ -139,9 +114,10 @@ impl Log for ApiLogger {
 | 
			
		||||
 | 
			
		||||
                let s = format!("{}{}{}", tgt, loc, record.args());
 | 
			
		||||
 | 
			
		||||
                if let Some(tx) = &inner.tx {
 | 
			
		||||
                    let _ = tx.try_send((ll, s));
 | 
			
		||||
                }
 | 
			
		||||
                (inner.update_callback)(VeilidUpdate::Log {
 | 
			
		||||
                    log_level: ll,
 | 
			
		||||
                    message: s,
 | 
			
		||||
                })
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -4,12 +4,12 @@ pub use rust_fsm::*;
 | 
			
		||||
cfg_if! {
 | 
			
		||||
    if #[cfg(target_arch = "wasm32")] {
 | 
			
		||||
        pub type StateChangeCallback<T> = Arc<
 | 
			
		||||
            dyn Fn(<T as StateMachineImpl>::State, <T as StateMachineImpl>::State) -> SystemPinBoxFuture<()>
 | 
			
		||||
            dyn Fn(<T as StateMachineImpl>::State, <T as StateMachineImpl>::State)
 | 
			
		||||
                + 'static,
 | 
			
		||||
        >;
 | 
			
		||||
    } else {
 | 
			
		||||
        pub type StateChangeCallback<T> = Arc<
 | 
			
		||||
            dyn Fn(<T as StateMachineImpl>::State, <T as StateMachineImpl>::State) -> SystemPinBoxFuture<()>
 | 
			
		||||
            dyn Fn(<T as StateMachineImpl>::State, <T as StateMachineImpl>::State)
 | 
			
		||||
                + Send
 | 
			
		||||
                + Sync
 | 
			
		||||
                + 'static,
 | 
			
		||||
@@ -88,7 +88,7 @@ where
 | 
			
		||||
                (inner.callback.clone(), eventual)
 | 
			
		||||
            };
 | 
			
		||||
            if let Some(cb) = callback {
 | 
			
		||||
                cb(old_state, new_state).await;
 | 
			
		||||
                cb(old_state, new_state);
 | 
			
		||||
            }
 | 
			
		||||
            eventual.resolve(new_state).await;
 | 
			
		||||
            Ok(output)
 | 
			
		||||
 
 | 
			
		||||
@@ -8,9 +8,9 @@ use crate::xx::*;
 | 
			
		||||
 | 
			
		||||
cfg_if! {
 | 
			
		||||
    if #[cfg(target_arch = "wasm32")] {
 | 
			
		||||
        pub type UpdateCallback = Arc<dyn Fn(VeilidUpdate) -> SystemPinBoxFuture<()>>;
 | 
			
		||||
        pub type UpdateCallback = Arc<dyn Fn(VeilidUpdate)>;
 | 
			
		||||
    } else {
 | 
			
		||||
        pub type UpdateCallback = Arc<dyn Fn(VeilidUpdate) -> SystemPinBoxFuture<()> + Send + Sync>;
 | 
			
		||||
        pub type UpdateCallback = Arc<dyn Fn(VeilidUpdate) + Send + Sync>;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -73,7 +73,7 @@ impl ServicesContext {
 | 
			
		||||
            info!("Veilid API logging initialized");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        trace!("startup starting");
 | 
			
		||||
        info!("Veilid API starting up");
 | 
			
		||||
 | 
			
		||||
        // Set up protected store
 | 
			
		||||
        trace!("init protected store");
 | 
			
		||||
@@ -134,12 +134,12 @@ impl ServicesContext {
 | 
			
		||||
        }
 | 
			
		||||
        self.attachment_manager = Some(attachment_manager);
 | 
			
		||||
 | 
			
		||||
        trace!("startup complete");
 | 
			
		||||
        info!("Veilid API startup complete");
 | 
			
		||||
        Ok(())
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub async fn shutdown(&mut self) {
 | 
			
		||||
        trace!("shutdown starting");
 | 
			
		||||
        info!("Veilid API shutting down");
 | 
			
		||||
 | 
			
		||||
        if let Some(attachment_manager) = &mut self.attachment_manager {
 | 
			
		||||
            trace!("terminate attachment manager");
 | 
			
		||||
@@ -162,13 +162,13 @@ impl ServicesContext {
 | 
			
		||||
            protected_store.terminate().await;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        trace!("shutdown complete");
 | 
			
		||||
        info!("Veilid API shutdown complete");
 | 
			
		||||
 | 
			
		||||
        // api logger terminate is idempotent
 | 
			
		||||
        ApiLogger::terminate().await;
 | 
			
		||||
 | 
			
		||||
        // send final shutdown update
 | 
			
		||||
        (self.update_callback)(VeilidUpdate::Shutdown).await;
 | 
			
		||||
        (self.update_callback)(VeilidUpdate::Shutdown);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -221,7 +221,6 @@ impl VeilidCoreContext {
 | 
			
		||||
            if #[cfg(target_os = "android")] {
 | 
			
		||||
                if utils::android::ANDROID_GLOBALS.lock().is_none() {
 | 
			
		||||
                    error!("Android globals are not set up");
 | 
			
		||||
                    config.terminate().await;
 | 
			
		||||
                    return Err(VeilidAPIError::Internal { message: "Android globals are not set up".to_owned() });
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
@@ -160,13 +160,9 @@ cfg_if! {
 | 
			
		||||
 | 
			
		||||
pub fn setup_veilid_core() -> (UpdateCallback, ConfigCallback) {
 | 
			
		||||
    (
 | 
			
		||||
        Arc::new(
 | 
			
		||||
            move |veilid_update: VeilidUpdate| -> SystemPinBoxFuture<()> {
 | 
			
		||||
                Box::pin(async move {
 | 
			
		||||
                    trace!("update_callback: {:?}", veilid_update);
 | 
			
		||||
                })
 | 
			
		||||
            },
 | 
			
		||||
        ),
 | 
			
		||||
        Arc::new(move |veilid_update: VeilidUpdate| {
 | 
			
		||||
            println!("update_callback: {:?}", veilid_update);
 | 
			
		||||
        }),
 | 
			
		||||
        Arc::new(config_callback),
 | 
			
		||||
    )
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user