From 9f9c67b07eda78b45303882b3eb579b258a1dccd Mon Sep 17 00:00:00 2001 From: Thulinma Date: Wed, 13 Dec 2017 10:53:39 +0100 Subject: [PATCH] Fixed deadlock on sharedClient during shutdown --- lib/shared_memory.cpp | 47 +++++++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 22 deletions(-) diff --git a/lib/shared_memory.cpp b/lib/shared_memory.cpp index 8567fbdf..cb8e81c6 100644 --- a/lib/shared_memory.cpp +++ b/lib/shared_memory.cpp @@ -1141,38 +1141,41 @@ namespace IPC { } memset(empty, 0, payLen); } - while (offsetOnPage == -1) { - { - for (char i = 'A'; i <= 'Z'; i++) { - myPage.init(baseName.substr(1) + i, (4096 << (i - 'A')), false, false); - if (!myPage.mapped) { - break; - } - int offset = 0; - while (offset + payLen + (hasCounter ? 1 : 0) <= myPage.len) { + uint32_t attempts = 0; + while (offsetOnPage == -1 && (++attempts) < 20) { + for (char i = 'A'; i <= 'Z'; i++) { + myPage.init(baseName.substr(1) + i, (4096 << (i - 'A')), false, false); + if (!myPage.mapped) { + break; + } + int offset = 0; + while (offset + payLen + (hasCounter ? 1 : 0) <= myPage.len) { + if ((hasCounter && myPage.mapped[offset] == 0) || (!hasCounter && !memcmp(myPage.mapped + offset, empty, payLen))) { + semGuard tmpGuard(&mySemaphore); if ((hasCounter && myPage.mapped[offset] == 0) || (!hasCounter && !memcmp(myPage.mapped + offset, empty, payLen))) { - semGuard tmpGuard(&mySemaphore); - if ((hasCounter && myPage.mapped[offset] == 0) || (!hasCounter && !memcmp(myPage.mapped + offset, empty, payLen))) { - offsetOnPage = offset; - if (hasCounter) { - myPage.mapped[offset] = 1; - *((uint32_t *)(myPage.mapped + 1 + offset + len - 4)) = getpid(); - HIGH_MSG("sharedClient received ID %d", offsetOnPage/(payLen+1)); - } - break; + offsetOnPage = offset; + if (hasCounter) { + myPage.mapped[offset] = 1; + *((uint32_t *)(myPage.mapped + 1 + offset + len - 4)) = getpid(); + HIGH_MSG("sharedClient received ID %d", offsetOnPage/(payLen+1)); } + break; } - offset += payLen + (hasCounter ? 1 : 0); - } - if (offsetOnPage != -1) { - break; } + offset += payLen + (hasCounter ? 1 : 0); + } + if (offsetOnPage != -1) { + break; } } if (offsetOnPage == -1) { Util::wait(500); } } + if (offsetOnPage == -1){ + FAIL_MSG("Could not register on page for %s", baseName.c_str()); + myPage.close(); + } if (empty) { free(empty); }