use crate::EventLoopCtx;
use crate::posix_event_loop::js_vm_ctx;
#[derive(Default)]
pub struct KeepAlive {
status: Status,
}
#[derive(Copy, Clone, PartialEq, Eq, Default)]
enum Status {
Active,
#[default]
Inactive,
Done,
}
impl KeepAlive {
#[inline]
pub fn is_active(&self) -> bool {
self.status == Status::Active
}
pub fn disable(&mut self) {
self.unref(js_vm_ctx());
self.status = Status::Done;
}
#[cfg(not(windows))]
pub fn deactivate(&mut self, loop_: &mut crate::Loop) {
if self.status != Status::Active {
return;
}
self.status = Status::Inactive;
loop_.sub_active(1);
}
#[cfg(windows)]
pub fn deactivate(&mut self, loop_: &mut crate::Loop) {
if self.status != Status::Active {
return;
}
self.status = Status::Inactive;
loop_.dec();
}
#[cfg(not(windows))]
pub fn activate(&mut self, loop_: &mut crate::Loop) {
if self.status != Status::Inactive {
return;
}
self.status = Status::Active;
loop_.add_active(1);
}
#[cfg(windows)]
pub fn activate(&mut self, loop_: &mut crate::Loop) {
if self.status != Status::Active {
return;
}
self.status = Status::Active;
loop_.inc();
}
pub fn init() -> KeepAlive {
KeepAlive::default()
}
pub fn unref(&mut self, event_loop_ctx: EventLoopCtx) {
if self.status != Status::Active {
return;
}
self.status = Status::Inactive;
#[cfg(not(windows))]
event_loop_ctx.loop_unref();
#[cfg(windows)]
event_loop_ctx.loop_sub_active(1);
}
pub fn unref_concurrently(&mut self, vm: EventLoopCtx) {
if self.status != Status::Active {
return;
}
self.status = Status::Inactive;
vm.unref_concurrently();
}
pub fn unref_on_next_tick(&mut self, event_loop_ctx: EventLoopCtx) {
if self.status != Status::Active {
return;
}
self.status = Status::Inactive;
#[cfg(not(windows))]
event_loop_ctx.increment_pending_unref_counter();
#[cfg(windows)]
event_loop_ctx.loop_dec();
}
pub fn unref_on_next_tick_concurrently(&mut self, vm: EventLoopCtx) {
if self.status != Status::Active {
return;
}
self.status = Status::Inactive;
#[cfg(not(windows))]
vm.increment_pending_unref_counter();
#[cfg(windows)]
vm.loop_dec();
}
pub fn ref_(&mut self, event_loop_ctx: EventLoopCtx) {
if self.status != Status::Inactive {
return;
}
self.status = Status::Active;
event_loop_ctx.loop_ref();
}
#[inline]
pub fn r#ref(&mut self, event_loop_ctx: EventLoopCtx) {
self.ref_(event_loop_ctx)
}
pub fn ref_concurrently(&mut self, vm: EventLoopCtx) {
if self.status != Status::Inactive {
return;
}
self.status = Status::Active;
vm.ref_concurrently();
}
pub fn ref_concurrently_from_event_loop(&mut self, loop_: EventLoopCtx) {
self.ref_concurrently(loop_);
}
pub fn unref_concurrently_from_event_loop(&mut self, loop_: EventLoopCtx) {
self.unref_concurrently(loop_);
}
}