static void init_heap_space(size_t min_size, size_t max_size) { size_t pagesize, alloc_size, reserve_size, freesize_pre, freesize_post; unsigned int min_num_segments, max_num_segments, bitmap_bits; void *p; pagesize = GetPageSize(); if (SEGMENT_SIZE % pagesize != 0) sml_fatal(0, "SEGMENT_SIZE is not aligned in page size."); alloc_size = ALIGNSIZE(min_size, SEGMENT_SIZE); reserve_size = ALIGNSIZE(max_size, SEGMENT_SIZE); if (alloc_size < SEGMENT_SIZE) alloc_size = SEGMENT_SIZE; if (reserve_size < alloc_size) reserve_size = alloc_size; min_num_segments = alloc_size / SEGMENT_SIZE; max_num_segments = reserve_size / SEGMENT_SIZE; p = ReservePage(HEAP_BEGIN_ADDR, SEGMENT_SIZE + reserve_size); if (p == ReservePageError) sml_fatal(0, "failed to alloc virtual memory."); freesize_post = (uintptr_t)p & (SEGMENT_SIZE - 1); if (freesize_post == 0) { ReleasePage(p + reserve_size, SEGMENT_SIZE); } else { freesize_pre = SEGMENT_SIZE - freesize_post; ReleasePage(p, freesize_pre); p = (char*)p + freesize_pre; ReleasePage(p + reserve_size, freesize_post); } heap_space.begin = p; heap_space.end = (char*)p + reserve_size; heap_space.min_num_segments = min_num_segments; heap_space.max_num_segments = max_num_segments; heap_space.num_committed = 0; heap_space.extend_step = min_num_segments > 0 ? min_num_segments : 1; bitmap_bits = ALIGNSIZE(max_num_segments, BITPTR_WORDBITS); heap_space.bitmap = xmalloc(bitmap_bits / CHAR_BIT); memset(heap_space.bitmap, 0, bitmap_bits / CHAR_BIT); extend_heap(min_num_segments); }
//------------------------------------------------------------------------------ void stPlainDiskPageManager::DisposePage(stPage * page){ stPageID * next; // Append to free list next = (stPageID *)page->GetData(); *next = header->Available; header->Available = page->GetPageID(); WritePage(page); // Update header header->UsedPages--; WriteHeaderPage(headerPage); // Free resources ReleasePage(page); }//end stPlainDiskPageManager::DisposePage
void sml_heap_free() { ReleasePage(heap_space.begin, (char*)heap_space.end - (char*)heap_space.begin); }