Exemplo n.º 1
0
extern bool coalesce_headers() {
	Header* larger, *smaller;
	bool merged = false;
	int i;
	// Only loop to 31 because loop accesses i+1
	for (i = 0; i < 31; i++) {
		smaller = freelist[i][0];
		larger = freelist[i+1][0];
		
		while (larger != NULL) {
			while (smaller != NULL) {
				// If the blocks are back to back
				if (((long) larger + sizeof(Header) + get_free_size(larger)) == (long) smaller) {
					assert(!larger->is_allocated && !smaller->is_allocated);
					// Blocks are buddies, merge them
					merge_blocks(larger, smaller);
					merged = true;
				}
				smaller = smaller->next_header;
			}
			smaller = freelist[i][0];
			larger = larger->next_header;
		}
	}
	return merged;
}
Exemplo n.º 2
0
 size_t free_size() const
 {
     size_t s{0};
     for (auto it = memory_blocks_.begin(); it != memory_blocks_.end(); it++) {
         s += it->get_free_size();
     }
     return s;
 }
Exemplo n.º 3
0
/* This function initializes the memory allocator and makes a portion of 
   ’_length’ bytes available. The allocator uses a ’_basic_block_size’ as 
   its minimal unit of allocation. The function returns the amount of 
   memory made available to the allocator. If an error occurred, 
   it returns 0. 
*/
extern unsigned int init_allocator(unsigned int _basic_block_size, 
			    unsigned int _length) {
	if (_basic_block_size)
		block_size = _basic_block_size;
	else
		block_size = default_block_size;
		
	if (_length)
		mem_size = _length;
	else
		mem_size = default_mem_size;
		
	
	init_freelist();
	allocated_space = malloc(sizeof(Header) + mem_size);
	Header* header = allocated_space;
	init_Header(header);
	header->size = basic_logarithm(mem_size);
	add_header(header);
	
	return get_free_size(header);
}