Skip to content
Extraits de code Groupes Projets
Sélectionner une révision Git
  • 69fdd2f436cb6c420234a47975a788d85790e9ad
  • master par défaut protégée
  • rust-playlist-sync
  • rust
  • fix-qt-deprecated-qvariant-type
  • fix-mpris-qtwindow-race-condition
  • rust-appimage-wayland
  • windows-build-rebased
  • v2.5 protégée
  • v2.4 protégée
  • v2.3-1 protégée
  • v2.3 protégée
  • v2.2 protégée
  • v2.1 protégée
  • v2.0 protégée
  • v1.8-3 protégée
  • v1.8-2 protégée
  • v1.8-1 protégée
  • v1.8 protégée
  • v1.7 protégée
  • v1.6 protégée
  • v1.5 protégée
  • v1.4 protégée
  • v1.3 protégée
  • v1.2 protégée
  • v1.1 protégée
  • v1.0 protégée
27 résultats

main.rs

Blame
  • main.rs 3,41 Kio
    mod app;
    pub mod c_wrapper;
    mod cmd;
    mod config;
    mod error;
    mod listen;
    mod mpris;
    mod routes;
    
    pub use app::*;
    pub use config::*;
    pub use error::*;
    pub use listen::*;
    
    use anyhow::{Context, Result};
    use cmd::SubCommand;
    use lektor_utils::*;
    use std::sync::atomic::{AtomicU64, Ordering};
    use tokio::{signal, sync::oneshot::Receiver};
    
    fn main() -> Result<()> {
        logger::init(Some(log::Level::Debug)).expect("failed to install logger");
        let config = lektor_utils::config::get_or_write_default_config::<LektorConfig>("lektord")?;
        let args = <cmd::Args as clap::Parser>::parse();
        lektor_utils::logger::level(config.log);
        if args.verbose != 0 {
            lektor_utils::logger::level_int(args.verbose);
        }
    
        match args.action.unwrap_or_default() {
            SubCommand::Config { show: true, .. } => {
                println!("{config}");
                Ok(())
            }
    
            SubCommand::Config {
                edit: Some(args), ..
            } => match &args[..] {
                [name, value] => config.edit(name, value),
                args => unreachable!("{args:#?}"),
            },
    
            SubCommand::Start => {
                log::info!("starting the lektord daemon");
                tokio::runtime::Builder::new_multi_thread()
                    .worker_threads(config.workers) // Thread count from the config file.
                    .thread_name_fn(|| {
                        static COUNT: AtomicU64 = AtomicU64::new(0);
                        format!("lektord-{}", COUNT.fetch_add(1, Ordering::SeqCst))
                    })
                    .enable_all()
                    .thread_stack_size(3 * 1024 * 1024) // 3Mio for each thread, should be enaugh
                    .build()?
                    .block_on(async move {
                        lektor_utils::config::write_config_async("lektord", config.clone()).await?; // Write to apply changes...
                        let addrs = AddrIncomingCombined::from_iter(&config.listen).err()?;
                        let (app, shutdown) = app(config)
                            .await
                            .with_context(|| "failed to build service")?;
                        hyper::Server::builder(addrs)
                            .serve(app.into_make_service())
                            .with_graceful_shutdown(shutdown_signal(shutdown))
                            .await?;
                        Ok(())
                    })
            }
    
            args => unreachable!("{args:?}"),
        }
    }
    
    /// Gracefull ctrl+c handling.
    async fn shutdown_signal(shutdown: Receiver<()>) {
        let shutdown = async {
            let _ = shutdown.await;
            log::info!("shutdown signal!")
        };
        let ctrl_c = async {
            signal::ctrl_c()
                .await
                .expect("failed to install Ctrl+C handler");
            log::info!("ctrl+c signal!")
        };
    
        #[cfg(unix)]
        let terminate = async {
            signal::unix::signal(signal::unix::SignalKind::terminate())
                .expect("failed to install signal handler")
                .recv()
                .await;
            log::info!("terminate signal!")
        };
    
        #[cfg(not(unix))]
        let terminate = std::future::pending::<()>();
    
        tokio::select! {
            _ = ctrl_c => {},
            _ = terminate => {},
            _ = shutdown => {},
        }
    
        log::info!("received termination signal shutting down, try to unregister the state from the player module");
        if let Err(err) = c_wrapper::close_player_module().await {
            log::error!("{err}")
        }
        log::info!("will now call exit(EXIT_SUCCESS)");
        std::process::exit(0);
    }