Skip to content

Commit

Permalink
use single linked list
Browse files Browse the repository at this point in the history
  • Loading branch information
sreimers committed Jan 9, 2025
1 parent f10533f commit 0a23b7b
Showing 1 changed file with 17 additions and 14 deletions.
31 changes: 17 additions & 14 deletions src/mem/mem_pool.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@

#include <re_types.h>
#include <re_mem.h>
#include <re_list.h>
#include <re_thread.h>


Expand All @@ -20,14 +19,14 @@
struct mem_pool {
size_t nmemb;
size_t membsize;
struct list freel;
struct mem_pool_entry *freel; /* single linked list */
mem_destroy_h *membdh;
struct mem_pool_entry *objs;
mtx_t *lock;
};

struct mem_pool_entry {
struct le le;
struct mem_pool_entry *next;
void *member;
};

Expand All @@ -45,6 +44,13 @@ static void mem_pool_destroy(void *data)
}


static inline void next_free(struct mem_pool *pool, struct mem_pool_entry *e)
{
e->next = pool->freel;
pool->freel = e;
}


/**
* @brief Allocate a memory pool
*
Expand Down Expand Up @@ -93,7 +99,7 @@ int mem_pool_alloc(struct mem_pool **poolp, size_t nmemb, size_t membsize,
err = ENOMEM;
goto error;
}
list_append(&p->freel, &p->objs[i].le, &p->objs[i]);
next_free(p, &p->objs[i]);
}

*poolp = p;
Expand Down Expand Up @@ -134,7 +140,7 @@ int mem_pool_extend(struct mem_pool *pool, size_t num)
/* Copy old members */
size_t i = 0;
for (; i < pool->nmemb; i++) {
objs[i].le = pool->objs[i].le;
objs[i].next = pool->objs[i].next;
objs[i].member = pool->objs[i].member;
}

Expand All @@ -146,7 +152,7 @@ int mem_pool_extend(struct mem_pool *pool, size_t num)
mtx_unlock(pool->lock);
return ENOMEM;
}
list_append(&pool->freel, &objs[i].le, &objs[i]);
next_free(pool, &objs[i]);
}

mem_deref(pool->objs);
Expand Down Expand Up @@ -174,11 +180,9 @@ struct mem_pool_entry *mem_pool_borrow(struct mem_pool *pool)
return NULL;

mtx_lock(pool->lock);
struct le *le = list_head(&pool->freel);

if (le) {
struct mem_pool_entry *e = le->data;
list_unlink(le);
struct mem_pool_entry *e = pool->freel;
if (e) {
pool->freel = e->next;
mtx_unlock(pool->lock);
return e;
}
Expand Down Expand Up @@ -213,7 +217,7 @@ void *mem_pool_release(struct mem_pool *pool, struct mem_pool_entry *e)
pool->membdh(e->member);

memset(e->member, 0, pool->membsize);
list_append(&pool->freel, &e->le, e);
next_free(pool, e);

mtx_unlock(pool->lock);

Expand All @@ -229,13 +233,12 @@ void *mem_pool_release(struct mem_pool *pool, struct mem_pool_entry *e)
void mem_pool_flush(struct mem_pool *pool)
{
mtx_lock(pool->lock);
list_clear(&pool->freel);
for (size_t i = 0; i < pool->nmemb; i++) {
struct mem_pool_entry *e = &pool->objs[i];
if (pool->membdh)
pool->membdh(e->member);
memset(e->member, 0, pool->membsize);
list_append(&pool->freel, &e->le, e);
next_free(pool, e);
}
mtx_unlock(pool->lock);
}
Expand Down

0 comments on commit 0a23b7b

Please sign in to comment.