Change to `mp_handle_pending' includes possible MICROPY_EVENT_POLL_HOOK and downstream code breakage
Port, board and/or hardware
all
MicroPython version
1.27+
Reproduction
For long-running processes handled by user C modules (eg: busy wait on e-ink update) I've been using the pattern:
extern void mp_handle_pending_internal(bool);
mp_handle_pending(true);
I tried to build against 1.27 today, and ran into this build error:
modules/c/ssd1680/ssd1680.cpp.o: in function `pimoroni::SSD1680::busy_wait()':
modules/c/ssd1680/ssd1680.cpp:54:(.text._ZN8pimoroni7SSD16809busy_waitEv+0x10): undefined reference to `mp_handle_pending'
This looks like it was introduced by https://github.com/micropython/micropython/commit/c57aebf790c40125b663231ec4307d2a3f3cf193
This PR seems to make the assumption that mp_handle_pending is only ever called inline in runtime.h, or in code that uses:
#include "runtime.h"
mp_handle_pending(true);
This assumption doesn't seem to hold true, for example the same "undefined reference" error should occur if an attempt is made to call "MICROPY_EVENT_POLL_HOOK" from Zephyr code:
https://github.com/micropython/micropython/blob/26c16969ab954db4d8d79bed154e3d45c12c087f/ports/zephyr/mpconfigport.h#L171-L172
But I guess runtime.h is implicitly available here? In any case making the "extern" line redundant and this pattern should probably be updated where it occurs.
Either way the inline wrapper to preserve the old mp_handle_pending behaviour does not cover all possible cases, causing a break in my code from 1.26 to 1.27.
I expect breakage, though, so I'd propose the implicit "example" uses in the MicroPython codebase (there are a few things like "MICROPY_EVENT_POLL_HOOK") are updated and this issue should, with any luck, steer any future encounters (I'll probably forget and run into this again) toward the correct usage.
Expected behaviour
Observed behaviour
Additional Information
No, I've provided everything above.
Code of Conduct
Yes, I agree
stm32: Convert port to use new event waiting functions.
Summary
Convert the stm32 port from the old MICROPY_EVENT_POLL_HOOK macro to use the new mp_event_wait_xxx() functions in conjunction with MICROPY_INTERNAL_WFE.
This change should be functionally equivalent to the existing behaivour because mp_event_wait_ms() and mp_event_wait_indefinite() are equal to mp_handle_pending(true); __WFI();, which is what MICROPY_EVENT_POLL_HOOK was.
Testing
Tested on PYBD_SF6 running the test suite.
Trade-offs and Alternatives
The stm32 port doesn't have the ability to "wait for event" for an extended period of time, it only has wfi. So that's all that is used for MICROPY_INTERNAL_WFE, similar to the renesas-ra port.
The CYW43_EVENT_POLL_HOOK macro needed to be overridden, otherwise it would just call mp_event_handle_nowait() which would create power hungry busy loops.