@@ -116,6 +116,7 @@ class IpcMessageObjectImpl final : public IpcObject
116
116
{
117
117
int32_t ownerPid;
118
118
int32_t ownerId;
119
+ std::atomic_uint8_t alive;
119
120
#ifdef IPC_MESSAGE_USE_SHARED_SIGNAL
120
121
IpcSharedSignal receiverSignal;
121
122
IpcSharedSignal senderSignal;
@@ -140,6 +141,7 @@ class IpcMessageObjectImpl final : public IpcObject
140
141
{
141
142
header->ownerPid = (int ) getpid ();
142
143
header->ownerId = ++IPC_MESSAGE_COUNTER;
144
+ header->alive = 1 ;
143
145
144
146
#ifdef IPC_MESSAGE_USE_SHARED_SIGNAL
145
147
new (&header->receiverSignal ) IpcSharedSignal ();
@@ -320,6 +322,9 @@ inline void IpcMessageReceiver<Message>::disconnect()
320
322
{
321
323
disconnected = true ;
322
324
std::lock_guard mutexLock (mutex);
325
+
326
+ const auto header = ipc.sharedMemory .getHeader ();
327
+ header->alive = 0 ;
323
328
}
324
329
}
325
330
@@ -347,6 +352,7 @@ inline std::optional<Message> IpcMessageReceiver<Message>::receive(std::function
347
352
}
348
353
349
354
ipc.receiverSignal ->reset ();
355
+ header->receiverFlag .store (0 , std::memory_order_release);
350
356
351
357
std::optional<Message> messageOpt;
352
358
@@ -375,10 +381,7 @@ inline std::optional<Message> IpcMessageReceiver<Message>::receive(std::function
375
381
memcpy (span.data (), header->messageBuffer , span.size ());
376
382
}
377
383
378
- header->receiverFlag .store (0 , std::memory_order_release);
379
-
380
384
ipc.senderSignal ->signal ();
381
-
382
385
header->senderFlag .store (1 , std::memory_order_release);
383
386
384
387
return messageOpt;
@@ -430,6 +433,9 @@ inline bool IpcMessageSender<Message>::send(const Message& message, std::functio
430
433
431
434
while (!guard.tryLock (IPC_MESSAGE_TIMEOUT))
432
435
{
436
+ if (!header->alive .load (std::memory_order_relaxed))
437
+ disconnected = true ;
438
+
433
439
if (disconnected)
434
440
return false ;
435
441
@@ -458,14 +464,16 @@ inline bool IpcMessageSender<Message>::send(const Message& message, std::functio
458
464
memcpy (header->messageBuffer , span.data (), span.size ());
459
465
}
460
466
461
- header->receiverFlag .store (1 , std::memory_order_release);
462
-
463
467
ipc.receiverSignal ->signal ();
468
+ header->receiverFlag .store (1 , std::memory_order_release);
464
469
465
470
while (header->senderFlag .load (std::memory_order_acquire) == 0 )
466
471
{
467
472
if (!ipc.senderSignal ->wait (IPC_MESSAGE_TIMEOUT))
468
473
{
474
+ if (!header->alive .load (std::memory_order_relaxed))
475
+ disconnected = true ;
476
+
469
477
if (disconnected)
470
478
return false ;
471
479
@@ -475,7 +483,6 @@ inline bool IpcMessageSender<Message>::send(const Message& message, std::functio
475
483
}
476
484
477
485
ipc.senderSignal ->reset ();
478
-
479
486
header->senderFlag .store (0 , std::memory_order_release);
480
487
481
488
return true ;
0 commit comments