Skip to content

Commit

Permalink
Merge pull request #106 from redjack/feature/mempool-callbacks
Browse files Browse the repository at this point in the history
Separate callback functions for cork_mempool
  • Loading branch information
Douglas Creager committed Aug 26, 2015
2 parents 26729a4 + 0a73bbe commit 71cf426
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 8 deletions.
7 changes: 5 additions & 2 deletions docs/old/mempool.rst
Expand Up @@ -126,7 +126,9 @@ instance, we might as well try to reuse the memory for the
``scratch_space`` field, as well. To do this, you provide initialization and
finalization callbacks:

.. function:: void cork_mempool_set_callbacks(struct cork_mempool \*mp, void \*user_data, cork_free_f free_user_data, cork_init_f init_object, cork_done_f done_object)
.. function:: void cork_mempool_set_user_data(struct cork_mempool \*mp, void \*user_data, cork_free_f free_user_data)
void cork_mempool_set_init_object(struct cork_mempool \*mp, cork_init_f init_object)
void cork_mempool_set_done_object(struct cork_mempool \*mp, cork_done_f done_object)

Provide callback functions that will be used to initialize and finalize each
object created by the memory pool.
Expand All @@ -152,7 +154,8 @@ logic goes into ``done_object``, and not our destructor::

static cork_mempool *pool;
pool = cork_mempool_new(pool, struct my_data);
cork_mempool_set_callbacks(pool, NULL, NULL, my_data_init, my_data_done);
cork_mempool_set_init_object(pool, my_data_init);
cork_mempool_set_done_object(pool, my_data_done);

struct my_data *
my_data_new(void)
Expand Down
12 changes: 12 additions & 0 deletions include/libcork/core/mempool.h
Expand Up @@ -41,6 +41,18 @@ CORK_API void
cork_mempool_free(struct cork_mempool *mp);


CORK_API void
cork_mempool_set_user_data(struct cork_mempool *mp,
void *user_data, cork_free_f free_user_data);

CORK_API void
cork_mempool_set_init_object(struct cork_mempool *mp, cork_init_f init_object);

CORK_API void
cork_mempool_set_done_object(struct cork_mempool *mp, cork_done_f done_object);

/* Deprecated; you should now use separate calls to cork_mempool_set_user_data,
* cork_mempool_set_init_object, and cork_mempool_set_done_object. */
CORK_API void
cork_mempool_set_callbacks(struct cork_mempool *mp,
void *user_data, cork_free_f free_user_data,
Expand Down
27 changes: 23 additions & 4 deletions src/libcork/core/mempool.c
Expand Up @@ -108,18 +108,37 @@ cork_mempool_free(struct cork_mempool *mp)


void
cork_mempool_set_callbacks(struct cork_mempool *mp,
void *user_data, cork_free_f free_user_data,
cork_init_f init_object,
cork_done_f done_object)
cork_mempool_set_user_data(struct cork_mempool *mp,
void *user_data, cork_free_f free_user_data)
{
cork_free_user_data(mp);
mp->user_data = user_data;
mp->free_user_data = free_user_data;
}

void
cork_mempool_set_init_object(struct cork_mempool *mp, cork_init_f init_object)
{
mp->init_object = init_object;
}

void
cork_mempool_set_done_object(struct cork_mempool *mp, cork_done_f done_object)
{
mp->done_object = done_object;
}

void
cork_mempool_set_callbacks(struct cork_mempool *mp,
void *user_data, cork_free_f free_user_data,
cork_init_f init_object,
cork_done_f done_object)
{
cork_mempool_set_user_data(mp, user_data, free_user_data);
cork_mempool_set_init_object(mp, init_object);
cork_mempool_set_done_object(mp, done_object);
}


/* If this function succeeds, then we guarantee that there will be at
* least one object in mp->free_list. */
Expand Down
5 changes: 3 additions & 2 deletions tests/test-mempool.c
Expand Up @@ -100,8 +100,9 @@ START_TEST(test_mempool_reuse_01)
size_t done_call_count = 0;
struct cork_mempool *mp;
mp = cork_mempool_new_ex(int64_t, BLOCK_SIZE);
cork_mempool_set_callbacks
(mp, &done_call_count, NULL, int64_init, int64_done);
cork_mempool_set_user_data(mp, &done_call_count, NULL);
cork_mempool_set_init_object(mp, int64_init);
cork_mempool_set_done_object(mp, int64_done);

int64_t *obj;
fail_if((obj = cork_mempool_new_object(mp)) == NULL,
Expand Down

0 comments on commit 71cf426

Please sign in to comment.