Skip to content

Commit

Permalink
Separate callback functions for cork_mempool
Browse files Browse the repository at this point in the history
The cork_mempool type lets you provide `init_object` and `done_object`
callbacks, which are called when an instance is first allocated and
finally deallocated (i.e., exactly once per instance, regardless of how
many times the instance is reused).  This patch updates the API to have
separate functions for setting each of those callbacks, instead of the
single big function — this is more consistent with our current pattern,
and is nicer for ABI compatibility reasons.

The existing `set_callbacks` function still exists, but it's now
deprecated and no longer mentioned in the documentation.
  • Loading branch information
Douglas Creager committed Aug 26, 2015
1 parent 26729a4 commit 0a73bbe
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 0a73bbe

Please sign in to comment.