pool_alloc() готова и оптимизирована, pool_free() лагает пока что и не оптимизирована
This commit is contained in:
parent
58d938d391
commit
24aca132c3
|
@ -48,34 +48,37 @@ void init()
|
||||||
|
|
||||||
#define MAX_B (pool + MAX_I * sizeof(struct block_s))
|
#define MAX_B (pool + MAX_I * sizeof(struct block_s))
|
||||||
|
|
||||||
inline void *alloc()
|
inline void *pool_alloc()
|
||||||
{
|
{
|
||||||
if (!free_pool)
|
if (!free_pool)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (busy_pool) {
|
free_pool->prev = free_pool->next; // save free_pool->next in free_pool->prev
|
||||||
free_pool->next = busy_pool;
|
|
||||||
|
free_pool->next = busy_pool;
|
||||||
|
|
||||||
|
if (busy_pool)
|
||||||
busy_pool->prev = free_pool;
|
busy_pool->prev = free_pool;
|
||||||
}
|
|
||||||
else
|
|
||||||
free_pool->next = NULL;
|
|
||||||
|
|
||||||
busy_pool = free_pool;
|
busy_pool = free_pool;
|
||||||
|
|
||||||
free_pool = free_pool->next;
|
free_pool = free_pool->prev;
|
||||||
|
|
||||||
|
busy_pool->prev = NULL; // saved in free_pool->prev to NULL
|
||||||
|
|
||||||
return &busy_pool->obj;
|
return &busy_pool->obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void free(void *p)
|
inline void pool_free(void *p)
|
||||||
{
|
{
|
||||||
|
if (!p)
|
||||||
|
return;
|
||||||
|
|
||||||
struct block_s *b1 = (struct block_s *)(p - 2 * sizeof(struct block_s *)),
|
struct block_s *b1 = (struct block_s *)(p - 2 * sizeof(struct block_s *)),
|
||||||
*b0 = b1->prev,
|
*b0 = b1->prev,
|
||||||
*b2 = b1->next,
|
*b2 = b1->next,
|
||||||
*f1 = free_pool;
|
*f1 = free_pool;
|
||||||
|
|
||||||
// move one busy block to free list
|
|
||||||
|
|
||||||
// cut block from free list
|
// cut block from free list
|
||||||
if (b0)
|
if (b0)
|
||||||
b0->next = b2;
|
b0->next = b2;
|
||||||
|
@ -102,10 +105,18 @@ int main()
|
||||||
{
|
{
|
||||||
unsigned long long i;
|
unsigned long long i;
|
||||||
|
|
||||||
|
void *mem[MAX_I];
|
||||||
|
|
||||||
init();
|
init();
|
||||||
|
|
||||||
for (i = 0; i < MAX_I; i++)
|
for (i = 0; i < MAX_I; i++)
|
||||||
alloc();
|
if (!(mem[i] = pool_alloc())) {
|
||||||
|
printf("не удалось выделить память под %lld блок\n", i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < MAX_I; i++)
|
||||||
|
pool_free(mem[i]);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue