Skip to content

Commit de5cb60

Browse files
committed
Add the umfPoolCreateOwning function
... that creates a pool owning the provided memory provider.
1 parent 443ed0a commit de5cb60

File tree

5 files changed

+48
-0
lines changed

5 files changed

+48
-0
lines changed

include/umf/memory_pool.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,20 @@ umf_memory_pool_handle_t umfPoolByPtr(const void *ptr);
141141
umf_result_t umfPoolGetMemoryProvider(umf_memory_pool_handle_t hPool,
142142
umf_memory_provider_handle_t *hProvider);
143143

144+
///
145+
/// \brief Creates a new memory pool that owns the provided memory provider. Upon the
146+
/// destruction of the memory pool, the associated memory provider will also be destroyed.
147+
/// \param ops instance of umf_memory_pool_ops_t
148+
/// \param provider memory provider that will be used for coarse-grain allocations.
149+
/// \param params pointer to pool-specific parameters
150+
/// \param hPool [out] handle to the newly created memory pool
151+
/// \return UMF_RESULT_SUCCESS on success or appropriate error code on failure.
152+
///
153+
enum umf_result_t umfPoolCreateOwning(const struct umf_memory_pool_ops_t *ops,
154+
umf_memory_provider_handle_t provider,
155+
void *params,
156+
umf_memory_pool_handle_t *hPool);
157+
144158
#ifdef __cplusplus
145159
}
146160
#endif

src/memory_pool.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,22 @@
1515
#include <assert.h>
1616
#include <stdlib.h>
1717

18+
enum umf_result_t umfPoolCreateOwning(const struct umf_memory_pool_ops_t *ops,
19+
umf_memory_provider_handle_t provider,
20+
void *params,
21+
umf_memory_pool_handle_t *hPool) {
22+
umf_memory_pool_handle_t pool = NULL;
23+
enum umf_result_t ret = umfPoolCreate(ops, provider, params, &pool);
24+
if (ret) {
25+
return ret;
26+
}
27+
28+
pool->own_provider = true;
29+
*hPool = pool;
30+
31+
return UMF_RESULT_SUCCESS;
32+
}
33+
1834
void *umfPoolMalloc(umf_memory_pool_handle_t hPool, size_t size) {
1935
return hPool->ops.malloc(hPool->pool_priv, size);
2036
}

src/memory_pool_default.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,12 @@ umf_result_t umfPoolCreate(const umf_memory_pool_ops_t *ops,
4444

4545
void umfPoolDestroy(umf_memory_pool_handle_t hPool) {
4646
hPool->ops.finalize(hPool->pool_priv);
47+
if (hPool->own_provider) {
48+
// Destroy associated memory provider.
49+
umf_memory_provider_handle_t hProvider = NULL;
50+
umfPoolGetMemoryProvider(hPool, &hProvider);
51+
umfMemoryProviderDestroy(hProvider);
52+
}
4753
free(hPool);
4854
}
4955

src/memory_pool_internal.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
#include <umf/memory_pool_ops.h>
1515
#include <umf/memory_provider.h>
1616

17+
#include <stdbool.h>
18+
1719
#ifdef __cplusplus
1820
extern "C" {
1921
#endif
@@ -24,6 +26,8 @@ typedef struct umf_memory_pool_t {
2426

2527
// Memory provider used by the pool.
2628
umf_memory_provider_handle_t provider;
29+
// Tells whether memory provider is owned by the pool.
30+
bool own_provider;
2731
} umf_memory_pool_t;
2832

2933
#ifdef __cplusplus

src/memory_pool_tracking.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ umf_result_t umfPoolCreate(const umf_memory_pool_ops_t *ops,
3636
if (ret != UMF_RESULT_SUCCESS) {
3737
goto err_provider_create;
3838
}
39+
pool->own_provider = false;
3940

4041
pool->ops = *ops;
4142
ret = ops->initialize(pool->provider, params, &pool->pool_priv);
@@ -56,6 +57,13 @@ umf_result_t umfPoolCreate(const umf_memory_pool_ops_t *ops,
5657

5758
void umfPoolDestroy(umf_memory_pool_handle_t hPool) {
5859
hPool->ops.finalize(hPool->pool_priv);
60+
if (hPool->own_provider) {
61+
// Destroy associated memory provider.
62+
umf_memory_provider_handle_t hProvider = NULL;
63+
umfPoolGetMemoryProvider(hPool, &hProvider);
64+
umfMemoryProviderDestroy(hProvider);
65+
}
66+
// Destroy tracking provider.
5967
umfMemoryProviderDestroy(hPool->provider);
6068
free(hPool);
6169
}

0 commit comments

Comments
 (0)