diff options
| author | Jeff Epler <jepler@gmail.com> | 2020-07-17 08:36:26 -0500 |
|---|---|---|
| committer | Jeff Epler <jepler@gmail.com> | 2020-07-17 08:36:26 -0500 |
| commit | a18a39210919a886d4efb4c52b85a309b3403abf (patch) | |
| tree | ad7b820c503bab7fafadfa00db1e89100a4ab2c6 | |
| parent | 81105cb9ef68c4d88eab206f111af448440c8f30 (diff) | |
background_callback: Add gc collect callback
A background callback must never outlive its related object. By
collecting the head of the linked list of background tasks, this will
not happen.
One hypothetical case where this could happen is if an MP3Decoder is
deleted while its callback to fill its buffer is scheduled.
| -rwxr-xr-x | main.c | 2 | ||||
| -rw-r--r-- | supervisor/background_callback.h | 5 | ||||
| -rw-r--r-- | supervisor/shared/background_callback.c | 6 |
3 files changed, 13 insertions, 0 deletions
@@ -493,6 +493,8 @@ void gc_collect(void) { // have lost their references in the VM even though they are mounted. gc_collect_root((void**)&MP_STATE_VM(vfs_mount_table), sizeof(mp_vfs_mount_t) / sizeof(mp_uint_t)); + background_callback_gc_collect(); + #if CIRCUITPY_DISPLAYIO displayio_gc_collect(); #endif diff --git a/supervisor/background_callback.h b/supervisor/background_callback.h index 82025f6b7..535dd656b 100644 --- a/supervisor/background_callback.h +++ b/supervisor/background_callback.h @@ -79,4 +79,9 @@ void background_callback_reset(void); void background_callback_begin_critical_section(void); void background_callback_end_critical_section(void); +/* + * Background callbacks may stop objects from being collected + */ +void background_callback_gc_collect(void); + #endif diff --git a/supervisor/shared/background_callback.c b/supervisor/shared/background_callback.c index e45c9b5c3..1be3cae2b 100644 --- a/supervisor/shared/background_callback.c +++ b/supervisor/shared/background_callback.c @@ -24,6 +24,7 @@ * THE SOFTWARE. */ +#include "py/gc.h" #include "py/mpconfig.h" #include "supervisor/background_callback.h" #include "supervisor/shared/tick.h" @@ -105,3 +106,8 @@ void background_callback_reset() { in_background_callback = false; CALLBACK_CRITICAL_END; } + +void background_callback_gc_collect(void) { + background_callback_t *cb = (background_callback_t*)callback_head; + gc_collect_ptr(cb); +} |
