]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Bug 3189: AIO thread race on pipe() initialization
authorAmos Jeffries <squid3@treenet.co.nz>
Sat, 10 Nov 2012 04:37:29 +0000 (21:37 -0700)
committerAmos Jeffries <squid3@treenet.co.nz>
Sat, 10 Nov 2012 04:37:29 +0000 (21:37 -0700)
src/DiskIO/DiskThreads/CommIO.cc
src/DiskIO/DiskThreads/CommIO.h
src/DiskIO/DiskThreads/aiops.cc

index 9e7d56168fa90574e638cb318cd82daafa8618e9..2697df605fc5e2a3c9bb71f33319b9a30c8a662e 100644 (file)
 #include "DiskIO/DiskThreads/CommIO.h"
 
 void
-CommIO::Initialise()
+CommIO::Initialize()
 {
+    if (CommIO::Initialized)
+        return;
+
     /* Initialize done pipe signal */
     int DonePipe[2];
     if (pipe(DonePipe)) {}
     DoneFD = DonePipe[1];
     DoneReadFD = DonePipe[0];
-    fd_open(DoneReadFD, FD_PIPE, "async-io completetion event: main");
-    fd_open(DoneFD, FD_PIPE, "async-io completetion event: threads");
+    fd_open(DoneReadFD, FD_PIPE, "async-io completion event: main");
+    fd_open(DoneFD, FD_PIPE, "async-io completion event: threads");
     commSetNonBlocking(DoneReadFD);
     commSetNonBlocking(DoneFD);
     Comm::SetSelect(DoneReadFD, COMM_SELECT_READ, NULLFDHandler, NULL, 0);
-    Initialised = true;
+    Initialized = true;
 }
 
 void
@@ -62,10 +65,10 @@ CommIO::NotifyIOClose()
     close(DoneReadFD);
     fd_close(DoneFD);
     fd_close(DoneReadFD);
-    Initialised = false;
+    Initialized = false;
 }
 
-bool CommIO::Initialised = false;
+bool CommIO::Initialized = false;
 bool CommIO::DoneSignalled = false;
 int CommIO::DoneFD = -1;
 int CommIO::DoneReadFD = -1;
index cd351b510e1f11bb2ddcb558c35e82660d35b996..3ef109afccbb51b320f5840e85be7bb97e69275d 100644 (file)
@@ -9,25 +9,25 @@ class CommIO
 public:
     static inline void NotifyIOCompleted();
     static void ResetNotifications();
-    static void Initialise();
+    static void Initialize();
     static void NotifyIOClose();
 
 private:
     static void NULLFDHandler(int, void *);
     static void FlushPipe();
-    static bool Initialised;
+    static bool Initialized;
     static bool DoneSignalled;
     static int DoneFD;
     static int DoneReadFD;
 };
 
-
-/* Inline code. TODO: make structued approach to inlining */
+/* Inline code. TODO: make structured approach to inlining */
 void
 CommIO::NotifyIOCompleted()
 {
-    if (!Initialised)
-        Initialise();
+    if (!Initialized) {
+        fatalf("Disk Threads I/O pipes not initialized before first use.");
+    }
 
     if (!DoneSignalled) {
         DoneSignalled = true;
index 926dc7672520e350c3102d2615e626b7cb9ecb3d..6fa7be16c333fa3be4de7842f456d5983ae63182 100644 (file)
@@ -308,6 +308,10 @@ squidaio_init(void)
 
     done_queue.blocked = 0;
 
+    // Initialize the thread I/O pipes before creating any threads
+    // see bug 3189 comment 5 about race conditions.
+    CommIO::Initialize();
+
     /* Create threads and get them to sit in their wait loop */
     squidaio_thread_pool = memPoolCreate("aio_thread", sizeof(squidaio_thread_t));