diff --git a/libuavcan/include/uavcan/node/scheduler.hpp b/libuavcan/include/uavcan/node/scheduler.hpp index 241d907897..363ea4ab96 100644 --- a/libuavcan/include/uavcan/node/scheduler.hpp +++ b/libuavcan/include/uavcan/node/scheduler.hpp @@ -70,6 +70,7 @@ class Scheduler : Noncopyable MonotonicTime prev_cleanup_ts_; MonotonicDuration deadline_resolution_; MonotonicDuration cleanup_period_; + bool inside_spin_; MonotonicTime computeDispatcherSpinDeadline(MonotonicTime spin_deadline) const; void pollCleanup(MonotonicTime mono_ts, uint32_t num_frames_processed_with_last_spin); @@ -80,6 +81,7 @@ public: , prev_cleanup_ts_(sysclock.getMonotonic()) , deadline_resolution_(MonotonicDuration::fromMSec(DefaultDeadlineResolutionMs)) , cleanup_period_(MonotonicDuration::fromMSec(DefaultCleanupPeriodMs)) + , inside_spin_(false) { } int spin(MonotonicTime deadline); diff --git a/libuavcan/src/node/scheduler.cpp b/libuavcan/src/node/scheduler.cpp index 2708082b7e..3e0e12b3ad 100644 --- a/libuavcan/src/node/scheduler.cpp +++ b/libuavcan/src/node/scheduler.cpp @@ -154,6 +154,13 @@ void Scheduler::pollCleanup(MonotonicTime mono_ts, uint32_t num_frames_processed int Scheduler::spin(MonotonicTime deadline) { + if (inside_spin_) // Preventing recursive calls + { + assert(0); + return -1; + } + inside_spin_ = true; + int retval = 0; while (true) { @@ -171,6 +178,8 @@ int Scheduler::spin(MonotonicTime deadline) break; } } + + inside_spin_ = false; return retval; }