示例#1
0
文件: kma_bud.c 项目: blee42/eecs343
/* 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);
}
示例#2
0
文件: kma.c 项目: becky2014/EECS-343
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;
}