summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Epler <jepler@gmail.com>2020-07-17 08:36:26 -0500
committerJeff Epler <jepler@gmail.com>2020-07-17 08:36:26 -0500
commita18a39210919a886d4efb4c52b85a309b3403abf (patch)
treead7b820c503bab7fafadfa00db1e89100a4ab2c6
parent81105cb9ef68c4d88eab206f111af448440c8f30 (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-xmain.c2
-rw-r--r--supervisor/background_callback.h5
-rw-r--r--supervisor/shared/background_callback.c6
3 files changed, 13 insertions, 0 deletions
diff --git a/main.c b/main.c
index ce95de95f..f928d0d62 100755
--- a/main.c
+++ b/main.c
@@ -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);
+}