From 0a73bbe2f714916a37dc4c5209b5cf126bffa84a Mon Sep 17 00:00:00 2001 From: Douglas Creager Date: Wed, 26 Aug 2015 10:40:50 -0400 Subject: [PATCH] Separate callback functions for cork_mempool MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- docs/old/mempool.rst | 7 +++++-- include/libcork/core/mempool.h | 12 ++++++++++++ src/libcork/core/mempool.c | 27 +++++++++++++++++++++++---- tests/test-mempool.c | 5 +++-- 4 files changed, 43 insertions(+), 8 deletions(-) diff --git a/docs/old/mempool.rst b/docs/old/mempool.rst index 34dd433..85bf112 100644 --- a/docs/old/mempool.rst +++ b/docs/old/mempool.rst @@ -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. @@ -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) diff --git a/include/libcork/core/mempool.h b/include/libcork/core/mempool.h index e762bef..aaf745d 100644 --- a/include/libcork/core/mempool.h +++ b/include/libcork/core/mempool.h @@ -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, diff --git a/src/libcork/core/mempool.c b/src/libcork/core/mempool.c index 9600839..ad00371 100644 --- a/src/libcork/core/mempool.c +++ b/src/libcork/core/mempool.c @@ -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. */ diff --git a/tests/test-mempool.c b/tests/test-mempool.c index 134fb6e..9b5842c 100644 --- a/tests/test-mempool.c +++ b/tests/test-mempool.c @@ -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,