@@ -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