1 /* 2 * This file is part of the MicroPython project, http://micropython.org/ 3 * 4 * The MIT License (MIT) 5 * 6 * Copyright (c) 2013, 2014 Damien P. George 7 * 8 * Permission is hereby granted, free of charge, to any person obtaining a copy 9 * of this software and associated documentation files (the "Software"), to deal 10 * in the Software without restriction, including without limitation the rights 11 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 12 * copies of the Software, and to permit persons to whom the Software is 13 * furnished to do so, subject to the following conditions: 14 * 15 * The above copyright notice and this permission notice shall be included in 16 * all copies or substantial portions of the Software. 17 * 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 24 * THE SOFTWARE. 25 */ 26 #ifndef MICROPY_INCLUDED_PY_GC_H 27 #define MICROPY_INCLUDED_PY_GC_H 28 29 #include <stdbool.h> 30 #include <stddef.h> 31 32 void gc_init(void *start, void *end); 33 34 // These lock/unlock functions can be nested. 35 // They can be used to prevent the GC from allocating/freeing. 36 void gc_lock(void); 37 void gc_unlock(void); 38 bool gc_is_locked(void); 39 40 // A given port must implement gc_collect by using the other collect functions. 41 void gc_collect(void); 42 void gc_collect_start(void); 43 void gc_collect_root(void **ptrs, size_t len); 44 void gc_collect_end(void); 45 46 // Use this function to sweep the whole heap and run all finalisers 47 void gc_sweep_all(void); 48 49 enum { 50 GC_ALLOC_FLAG_HAS_FINALISER = 1, 51 }; 52 53 void *gc_alloc(size_t n_bytes, unsigned int alloc_flags); 54 void gc_free(void *ptr); // does not call finaliser 55 size_t gc_nbytes(const void *ptr); 56 void *gc_realloc(void *ptr, size_t n_bytes, bool allow_move); 57 58 typedef struct _gc_info_t { 59 size_t total; 60 size_t used; 61 size_t free; 62 size_t max_free; 63 size_t num_1block; 64 size_t num_2block; 65 size_t max_block; 66 } gc_info_t; 67 68 void gc_info(gc_info_t *info); 69 void gc_dump_info(void); 70 void gc_dump_alloc_table(void); 71 72 #endif // MICROPY_INCLUDED_PY_GC_H 73