Skip to content

Commit 8c0f909

Browse files
committed
Add the umfPoolCreateEx internal function
It creates a pool that owns a memory provider generated from the provided provider operations.
1 parent 443ed0a commit 8c0f909

File tree

4 files changed

+57
-0
lines changed

4 files changed

+57
-0
lines changed

src/memory_pool.c

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

18+
umf_result_t umfPoolCreateEx(const umf_memory_pool_ops_t *pool_ops,
19+
void *pool_params,
20+
const umf_memory_provider_ops_t *provider_ops,
21+
void *provider_params,
22+
umf_memory_pool_handle_t *hPool) {
23+
if (!hPool) {
24+
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
25+
}
26+
27+
umf_memory_provider_handle_t provider = NULL;
28+
umf_result_t ret =
29+
umfMemoryProviderCreate(provider_ops, provider_params, &provider);
30+
if (ret != UMF_RESULT_SUCCESS) {
31+
return ret;
32+
}
33+
assert(provider != NULL);
34+
35+
umf_memory_pool_handle_t pool = NULL;
36+
ret = umfPoolCreate(pool_ops, provider, pool_params, &pool);
37+
if (ret != UMF_RESULT_SUCCESS) {
38+
umfMemoryProviderDestroy(provider);
39+
return ret;
40+
}
41+
assert(pool != NULL);
42+
43+
pool->own_provider = true;
44+
*hPool = pool;
45+
46+
return UMF_RESULT_SUCCESS;
47+
}
48+
1849
void *umfPoolMalloc(umf_memory_pool_handle_t hPool, size_t size) {
1950
return hPool->ops.malloc(hPool->pool_priv, size);
2051
}

src/memory_pool_default.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ umf_result_t umfPoolCreate(const umf_memory_pool_ops_t *ops,
3030
assert(ops->version == UMF_VERSION_CURRENT);
3131

3232
pool->provider = provider;
33+
pool->own_provider = false;
3334

3435
pool->ops = *ops;
3536
ret = ops->initialize(pool->provider, params, &pool->pool_priv);
@@ -44,6 +45,12 @@ umf_result_t umfPoolCreate(const umf_memory_pool_ops_t *ops,
4445

4546
void umfPoolDestroy(umf_memory_pool_handle_t hPool) {
4647
hPool->ops.finalize(hPool->pool_priv);
48+
if (hPool->own_provider) {
49+
// Destroy associated memory provider.
50+
umf_memory_provider_handle_t hProvider = NULL;
51+
umfPoolGetMemoryProvider(hPool, &hProvider);
52+
umfMemoryProviderDestroy(hProvider);
53+
}
4754
free(hPool);
4855
}
4956

src/memory_pool_internal.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,12 @@
1111
#define UMF_MEMORY_POOL_INTERNAL_H 1
1212

1313
#include <umf/base.h>
14+
#include <umf/memory_pool.h>
1415
#include <umf/memory_pool_ops.h>
1516
#include <umf/memory_provider.h>
1617

18+
#include <stdbool.h>
19+
1720
#ifdef __cplusplus
1821
extern "C" {
1922
#endif
@@ -24,8 +27,16 @@ typedef struct umf_memory_pool_t {
2427

2528
// Memory provider used by the pool.
2629
umf_memory_provider_handle_t provider;
30+
// Tells whether memory provider is owned by the pool.
31+
bool own_provider;
2732
} umf_memory_pool_t;
2833

34+
umf_result_t umfPoolCreateEx(const umf_memory_pool_ops_t *pool_ops,
35+
void *pool_params,
36+
const umf_memory_provider_ops_t *provider_ops,
37+
void *provider_params,
38+
umf_memory_pool_handle_t *hPool);
39+
2940
#ifdef __cplusplus
3041
}
3142
#endif

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)