circuitpython/shared-module/_protomatter/allocator.h

30 lines
806 B
C
Raw Normal View History

2020-03-10 14:12:01 -04:00
#ifndef MICROPY_INCLUDED_SHARED_MODULE_PROTOMATTER_ALLOCATOR_H
#define MICROPY_INCLUDED_SHARED_MODULE_PROTOMATTER_ALLOCATOR_H
#include <stdbool.h>
#include "py/gc.h"
2020-03-10 14:12:01 -04:00
#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)
2020-03-10 14:12:01 -04:00
static inline void *_PM_allocator_impl(size_t sz) {
if (gc_alloc_possible()) {
2020-03-10 14:12:01 -04:00
return m_malloc(sz + sizeof(void*), true);
} else {
supervisor_allocation *allocation = allocate_memory(align32_size(sz), false);
return allocation ? allocation->ptr : NULL;
2020-03-10 14:12:01 -04:00
}
}
static inline void _PM_free_impl(void *ptr_in) {
supervisor_allocation *allocation = allocation_from_ptr(ptr_in);
2020-03-10 14:12:01 -04:00
if (allocation) {
free_memory(allocation);
}
}
#endif