/* malloc function. Initializes the first page if needed, then returns the appropriate allocated space. */ void* kma_malloc(kma_size_t size) { if (REALSIZE(size)+sizeof(pageheaderT) > PAGESIZE) return NULL; if (first_page == NULL) { first_page = init_page(); kma_malloc(sizeof(pageheaderT)); // mallocs the page header so it isn't overwritten. PAGE_HEADER(first_page)->used = 0; // resets the allocation counter because the page // header doesn't count. } return get_free_buffer(size); }
void allocate(mem_t *requests, int req_id, int req_size) { mem_t *newPtr = &requests[req_id]; assert(newPtr->state == FREE); newPtr->size = req_size; newPtr->ptr = kma_malloc(newPtr->size); // Accept a NULL response in some cases... if (!(((newPtr->ptr != NULL) && (newPtr->size <= (PAGESIZE - sizeof(void *)))) || ((newPtr->ptr == NULL) && (newPtr->size > (PAGESIZE - sizeof(void *)))))) { error("got NULL from kma_malloc for alloc'able request", ""); } if (newPtr->ptr == NULL) { return; } currentAllocBytes += req_size; #ifndef COMPETITION // Only run the actual memory accesses/copies/checks if we're // testing for correctness. newPtr->value = malloc(newPtr->size); assert(newPtr->value != NULL); // initialize memory fill((char *) newPtr->ptr, newPtr->size); // copy the value for further reference bcopy(newPtr->ptr, newPtr->value, newPtr->size); check((char *) newPtr->ptr, (char *) newPtr->value, newPtr->size); #endif newPtr->state = USED; }