summaryrefslogtreecommitdiff
path: root/shared-module/rgbmatrix/allocator.h
blob: b7f517ce5b7168e0b0e8d1e0c1de33ba807ba7ee (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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