Skip to content

Commit 6f3c57b

Browse files
dok-netdevyte
authored andcommitted
Fix issue with functions scheduled from scheduled functions (#6770)
Calling schedule_function() from a scheduled function would result in an infinite loop, because the list traversal would never end.
1 parent 2f26d94 commit 6f3c57b

File tree

1 file changed

+14
-4
lines changed

1 file changed

+14
-4
lines changed

cores/esp8266/Schedule.cpp

+14-4
Original file line numberDiff line numberDiff line change
@@ -119,23 +119,33 @@ void run_scheduled_functions()
119119
{
120120
esp8266::polledTimeout::periodicFastMs yieldNow(100); // yield every 100ms
121121

122-
while (sFirst)
122+
// prevent scheduling of new functions during this run
123+
auto stop = sLast;
124+
bool done = false;
125+
while (sFirst && !done)
123126
{
127+
done = sFirst == stop;
128+
124129
sFirst->mFunc();
125130

126131
{
132+
// remove function from stack
127133
esp8266::InterruptLock lockAllInterruptsInThisScope;
128134

129135
auto to_recycle = sFirst;
130-
sFirst = sFirst->mNext;
131-
if (!sFirst)
136+
137+
// removing rLast
138+
if (sLast == sFirst)
132139
sLast = nullptr;
140+
141+
sFirst = sFirst->mNext;
142+
133143
recycle_fn_unsafe(to_recycle);
134144
}
135145

136146
if (yieldNow)
137147
{
138-
// because scheduled function are allowed to last:
148+
// because scheduled functions might last too long for watchdog etc,
139149
// this is yield() in cont stack:
140150
esp_schedule();
141151
cont_yield(g_pcont);

0 commit comments

Comments
 (0)