void bitmap_free(uint32_t res) { Bitmap *mb; mb = find_bitmap(res); if(mb == NULL) return; if(mb->b == NULL) return; gbitmap_destroy(mb->b); mb->b = NULL; }
// loads a bitmap or just returns the bitmap if it's already loaded. GBitmap *bitmap_get(uint32_t res) { Bitmap *mb; mb = find_bitmap(res); if(mb == NULL) return(NULL); if(mb->b == NULL) { mb->b = gbitmap_create_with_resource(res); if(mb->b == NULL) return(NULL); } mb->ref = 1; return(mb->b); }
static NOINLINE void * find_segment(struct alloc_ptr *ptr) { unsigned int blocksize_log2 = ALLOC_PTR_TO_BLOCKSIZE_LOG2(ptr); struct segment *seg; struct subheap *subheap = &global_subheaps[blocksize_log2]; void *obj; ASSERT(BLOCKSIZE_MIN_LOG2 <= blocksize_log2 && blocksize_log2 <= BLOCKSIZE_MAX_LOG2); UNRESERVED_NEXT(subheap->unreserved, seg); if (seg) { /* seg have at least one free block. */ set_alloc_ptr(ptr, seg); obj = find_bitmap(ptr); ASSERT(obj != NULL); GCSTAT_COUNT_MOVE(find[blocksize_log2], next[blocksize_log2]); return obj; } seg = new_segment(); if (seg) { init_segment(seg, blocksize_log2); UNRESERVED_APPEND(subheap->unreserved, seg); set_alloc_ptr(ptr, seg); ASSERT(!BITPTR_TEST(ptr->freebit)); GCSTAT_ALLOC_COUNT(new, blocksize_log2, ptr->blocksize_bytes); BITPTR_INC(ptr->freebit); obj = ptr->free; ptr->free += ptr->blocksize_bytes; return obj; } return NULL; }
SML_PRIMITIVE void * sml_alloc(unsigned int objsize, void *frame_pointer) { size_t alloc_size; unsigned int blocksize_log2; struct alloc_ptr *ptr; void *obj; /* ensure that alloc_size is at least BLOCKSIZE_MIN. */ alloc_size = ALIGNSIZE(OBJ_HEADER_SIZE + objsize, BLOCKSIZE_MIN); if (alloc_size > BLOCKSIZE_MAX) { GCSTAT_ALLOC_COUNT(malloc, 0, alloc_size); sml_save_frame_pointer(frame_pointer); return sml_obj_malloc(alloc_size); } blocksize_log2 = CEIL_LOG2(alloc_size); ASSERT(BLOCKSIZE_MIN_LOG2 <= blocksize_log2 && blocksize_log2 <= BLOCKSIZE_MAX_LOG2); ptr = &ALLOC_PTR_SET()->alloc_ptr[blocksize_log2]; if (!BITPTR_TEST(ptr->freebit)) { GCSTAT_ALLOC_COUNT(fast, blocksize_log2, alloc_size); BITPTR_INC(ptr->freebit); obj = ptr->free; ptr->free += ptr->blocksize_bytes; goto alloced; } sml_save_frame_pointer(frame_pointer); if (ptr->free != NULL) { obj = find_bitmap(ptr); if (obj) goto alloced; } obj = find_segment(ptr); if (obj) goto alloced; GCSTAT_TRIGGER(blocksize_log2); do_gc(MAJOR); obj = find_segment(ptr); if (obj) goto alloced_major; extend_heap(heap_space.extend_step); obj = find_segment(ptr); if (obj) goto alloced_major; sml_fatal(0, "heap exceeded: intended to allocate %u bytes.", ptr->blocksize_bytes); alloced_major: ASSERT(check_newobj(obj)); /* NOTE: sml_run_finalizer may cause garbage collection. */ obj = sml_run_finalizer(obj); goto finished; alloced: ASSERT(check_newobj(obj)); finished: OBJ_HEADER(obj) = 0; return obj; }