The Perl Toolchain Summit 2025 Needs You: You can help 🙏 Learn more

#include "unix/guts.h"
static void
inactivate_timer( PTimerSysData sys)
{
if ( sys-> older || sys-> younger || guts. oldest == sys) {
if ( sys-> older) {
sys-> older-> younger = sys-> younger;
} else {
guts. oldest = sys-> younger;
}
if ( sys-> younger)
sys-> younger-> older = sys-> older;
}
sys-> older = NULL;
sys-> younger = NULL;
}
static void
fetch_sys_timer( Handle self, PTimerSysData *s, Bool *real_timer)
{
if ( self == 0) {
*s = NULL;
*real_timer = false;
} else if ( self >= FIRST_SYS_TIMER && self <= LAST_SYS_TIMER) {
*s = &guts. sys_timers[ self - FIRST_SYS_TIMER];
*real_timer = false;
} else {
*s = ((PTimerSysData)(PComponent((self))-> sysData));
*real_timer = true;
}
}
#define ENTERTIMER \
PTimerSysData sys; \
Bool real; \
\
fetch_sys_timer( self, &sys, &real)
Bool
apc_timer_create( Handle self)
{
ENTERTIMER;
sys-> type.timer = true;
inactivate_timer( sys);
sys-> who = self;
if (real)
apc_component_fullname_changed_notify( self);
return true;
}
Bool
apc_timer_destroy( Handle self)
{
ENTERTIMER;
inactivate_timer( sys);
sys-> timeout = 0;
if (real) opt_clear( optActive);
return true;
}
int
apc_timer_get_timeout( Handle self)
{
ENTERTIMER;
return sys-> timeout;
}
Bool
apc_timer_set_timeout( Handle self, int timeout)
{
ENTERTIMER;
sys-> timeout = timeout;
if ( !real || is_opt( optActive))
apc_timer_start( self);
return real ? (prima_guts.application != NULL_HANDLE) : true;
}
Bool
apc_timer_start( Handle self)
{
PTimerSysData before;
ENTERTIMER;
inactivate_timer( sys);
if ( real && !prima_guts.application ) return false;
gettimeofday( &sys-> when, NULL);
sys-> when. tv_sec += sys-> timeout / 1000;
sys-> when. tv_usec += (sys-> timeout % 1000) * 1000;
before = guts. oldest;
if ( before) {
while ( before-> when. tv_sec < sys-> when. tv_sec ||
( before-> when. tv_sec == sys-> when. tv_sec &&
before-> when. tv_usec <= sys-> when. tv_usec)) {
if ( !before-> younger) {
before-> younger = sys;
sys-> older = before;
before = NULL;
break;
}
before = before-> younger;
}
if ( before) {
if ( before-> older) {
sys-> older = before-> older;
before-> older-> younger = sys;
} else {
guts. oldest = sys;
}
sys-> younger = before;
before-> older = sys;
}
} else {
guts. oldest = sys;
}
if ( real ) opt_set( optActive);
return true;
}
Bool
apc_timer_stop( Handle self)
{
ENTERTIMER;
inactivate_timer( sys);
if ( real) opt_clear( optActive);
return true;
}
ApiHandle
apc_timer_get_handle( Handle self)
{
ENTERTIMER;
return (ApiHandle) sys;
}