Skip to content

Commit 9f69e06

Browse files
Change return from MemtargetRemove, when removing the last one
previously it was OUT_OF_HOST_MEMORY, now it's INVALID_ARGUMENT. It's aligned with other places, where we disallow creating empty memspace.
1 parent 612ecb4 commit 9f69e06

File tree

2 files changed

+35
-0
lines changed

2 files changed

+35
-0
lines changed

src/memspace.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,13 @@ umfMemspaceMemtargetRemove(umf_memspace_handle_t hMemspace,
387387
if (!hMemspace || !hMemtarget) {
388388
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
389389
}
390+
391+
// Trying to remove the last memory target from the memspace
392+
if (hMemspace->size == 1) {
393+
LOG_ERR("Cannot remove the last memory target from the memspace");
394+
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
395+
}
396+
390397
unsigned i;
391398
for (i = 0; i < hMemspace->size; i++) {
392399
int cmp;

test/memspaces/memtarget.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,3 +145,31 @@ TEST_F(test, memTargetInvalidRemove) {
145145
ret = umfMemspaceDestroy(memspace);
146146
EXPECT_EQ(ret, UMF_RESULT_SUCCESS);
147147
}
148+
149+
TEST_F(test, memTargetRemoveLast) {
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 except the last one
158+
auto len = umfMemspaceMemtargetNum(memspace);
159+
ASSERT_GT(len, 0);
160+
unsigned i = len - 1;
161+
for (; i > 0; i--) {
162+
memtarget = umfMemspaceMemtargetGet(memspace, i);
163+
EXPECT_NE(memtarget, nullptr);
164+
ret = umfMemspaceMemtargetRemove(memspace, memtarget);
165+
ASSERT_EQ(ret, UMF_RESULT_SUCCESS);
166+
}
167+
168+
// removing the last memtarget is not allowed
169+
memtarget = umfMemspaceMemtargetGet(memspace, i);
170+
ret = umfMemspaceMemtargetRemove(memspace, memtarget);
171+
EXPECT_EQ(ret, UMF_RESULT_ERROR_INVALID_ARGUMENT);
172+
173+
ret = umfMemspaceDestroy(memspace);
174+
EXPECT_EQ(ret, UMF_RESULT_SUCCESS);
175+
}

0 commit comments

Comments
 (0)