Skip to content

Commit 77d6205

Browse files
committed
src: fixing problem where tardy handlers inside hierarchy where not invoked
1 parent 3c38945 commit 77d6205

File tree

8 files changed

+81
-40
lines changed

8 files changed

+81
-40
lines changed

include/reactor-uc/connection.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,12 @@ struct Connection {
2525
size_t downstreams_registered; // Number of downstreams currently registered
2626
void (*register_downstream)(Connection *, Port *);
2727
Port *(*get_final_upstream)(Connection *);
28-
void (*trigger_downstreams)(Connection *, const void *value_ptr, size_t value_size);
28+
void (*trigger_downstreams)(Connection *, tag_t intended_tag, const void *value_ptr, size_t value_size);
2929
};
3030

3131
void Connection_ctor(Connection *self, TriggerType type, Reactor *parent, Port **downstreams, size_t num_downstreams,
3232
EventPayloadPool *payload_pool, void (*prepare)(Trigger *, Event *), void (*cleanup)(Trigger *),
33-
void (*trigger_downstreams)(Connection *, const void *, size_t));
33+
void (*trigger_downstreams)(Connection *, tag_t, const void *, size_t));
3434

3535
struct LogicalConnection {
3636
Connection super;
@@ -44,6 +44,7 @@ struct DelayedConnection {
4444
ConnectionType type;
4545
EventPayloadPool payload_pool;
4646
void *staged_payload_ptr;
47+
tag_t intended_tag;
4748
};
4849

4950
void DelayedConnection_ctor(DelayedConnection *self, Reactor *parent, Port **downstreams, size_t num_downstreams,

lfc/core/src/main/java/org/lflang/generator/LFGenerator.java

Lines changed: 5 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -37,33 +37,14 @@ public static FileConfig createFileConfig(
3737
final Target target = Target.fromDecl(ASTUtils.targetDecl(resource));
3838
assert target != null;
3939

40-
// if (FedASTUtils.findFederatedReactor(resource) != null) {
41-
// return new FederationFileConfig(resource, srcGenBasePath, useHierarchicalBin);
42-
// }
43-
44-
return switch (target) {
45-
// case CCPP, C -> new CFileConfig(resource, srcGenBasePath, useHierarchicalBin);
46-
// case Python -> new PyFileConfig(resource, srcGenBasePath, useHierarchicalBin);
47-
// case CPP -> new CppFileConfig(resource, srcGenBasePath, useHierarchicalBin);
48-
// case Rust -> new RustFileConfig(resource, srcGenBasePath, useHierarchicalBin);
49-
// case TS -> new TSFileConfig(resource, srcGenBasePath, useHierarchicalBin);
50-
case UC -> new UcFileConfig(resource, srcGenBasePath, useHierarchicalBin, runtimeSymlink);
51-
};
40+
return new UcFileConfig(resource, srcGenBasePath, useHierarchicalBin, runtimeSymlink);
5241
}
5342

5443
/** Create a generator object for the given target. */
5544
private GeneratorBase createGenerator(LFGeneratorContext context) {
5645
final Target target = Target.fromDecl(ASTUtils.targetDecl(context.getFileConfig().resource));
5746
assert target != null;
58-
return switch (target) {
59-
// case C -> new CGenerator(context, false);
60-
// case CCPP -> new CGenerator(context, true);
61-
// case Python -> new PythonGenerator(context);
62-
// case CPP -> new CppGenerator(context, scopeProvider);
63-
// case TS -> new TSGenerator(context);
64-
// case Rust -> new RustGenerator(context, scopeProvider);
65-
case UC -> createUcGenerator(context, scopeProvider);
66-
};
47+
return createUcGenerator(context, scopeProvider);
6748
}
6849

6950
@Override
@@ -80,11 +61,10 @@ public void doGenerate(Resource resource, IFileSystemAccess2 fsa, IGeneratorCont
8061
if (lfContext.getMode() == LFGeneratorContext.Mode.LSP_FAST) return;
8162

8263
final GeneratorBase generator = createGenerator(lfContext);
83-
if (generator != null) {
84-
generatorErrorsOccurred = generator.errorsOccurred();
85-
generator.doGenerate(resource, lfContext);
86-
}
64+
generatorErrorsOccurred = generator.errorsOccurred();
65+
generator.doGenerate(resource, lfContext);
8766
final MessageReporter messageReporter = lfContext.getErrorReporter();
67+
8868
if (messageReporter instanceof LanguageServerMessageReporter) {
8969
((LanguageServerMessageReporter) messageReporter).publishDiagnostics();
9070
}

src/connection.c

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ void Connection_register_downstream(Connection *self, Port *port) {
4040
/**
4141
* @brief Recursively walks down connection graph and copies value into Input ports and triggers reactions.
4242
*/
43-
void LogicalConnection_trigger_downstreams(Connection *self, const void *value, size_t value_size) {
43+
void LogicalConnection_trigger_downstreams(Connection *self, tag_t intended_tag, const void *value, size_t value_size) {
4444
LF_DEBUG(CONN, "Triggering downstreams of %p with value %p", self, value);
4545
for (size_t i = 0; i < self->downstreams_registered; i++) {
4646
Port *down = self->downstreams[i];
@@ -54,19 +54,20 @@ void LogicalConnection_trigger_downstreams(Connection *self, const void *value,
5454
// "last write wins"
5555
if (!down->super.is_present) {
5656
down->super.prepare(&down->super, NULL);
57+
down->intended_tag = intended_tag;
5758
}
5859
}
5960

6061
for (size_t i = 0; i < down->conns_out_registered; i++) {
6162
LF_DEBUG(CONN, "Found further downstream connection %p to recurse down", down->conns_out[i]);
62-
down->conns_out[i]->trigger_downstreams(down->conns_out[i], value, value_size);
63+
down->conns_out[i]->trigger_downstreams(down->conns_out[i], intended_tag, value, value_size);
6364
}
6465
}
6566
}
6667

6768
void Connection_ctor(Connection *self, TriggerType type, Reactor *parent, Port **downstreams, size_t num_downstreams,
6869
EventPayloadPool *payload_pool, void (*prepare)(Trigger *, Event *), void (*cleanup)(Trigger *),
69-
void (*trigger_downstreams)(Connection *, const void *, size_t)) {
70+
void (*trigger_downstreams)(Connection *, tag_t, const void *, size_t)) {
7071

7172
self->upstream = NULL;
7273
self->downstreams_size = num_downstreams;
@@ -100,7 +101,7 @@ void DelayedConnection_prepare(Trigger *trigger, Event *event) {
100101
trigger->is_present = true;
101102
sched->register_for_cleanup(sched, trigger);
102103

103-
LogicalConnection_trigger_downstreams(&self->super, event->super.payload, pool->payload_size);
104+
LogicalConnection_trigger_downstreams(&self->super, event->intended_tag, event->super.payload, pool->payload_size);
104105
validate(pool->free(pool, event->super.payload) == LF_OK);
105106
}
106107

@@ -123,7 +124,7 @@ void DelayedConnection_cleanup(Trigger *trigger) {
123124
if (self->type == PHYSICAL_CONNECTION) {
124125
base_tag.time = env->get_physical_time(env);
125126
} else {
126-
base_tag = sched->current_tag(sched);
127+
base_tag = self->intended_tag;
127128
}
128129
tag_t tag = lf_delay_tag(base_tag, self->delay);
129130
Event event = EVENT_INIT(tag, &self->super.super, self->staged_payload_ptr);
@@ -132,7 +133,8 @@ void DelayedConnection_cleanup(Trigger *trigger) {
132133
}
133134
}
134135

135-
void DelayedConnection_trigger_downstreams(Connection *_self, const void *value, size_t value_size) {
136+
void DelayedConnection_trigger_downstreams(Connection *_self, tag_t intended_tag, const void *value,
137+
size_t value_size) {
136138
DelayedConnection *self = (DelayedConnection *)_self;
137139
assert(value);
138140
assert(value_size > 0);
@@ -149,6 +151,7 @@ void DelayedConnection_trigger_downstreams(Connection *_self, const void *value,
149151
return;
150152
}
151153
}
154+
self->intended_tag = intended_tag;
152155
memcpy(self->staged_payload_ptr, value, value_size);
153156
sched->register_for_cleanup(sched, &_self->super);
154157
}

src/federated.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77

88
// Called when a reaction does lf_set(outputPort). Should buffer the output data
99
// for later transmission.
10-
void FederatedOutputConnection_trigger_downstream(Connection *_self, const void *value, size_t value_size) {
10+
void FederatedOutputConnection_trigger_downstream(Connection *_self, tag_t intended_tag, const void *value,
11+
size_t value_size) {
12+
(void)intended_tag;
1113
LF_DEBUG(FED, "Triggering downstreams on federated output connection %p. Stage for later TX", _self);
1214
lf_ret_t ret;
1315
FederatedOutputConnection *self = (FederatedOutputConnection *)_self;
@@ -111,7 +113,8 @@ void FederatedInputConnection_prepare(Trigger *trigger, Event *event) {
111113

112114
for (size_t i = 0; i < down->conns_out_registered; i++) {
113115
LF_DEBUG(CONN, "Found further downstream connection %p to recurse down", down->conns_out[i]);
114-
down->conns_out[i]->trigger_downstreams(down->conns_out[i], event->super.payload, pool->payload_size);
116+
down->conns_out[i]->trigger_downstreams(down->conns_out[i], event->intended_tag, event->super.payload,
117+
pool->payload_size);
115118
}
116119

117120
pool->free(pool, event->super.payload);

src/port.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ void Port_set(Port *self, const void *value) {
3737

3838
for (size_t i = 0; i < self->conns_out_registered; i++) {
3939
Connection *conn = self->conns_out[i];
40-
conn->trigger_downstreams(conn, value, self->value_size);
40+
const Environment *env = self->super.parent->env;
41+
conn->trigger_downstreams(conn, env->scheduler->current_tag(env->scheduler), value, self->value_size);
4142
}
4243
}
4344

src/schedulers/dynamic/scheduler.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -131,19 +131,21 @@ void Scheduler_clean_up_timestep(Scheduler *untyped_self) {
131131
}
132132

133133
/**
134-
* @brief Checks for safe-to-prcess violations for the given reaction. If a violation is detected
134+
* @brief Checks for safe-to-process violations for the given reaction. If a violation is detected
135135
* the violation handler is called.
136136
*
137137
* @param self
138138
* @param reaction
139139
* @return true if a violation was detected and handled, false otherwise.
140140
*/
141141
static bool _Scheduler_check_and_handle_stp_violations(DynamicScheduler *self, Reaction *reaction) {
142-
Reactor *parent = reaction->parent;
142+
const Reactor *parent = reaction->parent;
143143
for (size_t i = 0; i < parent->triggers_size; i++) {
144144
Trigger *trigger = parent->triggers[i];
145145
if (trigger->type == TRIG_INPUT && trigger->is_present) {
146-
Port *port = (Port *)trigger;
146+
const Port *port = (Port *)trigger;
147+
LF_DEBUG(SCHED, "Intended Tag: " PRINTF_TAG, port->intended_tag);
148+
LF_DEBUG(SCHED, "Current Tag: " PRINTF_TAG, self->current_tag);
147149
if (lf_tag_compare(port->intended_tag, self->current_tag) == 0) {
148150
continue;
149151
}

test/lf/src/FederatedMaxWait2.lf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,4 @@ federated reactor {
4141
@maxwait(forever)
4242
r2 = new Dst()
4343
r1.out -> r2.in
44-
}
44+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
target uC {
2+
platform: Native,
3+
timeout: 5sec,
4+
logging: DEBUG
5+
}
6+
7+
reactor Src(id: int = 0) {
8+
output out: int
9+
reaction(startup) -> out{=
10+
printf("Hello from Src!\n");
11+
env->platform->wait_for(env->platform, SEC(2));
12+
lf_set(out, 42);
13+
env->request_shutdown(env);
14+
=}
15+
}
16+
17+
reactor Dst {
18+
input in: int
19+
state check2: bool = false
20+
reaction(startup, in) {=
21+
printf("Dst startup\n");
22+
validate(!self->check2);
23+
printf("Dst is input present? %d\n", lf_is_present(in));
24+
validate(lf_is_present(in));
25+
printf("Hello from Dst!\n");
26+
self->check2 = true;
27+
env->request_shutdown(env);
28+
=} tardy {=
29+
printf("STP violation\n");
30+
// STP violation should not happen because maxwait is forever.
31+
validate(false);
32+
env->request_shutdown(env);
33+
=}
34+
35+
reaction(shutdown) {=
36+
validate(self->check2);
37+
=}
38+
}
39+
40+
reactor Container {
41+
input in: int
42+
r1 = new Dst()
43+
in -> r1.in
44+
}
45+
46+
federated reactor {
47+
r1 = new Src()
48+
@maxwait(forever)
49+
r2 = new Container()
50+
r1.out -> r2.in
51+
}

0 commit comments

Comments
 (0)