use std::sync::Arc;
use bacnet_objects::database::ObjectDatabase;
use tokio::sync::{Notify, RwLock};
use crate::committed_cov::{BackgroundCommit, CommittedCov};
use crate::cov::CovSubscriptionTable;
pub(crate) async fn settle(
db: &Arc<RwLock<ObjectDatabase>>,
db_w: &mut ObjectDatabase,
cov_table: &RwLock<CovSubscriptionTable>,
) -> CommittedCov {
let work = db_w.take_membership_work_internal();
if work.is_empty() {
return CommittedCov::default();
}
let mut commit = BackgroundCommit::new();
for oid in work.changed {
commit.changed(oid);
}
crate::schedule::retry_for_created(db_w, &mut commit, &work.schedule_retries);
commit.finish(db, db_w, cov_table).await
}
pub(crate) async fn settle_committed(
db: &Arc<RwLock<ObjectDatabase>>,
cov_table: &RwLock<CovSubscriptionTable>,
) -> CommittedCov {
let mut db_w = db.write().await;
settle(db, &mut db_w, cov_table).await
}
pub(crate) fn install_waker(db: &mut ObjectDatabase) -> Arc<Notify> {
let notify = Arc::new(Notify::new());
let waker = Arc::clone(¬ify);
db.set_membership_waker_internal(Some(Arc::new(move || waker.notify_one())));
notify.notify_one();
notify
}