Skip to content

Commit 9087e18

Browse files
Allow MemtargetRemove to remove the last target with no issue
previously we got OUT_OF_HOST_MEMORY while removing it. Extend the testing to cover this.
1 parent 0efd22b commit 9087e18

File tree

3 files changed

+40
-6
lines changed

3 files changed

+40
-6
lines changed

include/umf/memspace.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,9 @@ umfMemoryProviderCreateFromMemspace(umf_const_memspace_handle_t hMemspace,
4646
umf_const_mempolicy_handle_t hPolicy,
4747
umf_memory_provider_handle_t *hProvider);
4848
///
49-
/// \brief Creates new memspace from array of NUMA node ids.
49+
/// \brief Creates new memspace from an array of NUMA node ids.
5050
/// \param nodeIds array of NUMA node ids
51-
/// \param numIds size of the array
51+
/// \param numIds size of the array; it has to be greater than 0
5252
/// \param hMemspace [out] handle to the newly created memspace
5353
/// \return UMF_RESULT_SUCCESS on success or appropriate error code on failure.
5454
///

src/memspace.c

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,7 @@ umfMemspaceMemtargetRemove(umf_memspace_handle_t hMemspace,
387387
if (!hMemspace || !hMemtarget) {
388388
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
389389
}
390+
390391
unsigned i;
391392
for (i = 0; i < hMemspace->size; i++) {
392393
int cmp;
@@ -407,10 +408,16 @@ umfMemspaceMemtargetRemove(umf_memspace_handle_t hMemspace,
407408
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
408409
}
409410

410-
umf_memtarget_handle_t *newNodes =
411-
umf_ba_global_alloc(sizeof(*newNodes) * (hMemspace->size - 1));
412-
if (!newNodes) {
413-
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
411+
umf_memtarget_handle_t *newNodes = NULL;
412+
413+
if (hMemspace->size == 1) {
414+
LOG_DEBUG("Removing the last memory target from the memspace.");
415+
} else {
416+
newNodes =
417+
umf_ba_global_alloc(sizeof(*newNodes) * (hMemspace->size - 1));
418+
if (!newNodes) {
419+
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
420+
}
414421
}
415422

416423
for (unsigned j = 0, z = 0; j < hMemspace->size; j++) {

test/memspaces/memtarget.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,3 +145,30 @@ TEST_F(test, memTargetInvalidRemove) {
145145
ret = umfMemspaceDestroy(memspace);
146146
EXPECT_EQ(ret, UMF_RESULT_SUCCESS);
147147
}
148+
149+
TEST_F(test, memTargetRemoveAll) {
150+
umf_const_memspace_handle_t const_memspace = umfMemspaceHostAllGet();
151+
umf_memspace_handle_t memspace = nullptr;
152+
umf_result_t ret = umfMemspaceClone(const_memspace, &memspace);
153+
ASSERT_EQ(ret, UMF_RESULT_SUCCESS);
154+
ASSERT_NE(memspace, nullptr);
155+
umf_const_memtarget_handle_t memtarget = nullptr;
156+
157+
// Remove all memtargets
158+
size_t len = umfMemspaceMemtargetNum(memspace);
159+
ASSERT_GT(len, 0);
160+
size_t i = len - 1;
161+
do {
162+
memtarget = umfMemspaceMemtargetGet(memspace, i);
163+
EXPECT_NE(memtarget, nullptr);
164+
ret = umfMemspaceMemtargetRemove(memspace, memtarget);
165+
ASSERT_EQ(ret, UMF_RESULT_SUCCESS);
166+
} while (i-- > 0);
167+
168+
// Try to remove the last one for the second time
169+
ret = umfMemspaceMemtargetRemove(memspace, memtarget);
170+
EXPECT_EQ(ret, UMF_RESULT_ERROR_INVALID_ARGUMENT);
171+
172+
ret = umfMemspaceDestroy(memspace);
173+
EXPECT_EQ(ret, UMF_RESULT_SUCCESS);
174+
}

0 commit comments

Comments
 (0)