Skip to content

Commit afbbca5

Browse files
authored
[z/OS] Add call to shmctl() to release shared memory on z/OS (#130163)
This PR will solve the issue with leaking shared memory we have after running llvm lit test on z/OS. In particular llvm/unittests/ExecutionEngine/Orc/SharedMemoryMapperTest.cpp was causing the leak.
1 parent 86dfd90 commit afbbca5

File tree

2 files changed

+8
-4
lines changed

2 files changed

+8
-4
lines changed

llvm/include/llvm/ExecutionEngine/Orc/MemoryMapper.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ class SharedMemoryMapper final : public MemoryMapper {
157157
struct Reservation {
158158
void *LocalAddr;
159159
size_t Size;
160+
int SharedMemoryId;
160161
};
161162

162163
ExecutorProcessControl &EPC;

llvm/lib/ExecutionEngine/Orc/MemoryMapper.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -220,10 +220,11 @@ void SharedMemoryMapper::reserve(size_t NumBytes,
220220
OnReservedFunction OnReserved) {
221221
#if (defined(LLVM_ON_UNIX) && !defined(__ANDROID__)) || defined(_WIN32)
222222

223+
int SharedMemoryId = -1;
223224
EPC.callSPSWrapperAsync<
224225
rt::SPSExecutorSharedMemoryMapperServiceReserveSignature>(
225226
SAs.Reserve,
226-
[this, NumBytes, OnReserved = std::move(OnReserved)](
227+
[this, NumBytes, OnReserved = std::move(OnReserved), SharedMemoryId](
227228
Error SerializationErr,
228229
Expected<std::pair<ExecutorAddr, std::string>> Result) mutable {
229230
if (SerializationErr) {
@@ -248,7 +249,7 @@ void SharedMemoryMapper::reserve(size_t NumBytes,
248249
SharedMemoryName.size());
249250
auto HashedName = BLAKE3::hash<sizeof(key_t)>(Data);
250251
key_t Key = *reinterpret_cast<key_t *>(HashedName.data());
251-
int SharedMemoryId =
252+
SharedMemoryId =
252253
shmget(Key, NumBytes, IPC_CREAT | __IPC_SHAREAS | 0700);
253254
if (SharedMemoryId < 0) {
254255
return OnReserved(errorCodeToError(
@@ -298,7 +299,8 @@ void SharedMemoryMapper::reserve(size_t NumBytes,
298299
#endif
299300
{
300301
std::lock_guard<std::mutex> Lock(Mutex);
301-
Reservations.insert({RemoteAddr, {LocalAddr, NumBytes}});
302+
Reservations.insert(
303+
{RemoteAddr, {LocalAddr, NumBytes, SharedMemoryId}});
302304
}
303305

304306
OnReserved(ExecutorAddrRange(RemoteAddr, NumBytes));
@@ -396,7 +398,8 @@ void SharedMemoryMapper::release(ArrayRef<ExecutorAddr> Bases,
396398
#if defined(LLVM_ON_UNIX)
397399

398400
#if defined(__MVS__)
399-
if (shmdt(Reservations[Base].LocalAddr) < 0)
401+
if (shmdt(Reservations[Base].LocalAddr) < 0 ||
402+
shmctl(Reservations[Base].SharedMemoryId, IPC_RMID, NULL) < 0)
400403
Err = joinErrors(std::move(Err), errorCodeToError(errnoAsErrorCode()));
401404
#else
402405
if (munmap(Reservations[Base].LocalAddr, Reservations[Base].Size) != 0)

0 commit comments

Comments
 (0)