Files
continuwuity/src/main/main.rs
T

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

120 lines
2.7 KiB
Rust
Raw Normal View History

2024-05-20 08:11:05 +00:00
pub(crate) mod clap;
mod logging;
2024-05-09 15:59:08 -07:00
mod mods;
2024-06-16 19:46:32 +00:00
mod restart;
2024-12-17 14:32:54 +00:00
mod runtime;
mod sentry;
2024-05-09 15:59:08 -07:00
mod server;
2024-06-16 19:41:03 +00:00
mod signal;
2024-05-09 15:59:08 -07:00
use std::sync::{Arc, atomic::Ordering};
2024-05-09 15:59:08 -07:00
use conduwuit_core::{Error, Result, debug_info, error, rustc_flags_capture};
2024-05-09 15:59:08 -07:00
use server::Server;
2024-07-24 23:01:00 +00:00
rustc_flags_capture! {}
2024-05-09 15:59:08 -07:00
fn main() -> Result<(), Error> {
let args = clap::parse();
2024-12-17 14:32:54 +00:00
let runtime = runtime::new(&args)?;
let server = Server::new(&args, Some(runtime.handle()))?;
2024-06-16 19:41:03 +00:00
runtime.spawn(signal::signal(server.clone()));
2024-05-25 20:16:28 +00:00
runtime.block_on(async_main(&server))?;
2024-05-09 15:59:08 -07:00
// explicit drop here to trace thread and tls dtors
drop(runtime);
2024-05-25 20:16:28 +00:00
2024-06-16 19:46:32 +00:00
#[cfg(unix)]
if server.server.restarting.load(Ordering::Acquire) {
restart::restart();
}
debug_info!("Exit");
2024-05-09 15:59:08 -07:00
Ok(())
}
/// Operate the server normally in release-mode static builds. This will start,
/// run and stop the server within the asynchronous runtime.
#[cfg(any(not(conduwuit_mods), not(feature = "conduwuit_mods")))]
2024-12-08 20:31:16 +00:00
#[tracing::instrument(
name = "main",
parent = None,
skip_all
)]
2024-05-25 20:16:28 +00:00
async fn async_main(server: &Arc<Server>) -> Result<(), Error> {
2024-12-14 21:58:01 -05:00
extern crate conduwuit_router as router;
2024-05-09 15:59:08 -07:00
2024-07-27 07:17:07 +00:00
match router::start(&server.server).await {
| Ok(services) => server.services.lock().await.insert(services),
| Err(error) => {
2024-07-27 07:17:07 +00:00
error!("Critical error starting server: {error}");
return Err(error);
},
};
2024-05-09 15:59:08 -07:00
2024-07-27 07:17:07 +00:00
if let Err(error) = router::run(
server
.services
.lock()
.await
.as_ref()
.expect("services initialized"),
)
.await
{
2024-05-09 15:59:08 -07:00
error!("Critical error running server: {error}");
return Err(error);
}
2024-07-27 07:17:07 +00:00
if let Err(error) = router::stop(
server
.services
.lock()
.await
.take()
.expect("services initialied"),
)
.await
{
2024-05-09 15:59:08 -07:00
error!("Critical error stopping server: {error}");
return Err(error);
}
debug_info!("Exit runtime");
Ok(())
}
/// Operate the server in developer-mode dynamic builds. This will start, run,
/// and hot-reload portions of the server as-needed before returning for an
/// actual shutdown. This is not available in release-mode or static builds.
#[cfg(all(conduwuit_mods, feature = "conduwuit_mods"))]
2024-05-25 20:16:28 +00:00
async fn async_main(server: &Arc<Server>) -> Result<(), Error> {
2024-05-09 15:59:08 -07:00
let mut starts = true;
let mut reloads = true;
while reloads {
2024-05-25 20:16:28 +00:00
if let Err(error) = mods::open(server).await {
2024-05-09 15:59:08 -07:00
error!("Loading router: {error}");
return Err(error);
}
2024-05-25 20:16:28 +00:00
let result = mods::run(server, starts).await;
2024-05-09 15:59:08 -07:00
if let Ok(result) = result {
(starts, reloads) = result;
}
let force = !reloads || result.is_err();
2024-05-25 20:16:28 +00:00
if let Err(error) = mods::close(server, force).await {
2024-05-09 15:59:08 -07:00
error!("Unloading router: {error}");
return Err(error);
}
if let Err(error) = result {
error!("{error}");
return Err(error);
}
}
debug_info!("Exit runtime");
Ok(())
}