From d6f1dbb321b36fe147c55cfeb47b9b612ca44b78 Mon Sep 17 00:00:00 2001 From: Kolan Sh Date: Sat, 30 Apr 2011 00:55:40 +0400 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=82=D1=83=D1=80?= =?UTF-8?q?=D0=B0=20block=5Fpool,=20=D1=86=D0=B5=D0=BB=D1=8C=20-=20=D1=81?= =?UTF-8?q?=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BC=D0=BD=D0=BE?= =?UTF-8?q?=D0=B6=D0=B5=D1=81=D1=82=D0=B2=D0=B0=20=D0=BF=D1=83=D0=BB=D0=BE?= =?UTF-8?q?=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- c/malloc_speed_test/pool_list.c | 94 +++++++++++++++++++-------------- 1 file changed, 55 insertions(+), 39 deletions(-) diff --git a/c/malloc_speed_test/pool_list.c b/c/malloc_speed_test/pool_list.c index ee6fd86..55ab920 100644 --- a/c/malloc_speed_test/pool_list.c +++ b/c/malloc_speed_test/pool_list.c @@ -2,8 +2,6 @@ #include -#define MAX_I 0x00ffffff - #define bool char #define TRUE 1 #define FALSE 0 @@ -18,56 +16,69 @@ struct block_s { struct object_s obj; }; -static struct block_s pool[MAX_I]; - -static struct block_s *free_pool = NULL, - *busy_pool = NULL; +struct block_pool { + size_t nblocks; + struct block_s *pool; + struct block_s *free_pool; + struct block_s *busy_pool; +}; /* * инициализация пула */ -void init() +void pool_init(struct block_pool *bp, size_t nblocks) { size_t i; - size_t max_i = MAX_I - 1; + bp->nblocks = nblocks; + + bp->pool = (struct block_s *)malloc(nblocks * sizeof(struct block_s)); + + size_t max_i = nblocks - 1; for (i = 1; i < max_i; i++) { - pool[i].prev = &pool[i - 1]; - pool[i].next = &pool[i + 1]; + bp->pool[i].prev = &bp->pool[i - 1]; + bp->pool[i].next = &bp->pool[i + 1]; } - pool[0].prev = NULL; - pool[0].next = &pool[1]; + bp->pool[0].prev = NULL; + bp->pool[0].next = &bp->pool[1]; - pool[MAX_I - 1].prev = &pool[MAX_I - 2]; - pool[MAX_I - 1].next = NULL; + bp->pool[nblocks - 1].prev = &bp->pool[nblocks - 2]; + bp->pool[nblocks - 1].next = NULL; - free_pool = &pool[0]; - busy_pool = NULL; + bp->free_pool = &bp->pool[0]; + bp->busy_pool = NULL; } -inline void *pool_alloc() +void pool_destroy(struct block_pool *bp) { - if (!free_pool) + free(bp->pool); + bp->nblocks = 0; + bp->pool = bp->free_pool = bp->busy_pool = NULL; +} + +inline void *pool_alloc(struct block_pool *bp) +{ + if (!bp->free_pool) return NULL; - free_pool->prev = free_pool->next; // save free_pool->next in free_pool->prev + bp->free_pool->prev = bp->free_pool->next; // save free_pool->next in free_pool->prev - free_pool->next = busy_pool; + bp->free_pool->next = bp->busy_pool; - if (busy_pool) - busy_pool->prev = free_pool; + if (bp->busy_pool) + bp->busy_pool->prev = bp->free_pool; - busy_pool = free_pool; + bp->busy_pool = bp->free_pool; - free_pool = free_pool->prev; + bp->free_pool = bp->free_pool->prev; - busy_pool->prev = NULL; // saved in free_pool->prev to NULL + bp->busy_pool->prev = NULL; // saved in free_pool->prev to NULL - return &busy_pool->obj; + return &bp->busy_pool->obj; } -inline void pool_free(void *p) +inline void pool_free(struct block_pool *bp, void *p) { if (!p) return; @@ -80,39 +91,44 @@ inline void pool_free(void *p) if (b2) b2->prev = b1->prev; - if (free_pool) { - b1->next = free_pool; - free_pool->prev = b1; + if (bp->free_pool) { + b1->next = bp->free_pool; + bp->free_pool->prev = b1; } else b1->next = NULL; - free_pool = b2; + bp->free_pool = b2; - if (busy_pool == b1) - busy_pool = b2; + if (bp->busy_pool == b1) + bp->busy_pool = b2; } int main() { unsigned long long i; + struct block_pool bp; - init(); + size_t nblocks = 0xffffff; - void **mem = malloc(MAX_I * sizeof(void *)); + pool_init(&bp, nblocks); - for (i = 0; i < MAX_I; i++) - if (!(mem[i] = pool_alloc())) { + void **mem = malloc(nblocks * sizeof(void *)); + + for (i = 0; i < nblocks; i++) + if (!(mem[i] = pool_alloc(&bp))) { printf("не удалось выделить память под %lld блок\n", i); break; } - for (i = 0; i < MAX_I; i++) - pool_free(mem[i]); + for (i = 0; i < nblocks; i++) + pool_free(&bp, mem[i]); free(mem); + pool_destroy(&bp); + return 0; }