Exemple #1
0
extern C void SECTION(".entry") _entry() 
{
    int ret, argc;
    char *arguments;
    char **argv;

    /* Setup the heap, C++ constructors and default mounts. */
    setupHeap();
    runConstructors();
    setupMappings();

    /* Allocate buffer for arguments. */
    argc = 0;
    argv = (char **) new char[ARGV_COUNT];
    arguments = (char *) ARGV_ADDR;

    /* Fill in arguments list. */
    while (argc < ARGV_COUNT && *arguments)
    {
        argv[argc] = arguments;
        arguments += ARGV_SIZE;
        argc++;
    }
    /* Pass control to the program. */
    ret = main(argc, argv);

    /* Terminate execution. */
    runDestructors();
    exit(ret);
}
void* my_malloc(size_t size)
{
  	// calculate the needed size
	int total_size = size + sizeof(metadata_t);

	// if the requested size is beyond our largest block size
	if (total_size > SBRK_SIZE) {
		ERRNO = SINGLE_REQUEST_TOO_LARGE;
		return NULL;
	}
	// set up the heap if it is uninitialized
	if (!heap) {
		setupHeap();
		if (ERRNO == OUT_OF_MEMORY) {
			return NULL;
		}
	}
	// get index of the free list to allocate memory to the user
	int idx = getIdx(total_size);
	metadata_t *allocBlock = NULL;
	// if we have a memory block to allocate
	if (freelist[idx] != NULL) {
		// just simply return the first block
		allocBlock = freelist[idx];
		// if there is the next block
		if (allocBlock->next != NULL) {
			allocBlock->next->prev = NULL;
			freelist[idx] = allocBlock->next;
		} else {
			freelist[idx] = NULL;
		}
		// remove this block/
		allocBlock->in_use = 1;
		allocBlock->prev = NULL;
		allocBlock->next = NULL;

		// return the block
		return ((char*)allocBlock + sizeof(metadata_t));
	}
	// if we do not have a memory block to allocate
	// we split the second smallest blocks into blocks of needed size
	int splitIdx = idx + 1;
	while (freelist[splitIdx] == NULL) {
		splitIdx++;
	}
	// if there are no blocks to split
	if (splitIdx == 8) {
		// set up a new heap
		setupHeap();
		if (ERRNO == OUT_OF_MEMORY) {
			return NULL;
		}
	} else { // if a block can be split 
		splitBlock(splitIdx, idx, freelist[splitIdx]); // a recursive function
	}
	// call my_malloc() again to allocate memory
	allocBlock = my_malloc(size);
    // set the error code
    ERRNO = NO_ERROR;

  	return allocBlock;
}