void free(void* ptr) { static void (*libc_free)(void*); if (libc_free == NULL) { alloc_has_called_dlsym = true; libc_free = (void (*)(void*)) dlsym(RTLD_NEXT, "free"); } libc_free(ptr); #ifdef ALLOC_DEBUG printf("### free(%p)\n", ptr); #endif }
void free(void *ptr) { if (inside_init) { libc_free(ptr); return; } if (!alloc_handle) contest_alloc_init(); if (ptr < sbrk_init_done) { libc_free(ptr); return; } if (ptr) { alloc_free(ptr); contest_tracking(); } }
int removeFromList(List * list, void * ptr){ if (list == NULL || ptr == NULL){ return -1; } if (libc_free == NULL){ libc_free = dlsym(RTLD_NEXT,"free"); if ((error = dlerror()) != NULL) { fprintf(stderr, "%s\n", error); exit(EXIT_FAILURE); } } Node * curr = list -> first; if (curr -> ptr == ptr){ list -> first = curr -> next; curr -> next = NULL; libc_free(curr); return 0; } Node * prev = curr; curr = prev -> next; while(curr != NULL){ if (curr -> ptr == ptr){ prev -> next = curr -> next; curr -> next = NULL; libc_free(curr); return 0; } prev = curr; curr = curr -> next; } return -1; }
void clearList(List * list){ if (list == NULL) return; if (libc_free == NULL){ libc_free = dlsym(RTLD_NEXT,"free"); if ((error = dlerror()) != NULL) { fprintf(stderr, "%s\n", error); exit(EXIT_FAILURE); } } Node* curr = list -> first; while (curr != NULL){ Node * temp = curr -> next; libc_free(curr); curr = temp; } list -> first = NULL; }