summaryrefslogtreecommitdiff
path: root/shared-module/_protomatter/allocator.h
diff options
context:
space:
mode:
authorJeff Epler <jeff@adafruit.com>2020-04-14 18:55:40 -0500
committerGitHub <noreply@github.com>2020-04-14 18:55:40 -0500
commit7ed1483b89d24bb4dd44f9c4c8271c438303b9fe (patch)
tree6b138af871bea8cb57eaae23a1d6433bfe1bdece /shared-module/_protomatter/allocator.h
parentada102dd986bb03186978579cc909da5c66772d6 (diff)
parent3c018bf7fd8142132bdd063a9c898188c825b2a7 (diff)
Merge pull request #2706 from jepler/protomatter
Protomatter: Integrate with CircuitPython
Diffstat (limited to 'shared-module/_protomatter/allocator.h')
-rw-r--r--shared-module/_protomatter/allocator.h29
1 files changed, 29 insertions, 0 deletions
diff --git a/shared-module/_protomatter/allocator.h b/shared-module/_protomatter/allocator.h
new file mode 100644
index 000000000..b7f517ce5
--- /dev/null
+++ b/shared-module/_protomatter/allocator.h
@@ -0,0 +1,29 @@
+#ifndef MICROPY_INCLUDED_SHARED_MODULE_PROTOMATTER_ALLOCATOR_H
+#define MICROPY_INCLUDED_SHARED_MODULE_PROTOMATTER_ALLOCATOR_H
+
+#include <stdbool.h>
+#include "py/gc.h"
+#include "py/misc.h"
+#include "supervisor/memory.h"
+
+#define _PM_ALLOCATOR _PM_allocator_impl
+#define _PM_FREE(x) (_PM_free_impl((x)), (x)=NULL, (void)0)
+
+static inline void *_PM_allocator_impl(size_t sz) {
+ if (gc_alloc_possible()) {
+ return m_malloc(sz + sizeof(void*), true);
+ } else {
+ supervisor_allocation *allocation = allocate_memory(align32_size(sz), false);
+ return allocation ? allocation->ptr : NULL;
+ }
+}
+
+static inline void _PM_free_impl(void *ptr_in) {
+ supervisor_allocation *allocation = allocation_from_ptr(ptr_in);
+
+ if (allocation) {
+ free_memory(allocation);
+ }
+}
+
+#endif