-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathtimer.c
45 lines (39 loc) · 1.53 KB
/
timer.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include "reactor-uc/timer.h"
#include "reactor-uc/environment.h"
#include "reactor-uc/logging.h"
void Timer_prepare(Trigger *_self, Event *event) {
(void)event;
LF_DEBUG(TRIG, "Preparing timer %p", _self);
Timer *self = (Timer *)_self;
Scheduler *sched = _self->parent->env->scheduler;
_self->is_present = true;
sched->register_for_cleanup(sched, _self);
LF_DEBUG(TRIG, "Triggering %d reactions", self->effects.size);
for (size_t i = 0; i < self->effects.size; i++) {
validaten(sched->add_to_reaction_queue(sched, self->effects.reactions[i]));
}
}
void Timer_cleanup(Trigger *_self) {
Timer *self = (Timer *)_self;
Environment *env = _self->parent->env;
Scheduler *sched = env->scheduler;
_self->is_present = false;
// Schedule next event unless it is a single-shot timer.
if (self->period > NEVER) {
tag_t next_tag = lf_delay_tag(sched->current_tag(sched), self->period);
Event event = EVENT_INIT(next_tag, _self, NULL);
sched->schedule_at(sched, &event);
}
}
void Timer_ctor(Timer *self, Reactor *parent, instant_t offset, interval_t period, Reaction **effects,
size_t effects_size, Reaction **observers, size_t observers_size) {
self->offset = offset;
self->period = period;
self->effects.reactions = effects;
self->effects.size = effects_size;
self->effects.num_registered = 0;
self->observers.reactions = observers;
self->observers.size = observers_size;
self->observers.num_registered = 0;
Trigger_ctor(&self->super, TRIG_TIMER, parent, NULL, Timer_prepare, Timer_cleanup);
}