summaryrefslogtreecommitdiff
path: root/shared-module/displayio/__init__.c
diff options
context:
space:
mode:
authorJeff Epler <jepler@gmail.com>2020-04-01 11:59:15 -0500
committerJeff Epler <jepler@gmail.com>2020-04-14 18:24:58 -0500
commit3a94412cd35c39bf30f29cb2b79be3870709c809 (patch)
tree8a2653aa8a7ca665f0f70b74172cc964d33504b2 /shared-module/displayio/__init__.c
parent1d8a073c05c36133e02d839ed187b9d7abf24d79 (diff)
protomatter: more memory allocation fixes
- bump supervisor alloc count by 4 (we actually use 5) - move reconstruct to after gc heap is reset - destroy protomatter object entirely if not used by a FramebufferDisplay - ensure previous supervisor allocations are released - zero out pointers so GC can collect them
Diffstat (limited to 'shared-module/displayio/__init__.c')
-rw-r--r--shared-module/displayio/__init__.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/shared-module/displayio/__init__.c b/shared-module/displayio/__init__.c
index 225aa2008..dfa3e7473 100644
--- a/shared-module/displayio/__init__.c
+++ b/shared-module/displayio/__init__.c
@@ -21,6 +21,18 @@
primary_display_t displays[CIRCUITPY_DISPLAY_LIMIT];
+STATIC bool any_display_uses_this_protomatter(protomatter_protomatter_obj_t* pm) {
+ for (uint8_t i = 0; i < CIRCUITPY_DISPLAY_LIMIT; i++) {
+ if (displays[i].framebuffer_display.base.type == &framebufferio_framebufferdisplay_type) {
+ framebufferio_framebufferdisplay_obj_t* display = &displays[i].framebuffer_display;
+ if (display->framebuffer == pm) {
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
// Check for recursive calls to displayio_background.
bool displayio_background_in_progress = false;
@@ -152,7 +164,9 @@ void reset_displays(void) {
#if CIRCUITPY_PROTOMATTER
} else if (displays[i].protomatter.base.type == &protomatter_Protomatter_type) {
protomatter_protomatter_obj_t * pm = &displays[i].protomatter;
- common_hal_protomatter_protomatter_reconstruct(pm, NULL);
+ if(!any_display_uses_this_protomatter(pm)) {
+ common_hal_protomatter_protomatter_deinit(pm);
+ }
#endif
} else {
// Not an active display bus.