void gc_test(void) { machine_uint_t len = 500; machine_uint_t *heap = malloc(len); gc_init(heap, heap + len / sizeof(machine_uint_t)); void *ptrs[100]; { machine_uint_t **p = gc_alloc(16, false); p[0] = gc_alloc(64, false); p[1] = gc_alloc(1, false); p[2] = gc_alloc(1, false); p[3] = gc_alloc(1, false); machine_uint_t ***p2 = gc_alloc(16, false); p2[0] = p; p2[1] = p; ptrs[0] = p2; } for (int i = 0; i < 25; i+=2) { machine_uint_t *p = gc_alloc(i, false); printf("p=%p\n", p); if (i & 3) { //ptrs[i] = p; } } printf("Before GC:\n"); gc_dump_alloc_table(); printf("Starting GC...\n"); gc_collect_start(); gc_collect_root(ptrs, sizeof(ptrs) / sizeof(void*)); gc_collect_end(); printf("After GC:\n"); gc_dump_alloc_table(); }
void gc_collect(void) { // WARNING: This gc_collect implementation doesn't try to get root // pointers from CPU registers, and thus may function incorrectly. void *dummy; gc_collect_start(); gc_collect_root(&dummy, ((mp_uint_t)stack_top - (mp_uint_t)&dummy) / sizeof(mp_uint_t)); gc_collect_end(); }
void gc_collect(void) { // TODO possibly need to trace registers void *dummy; gc_collect_start(); // Node: stack is ascending gc_collect_root(&dummy, ((mp_uint_t)&dummy - (mp_uint_t)MP_STATE_THREAD(stack_top)) / sizeof(mp_uint_t)); gc_collect_end(); }
void gc_collect(void) { // WARNING: This gc_collect implementation doesn't try to get root // pointers from CPU registers, and thus may function incorrectly. jmp_buf dummy; if (setjmp(dummy) == 0) { longjmp(dummy, 1); } gc_collect_start(); gc_collect_root((void*)stack_top, ((mp_uint_t)(void*)(&dummy + 1) - (mp_uint_t)stack_top) / sizeof(mp_uint_t)); gc_collect_end(); }
void gc_collect(void) { gc_collect_start(); // get the registers and the sp uint32_t regs[10]; uint32_t sp = gc_helper_get_regs_and_sp(regs); // trace the stack, including the registers (since they live on the stack in this function) gc_collect_root((void**)sp, ((uint32_t)MP_STATE_THREAD(stack_top) - sp) / sizeof(uint32_t)); gc_collect_end(); }
void gc_collect(void) { gc_collect_start(); // get the registers and the sp jmp_buf env; setjmp(env); volatile mp_uint_t dummy; void *sp = (void*)&dummy; // trace the stack, including the registers (since they live on the stack in this function) gc_collect_root((void**)sp, ((uint32_t)MP_STATE_VM(stack_top) - (uint32_t)sp) / sizeof(uint32_t)); gc_collect_end(); }
void gc_collect(void) { // start the GC gc_collect_start(); // get the registers and the sp mp_uint_t regs[10]; mp_uint_t sp = gc_helper_get_regs_and_sp(regs); // trace the stack, including the registers (since they live on the stack in this function) gc_collect_root((void**)sp, (stackend - sp) / sizeof(uint32_t)); // end the GC gc_collect_end(); }
void gc_collect(void) { //gc_dump_info(); gc_collect_start(); // this traces .data and .bss sections extern char __bss_start, _end; //printf(".bss: %p-%p\n", &__bss_start, &_end); gc_collect_root((void**)&__bss_start, ((uint32_t)&_end - (uint32_t)&__bss_start) / sizeof(uint32_t)); regs_t regs; gc_helper_get_regs(regs); // GC stack (and regs because we captured them) gc_collect_root((void**)®s, ((uint32_t)stack_top - (uint32_t)®s) / sizeof(uint32_t)); gc_collect_end(); //printf("-----\n"); //gc_dump_info(); }
void gc_collect(void) { /* Start the GC. */ gc_collect_start(); /* Get the registers and the sp */ mp_uint_t regs[8]; mp_uint_t sp = gc_helper_get_regs_and_sp(regs); /* Trace the stack, including the registers (since they live on the stack in this function). */ gc_collect_root((void**)sp, ((uint32_t)stack_top_p - sp) / sizeof(uint32_t)); /* End the GC. */ gc_collect_end(); }
void gc_collect(void) { // start the GC gc_collect_start(); // get the registers and the sp mp_uint_t regs[10]; mp_uint_t sp = gc_helper_get_regs_and_sp(regs); // trace the stack, including the registers (since they live on the stack in this function) gc_collect_root((void**)sp, ((mp_uint_t)MP_STATE_THREAD(stack_top) - sp) / sizeof(uint32_t)); // trace root pointers from any threads #if MICROPY_PY_THREAD mp_thread_gc_others(); #endif // end the GC gc_collect_end(); }
void gc_collect(void) { // start the GC gc_collect_start(); // get the registers and the sp mp_uint_t regs[8]; mp_uint_t sp = gc_helper_get_regs_and_sp(regs); // trace the stack, including the registers (since they live on the stack in this function) gc_collect_root((void**)sp, (STACK_END - sp) / sizeof(uint32_t)); #if MICROPY_EMIT_XTENSA || MICROPY_EMIT_INLINE_XTENSA // trace any native code because it can contain pointers to the heap esp_native_code_gc_collect(); #endif // end the GC gc_collect_end(); }