Esempio n. 1
0
void * my_alloc (int size)
{
	do
	{
		while (offset >= 0 && offset < (BLOCKSIZE - size - 8)) 
		{
			char status = (char) * (data_current + offset);
			unsigned short bytes = (unsigned char)*(data_current + offset + 1) * 0xFF + (unsigned char)*(data_current + offset + 2);
			if(status == 0 && bytes >= size)  // block is unused and big enough
			{
				found_something = 1;
				used_mem += size;
				*(data_current + offset) = 1; // used
				*(data_current + offset + 1) = size / 0xFF; // ...
				*(data_current + offset + 2) = size % 0xFF; // the next 'size' bytes are used
				if(bytes != size) 
				{
					*(data_current + offset + 8 + size) = 0; // used
					*(data_current + offset + 9 + size) = (bytes - size) / 0xFF; // ...
					*(data_current + offset +10 + size) = (bytes - size) % 0xFF; // the next 'x' bytes are unsed
				}
				void * ret = data_current + (offset + 8)*sizeof(char);
				offset += 8 + size;
				return ret;
			}
			else // block is used or not big enough
			{
				offset += 8 + bytes;
				printf("bytes: %u\n",bytes);
			}
		}
		if(blocks <= current_block)
		{
			data_current = data_start; // go back to the beginning
			found_something = 0;
			current_block = 1;
		}
		else
		{
			data_current = (void*) data_current + sizeof(BLOCKSIZE - 8);
			current_block++;
		}
	} while(found_something == 1 && (used_mem / mem_size) < WASTE_RATE);
	
	// no block of the given size found
	found_something = 0;
	offset = 0;
	blocks++;
	current_block++;
	data_current = get_block_from_system();
	char * end = data_last + BLOCKSIZE - 8;
	end = data_current;
	mem_size += BLOCKSIZE;
	// mark the memory as free
	*(data_current) = 0; // unused
	*(data_current+1) = (BLOCKSIZE - 16) / 0xFF; // ...
	*(data_current+2) = (BLOCKSIZE - 16) % 0xFF; // the next 8176 bytes are unused
	return my_alloc(size);
}
Esempio n. 2
0
void init_my_alloc ()
{
	data_start = get_block_from_system();
	mem_size = BLOCKSIZE;
	// mark the memory as free
	*(data_start) = 0; // unused
	*(data_start+1) = (BLOCKSIZE - 16) / 0xFF; // ...
	*(data_start+2) = (BLOCKSIZE - 16) % 0xFF; // the next 8176 bytes are unused
	data_current = data_start;
	data_last = data_start;
}
Esempio n. 3
0
void* my_alloc(size_t size)
{
	/**********************************/
	/* Hole einen Freispeicher Knoten */
	/**********************************/
	node* freeNode = findFreeNode(size);
	if (freeNode == 0)
	{
		char* data = get_block_from_system();
		if (data == 0) return 0; /* System out of memory */
		freeNode = (node*)data;
		freeNode->size = BLOCKSIZE - offset;
		freeNode->left = 0;
		freeNode->right = 0;
        freeNode->next = 0;
	}
	else
		removeFreeNode(freeNode);

	/***********************************/
	/* Belege Platz im freien Speicher */
	/***********************************/
	/* Schritt 1: Pruefe ob Speicher uebrig bleibt */
	size_t leftover = freeNode->size - size;
    node* nLeftover = 0;

	if (leftover >= offset + ALLIGN)
	{
		/* Es ist noch Platz für mindestens 8 Byte
		 * erzeuge neuen Freispeicherknoten */
        nLeftover = (node*)( ((char*)freeNode) + offset + size);
        nLeftover->size = (int)leftover - offset;
        nLeftover->left = 0;
        nLeftover->right = 0;
        insertFreeNode(nLeftover);
        freeNode->size = (int) size;
	}

	/* Schritt 2: Freispeicherknoten
     durch Belegtspeicherknoten ersetzen */
	/* freeNode Pointer kann jetzt als Belegtspeicherpointer genutzt werden: */
	freeNode->left = 0;
	freeNode->right = 0;
	insertToTree(freeNode, &allocTree);

	/* Schritt 3: Neu belegten Speicher zurueckgeben */
	return ((char*)freeNode)+offset;
}