mirror of
https://github.com/apache/nuttx.git
synced 2026-08-18 11:41:51 +08:00
A fetch() only lower half is always ready, so a subscriber that asked for a rate with SNIOC_SET_INTERVAL got no pacing from poll(): the descriptor reported POLLIN on every pass and the application had to sleep out the period itself. That does not compose. An application polling several topics reads them sequentially from one thread, so per read sleeps serialize: three topics at 10 Hz sleeping 100 ms each yield 3.3 Hz per topic rather than 10. Pace it where poll() can act on it instead. A subscriber that never requested a rate stays always ready, and one that did becomes ready once per its own interval, driven by a watchdog armed in sensor_poll(). This is the fetch() side of what sensor_is_updated() already does for a pushing lower half, so both models now honor a requested rate the same way. The wdog_s lives in sensor_user_s rather than in the device, so each subscriber is paced at its own interval instead of at the minimum across all of them, and the timer only runs while somebody is polling. The expiry runs in timer context and takes no lock: poll_notify() is safe from an interrupt handler, and a teardown that raced it has already cleared fds, which makes both the notify and the re-arm no-ops. Teardown therefore just cancels the watchdog where it clears fds, and a watchdog keeps this off the work queue entirely, which a fetch() only sensor exists to avoid. sensor_close() needs nothing of its own: poll_setup() holds a reference on the file for the duration of the poll, so file_close() cannot run until poll_teardown() has called sensor_poll() with setup false, and that already cancelled the watchdog. Assisted-by: Claude:claude-sonnet-5 Signed-off-by: Felipe Moura <moura.fmo@gmail.com>