int liballoc_shutdown() { struct liballoc_major *maj; struct liballoc_major *tmp; maj = l_memRoot; while ( maj != NULL ) { tmp = maj->next; if ( liballoc_free( maj, maj->pages * l_pageSize) != 0 ) if ( liballoc_abort != NULL ) liballoc_abort( 1 ); maj = tmp; } return 0; }
void free(void *ptr) { struct liballoc_minor *min; struct liballoc_major *maj; if ( ptr == NULL ) return; if ( liballoc_lock != NULL ) liballoc_lock(); // lockit min = (struct liballoc_minor*)((unsigned int)ptr - sizeof( struct liballoc_minor )); if ( min->magic != LIBALLOC_MAGIC ) { // being lied to... if ( liballoc_unlock != NULL ) liballoc_unlock(); // release the lock return; } maj = min->block; maj->usage -= (min->size + sizeof( struct liballoc_minor )); min->magic = 0; // No mojo. if ( min->next != NULL ) min->next->prev = min->prev; if ( min->prev != NULL ) min->prev->next = min->next; if ( min->prev == NULL ) maj->first = min->next; // Might empty the block. This was the first // minor. // We need to clean up after the majors now.... if ( maj->first == NULL ) // Block completely unused. { if ( l_memRoot == maj ) l_memRoot = maj->next; if ( maj->prev != NULL ) maj->prev->next = maj->next; if ( maj->next != NULL ) maj->next->prev = maj->prev; liballoc_free( maj, maj->pages * l_pageSize ); } if ( liballoc_unlock != NULL ) liballoc_unlock(); // release the lock }
void PREFIX(free)(void *ptr) { struct liballoc_minor *min; struct liballoc_major *maj; if ( ptr == NULL ) { l_warningCount += 1; #if defined DEBUG || defined INFO serial_printf( "liballoc: WARNING: PREFIX(free)( NULL ) called from %x\n", __builtin_return_address(0) ); FLUSH(); #endif return; } UNALIGN( ptr ); liballoc_lock(); // lockit min = (struct liballoc_minor*)((uintptr_t)ptr - sizeof( struct liballoc_minor )); if ( min->magic != LIBALLOC_MAGIC ) { l_errorCount += 1; // Check for overrun errors. For all bytes of LIBALLOC_MAGIC if ( ((min->magic & 0xFFFFFF) == (LIBALLOC_MAGIC & 0xFFFFFF)) || ((min->magic & 0xFFFF) == (LIBALLOC_MAGIC & 0xFFFF)) || ((min->magic & 0xFF) == (LIBALLOC_MAGIC & 0xFF)) ) { l_possibleOverruns += 1; #if defined DEBUG || defined INFO serial_printf( "liballoc: ERROR: Possible 1-3 byte overrun for magic %x != %x\n", min->magic, LIBALLOC_MAGIC ); FLUSH(); #endif } if ( min->magic == LIBALLOC_DEAD ) { #if defined DEBUG || defined INFO serial_printf( "liballoc: ERROR: multiple PREFIX(free)() attempt on %x from %x.\n", ptr, __builtin_return_address(0) ); FLUSH(); #endif } else { #if defined DEBUG || defined INFO serial_printf( "liballoc: ERROR: Bad PREFIX(free)( %x ) called from %x\n", ptr, __builtin_return_address(0) ); FLUSH(); #endif } // being lied to... liballoc_unlock(); // release the lock return; } #ifdef DEBUG serial_printf( "liballoc: %x PREFIX(free)( %x ): ", __builtin_return_address( 0 ), ptr ); FLUSH(); #endif maj = min->block; l_inuse -= min->size; maj->usage -= (min->size + sizeof( struct liballoc_minor )); min->magic = LIBALLOC_DEAD; // No mojo. if ( min->next != NULL ) min->next->prev = min->prev; if ( min->prev != NULL ) min->prev->next = min->next; if ( min->prev == NULL ) maj->first = min->next; // Might empty the block. This was the first // minor. // We need to clean up after the majors now.... if ( maj->first == NULL ) // Block completely unused. { if ( l_memRoot == maj ) l_memRoot = maj->next; if ( l_bestBet == maj ) l_bestBet = NULL; if ( maj->prev != NULL ) maj->prev->next = maj->next; if ( maj->next != NULL ) maj->next->prev = maj->prev; l_allocated -= maj->size; liballoc_free( maj, maj->pages ); } else { if ( l_bestBet != NULL ) { int bestSize = l_bestBet->size - l_bestBet->usage; int majSize = maj->size - maj->usage; if ( majSize > bestSize ) l_bestBet = maj; } } #ifdef DEBUG serial_printf( "OK\n"); FLUSH(); #endif liballoc_unlock(); // release the lock }
void free(void *ptr) { int index; struct boundary_tag *tag; if ( ptr == NULL ) return; liballoc_lock(); tag = (struct boundary_tag*)((unsigned int)ptr - sizeof( struct boundary_tag )); if ( tag->magic != LIBALLOC_MAGIC ) { liballoc_unlock(); // release the lock return; } // MELT LEFT... while ( (tag->split_left != NULL) && (tag->split_left->index >= 0) ) { tag = melt_left( tag ); remove_tag( tag ); } // MELT RIGHT... while ( (tag->split_right != NULL) && (tag->split_right->index >= 0) ) { tag = absorb_right( tag ); } // Where is it going back to? index = getexp( tag->real_size - sizeof(struct boundary_tag) ); if ( index < MINEXP ) index = MINEXP; // A whole, empty block? if ( (tag->split_left == NULL) && (tag->split_right == NULL) ) { if ( l_completePages[ index ] == MAXCOMPLETE ) { // Too many standing by to keep. Free this one. unsigned int pages = tag->real_size / l_pageSize; if ( (tag->real_size % l_pageSize) != 0 ) pages += 1; if ( pages < l_pageCount ) pages = l_pageCount; liballoc_free( tag, pages ); liballoc_unlock(); return; } l_completePages[ index ] += 1; // Increase the count of complete pages. } // .......... insert_tag( tag, index ); liballoc_unlock(); }
void free(void *ptr) { int index; struct boundary_tag *tag; if ( ptr == NULL ) return; liballoc_lock(); tag = (struct boundary_tag*)((unsigned int)ptr - sizeof( struct boundary_tag )); if ( tag->magic != LIBALLOC_MAGIC ) { liballoc_unlock(); // release the lock return; } #ifdef DEBUG l_inuse -= tag->size; printf("free: %x, %i, %i\n", ptr, (int)l_inuse / 1024, (int)l_allocated / 1024 ); #endif // MELT LEFT... while ( (tag->split_left != NULL) && (tag->split_left->index >= 0) ) { #ifdef DEBUG printf("Melting tag left into available memory. Left was %i, becomes %i (%i)\n", tag->split_left->real_size, tag->split_left->real_size + tag->real_size, tag->split_left->real_size ); #endif tag = melt_left( tag ); remove_tag( tag ); } // MELT RIGHT... while ( (tag->split_right != NULL) && (tag->split_right->index >= 0) ) { #ifdef DEBUG printf("Melting tag right into available memory. This was was %i, becomes %i (%i)\n", tag->real_size, tag->split_right->real_size + tag->real_size, tag->split_right->real_size ); #endif tag = absorb_right( tag ); } // Where is it going back to? index = getexp( tag->real_size - sizeof(struct boundary_tag) ); if ( index < MINEXP ) index = MINEXP; // A whole, empty block? if ( (tag->split_left == NULL) && (tag->split_right == NULL) ) { if ( l_completePages[ index ] == MAXCOMPLETE ) { // Too many standing by to keep. Free this one. unsigned int pages = tag->real_size / l_pageSize; if ( (tag->real_size % l_pageSize) != 0 ) pages += 1; if ( pages < l_pageCount ) pages = l_pageCount; liballoc_free( tag, pages ); #ifdef DEBUG l_allocated -= pages * l_pageSize; printf("Resource freeing %x of %i pages\n", tag, pages ); dump_array(); #endif liballoc_unlock(); return; } l_completePages[ index ] += 1; // Increase the count of complete pages. } // .......... insert_tag( tag, index ); #ifdef DEBUG printf("Returning tag with %i bytes (requested %i bytes), which has exponent: %i\n", tag->real_size, tag->size, index ); dump_array(); #endif liballoc_unlock(); }
void deleteProcess(Process * p){ liballoc_free(p->stack_base,p->stack_npages); la_free(p); return ; }