Skip to content

Commit ae10a01

Browse files
committed
Fix umfMemoryTrackerGetPool implementation
1 parent 2af7821 commit ae10a01

File tree

2 files changed

+43
-18
lines changed

2 files changed

+43
-18
lines changed

src/provider/provider_tracking.c

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -80,34 +80,30 @@ static umf_result_t umfMemoryTrackerRemove(umf_memory_tracker_handle_t hTracker,
8080
}
8181

8282
umf_memory_pool_handle_t umfMemoryTrackerGetPool(const void *ptr) {
83-
assert(ptr);
84-
85-
if (TRACKER == NULL) {
86-
LOG_ERR("tracker is not created");
87-
return NULL;
88-
}
89-
90-
if (TRACKER->map == NULL) {
91-
LOG_ERR("tracker's map is not created");
92-
return NULL;
93-
}
94-
95-
uintptr_t rkey;
96-
tracker_value_t *rvalue;
97-
int found = critnib_find(TRACKER->map, (uintptr_t)ptr, FIND_LE,
98-
(void *)&rkey, (void **)&rvalue);
99-
if (!found) {
83+
umf_alloc_info_t allocInfo = {0};
84+
umf_result_t ret = umfMemoryTrackerGetAllocInfo(ptr, &allocInfo);
85+
if (ret != UMF_RESULT_SUCCESS) {
10086
return NULL;
10187
}
10288

103-
return (rkey + rvalue->size >= (uintptr_t)ptr) ? rvalue->pool : NULL;
89+
return allocInfo.pool;
10490
}
10591

10692
umf_result_t umfMemoryTrackerGetAllocInfo(const void *ptr,
10793
umf_alloc_info_t *pAllocInfo) {
10894
assert(ptr);
10995
assert(pAllocInfo);
11096

97+
if (TRACKER == NULL) {
98+
LOG_ERR("tracker is not created");
99+
return UMF_RESULT_ERROR_NOT_SUPPORTED;
100+
}
101+
102+
if (TRACKER->map == NULL) {
103+
LOG_ERR("tracker's map is not created");
104+
return UMF_RESULT_ERROR_NOT_SUPPORTED;
105+
}
106+
111107
uintptr_t rkey;
112108
tracker_value_t *rvalue;
113109
int found = critnib_find(TRACKER->map, (uintptr_t)ptr, FIND_LE,

test/memoryPoolAPI.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,35 @@ TEST_F(test, retrieveMemoryProvider) {
150150
ASSERT_EQ(retProvider, provider);
151151
}
152152

153+
#ifdef UMF_ENABLE_POOL_TRACKING_TESTS
154+
TEST_F(test, BasicPoolByPtrTest) {
155+
constexpr size_t SIZE = 4096 * 1024;
156+
157+
umf_memory_provider_handle_t provider;
158+
umf_result_t ret =
159+
umfMemoryProviderCreate(&MALLOC_PROVIDER_OPS, NULL, &provider);
160+
ASSERT_EQ(ret, UMF_RESULT_SUCCESS);
161+
auto pool =
162+
wrapPoolUnique(createPoolChecked(umfProxyPoolOps(), provider, nullptr,
163+
UMF_POOL_CREATE_FLAG_OWN_PROVIDER));
164+
auto expected_pool = pool.get();
165+
char *ptr = (char *)umfPoolMalloc(expected_pool, SIZE);
166+
ASSERT_NE(ptr, nullptr);
167+
168+
auto ret_pool = umfPoolByPtr(ptr);
169+
EXPECT_EQ(ret_pool, expected_pool);
170+
171+
ret_pool = umfPoolByPtr(ptr + SIZE);
172+
EXPECT_EQ(ret_pool, nullptr);
173+
174+
ret_pool = umfPoolByPtr(ptr + SIZE - 1);
175+
EXPECT_EQ(ret_pool, expected_pool);
176+
177+
ret = umfFree(ptr);
178+
ASSERT_EQ(ret, UMF_RESULT_SUCCESS);
179+
}
180+
#endif /* UMF_ENABLE_POOL_TRACKING_TESTS */
181+
153182
INSTANTIATE_TEST_SUITE_P(
154183
mallocPoolTest, umfPoolTest,
155184
::testing::Values(poolCreateExtParams{&MALLOC_POOL_OPS, nullptr,

0 commit comments

Comments
 (0)