-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathenvironment.c
101 lines (92 loc) · 3.47 KB
/
environment.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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include "reactor-uc/environment.h"
#include "reactor-uc/logging.h"
#include "reactor-uc/network_channel.h"
#include "reactor-uc/federated.h"
#include "reactor-uc/reactor.h"
#include "reactor-uc/scheduler.h"
#include <assert.h>
#include <inttypes.h>
void Environment_validate(Environment *self) {
Reactor_validate(self->main);
for (size_t i = 0; i < self->net_bundles_size; i++) {
FederatedConnectionBundle_validate(self->net_bundles[i]);
}
}
void Environment_assemble(Environment *self) {
validaten(self->main->calculate_levels(self->main));
Environment_validate(self);
if (self->net_bundles_size > 0) {
FederatedConnectionBundle_connect_to_peers(self->net_bundles, self->net_bundles_size);
}
}
void Environment_start(Environment *self) {
self->scheduler->acquire_and_schedule_start_tag(self->scheduler);
self->scheduler->run(self->scheduler);
}
lf_ret_t Environment_wait_until(Environment *self, instant_t wakeup_time) {
if (wakeup_time <= self->get_physical_time(self) || self->fast_mode) {
return LF_OK;
}
if (self->has_async_events) {
return self->platform->wait_until_interruptible(self->platform, wakeup_time);
} else {
return self->platform->wait_until(self->platform, wakeup_time);
}
}
interval_t Environment_get_logical_time(Environment *self) {
return self->scheduler->current_tag(self->scheduler).time;
}
interval_t Environment_get_elapsed_logical_time(Environment *self) {
return self->scheduler->current_tag(self->scheduler).time - self->scheduler->start_time;
}
interval_t Environment_get_physical_time(Environment *self) {
return self->platform->get_physical_time(self->platform);
}
interval_t Environment_get_elapsed_physical_time(Environment *self) {
if (self->scheduler->start_time == NEVER) {
return 0;
} else {
return self->platform->get_physical_time(self->platform) - self->scheduler->start_time;
}
}
void Environment_enter_critical_section(Environment *self) {
if (self->has_async_events) {
self->platform->enter_critical_section(self->platform);
}
}
void Environment_leave_critical_section(Environment *self) {
if (self->has_async_events) {
self->platform->leave_critical_section(self->platform);
}
}
void Environment_request_shutdown(Environment *self) { self->scheduler->request_shutdown(self->scheduler); }
void Environment_ctor(Environment *self, Reactor *main) {
self->main = main;
self->scheduler = Scheduler_new(self);
self->platform = Platform_new();
Platform_ctor(self->platform);
self->platform->initialize(self->platform);
self->net_bundles_size = 0;
self->assemble = Environment_assemble;
self->start = Environment_start;
self->wait_until = Environment_wait_until;
self->get_elapsed_logical_time = Environment_get_elapsed_logical_time;
self->get_logical_time = Environment_get_logical_time;
self->get_physical_time = Environment_get_physical_time;
self->get_elapsed_physical_time = Environment_get_elapsed_physical_time;
self->leave_critical_section = Environment_leave_critical_section;
self->enter_critical_section = Environment_enter_critical_section;
self->request_shutdown = Environment_request_shutdown;
self->has_async_events = false;
self->fast_mode = false;
self->startup = NULL;
self->shutdown = NULL;
}
void Environment_free(Environment *self) {
(void)self;
LF_INFO(ENV, "Reactor shutting down, freeing environment.");
for (size_t i = 0; i < self->net_bundles_size; i++) {
NetworkChannel *chan = self->net_bundles[i]->net_channel;
chan->free(chan);
}
}