]> 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:02:52 +0000 (21:02 -0700)
committerAmos Jeffries <squid3@treenet.co.nz>
Sat, 10 Nov 2012 04:02:52 +0000 (21:02 -0700)
src/DiskIO/DiskThreads/CommIO.cc
src/DiskIO/DiskThreads/CommIO.h
src/DiskIO/DiskThreads/aiops.cc

index 3e4e23bf4361fa396737884a53e705b1efd12254..87b43987bbcaf4714419d482ef35c38b9b80ca8d 100644 (file)
 #include "globals.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
@@ -63,10 +66,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 b19e0c6711804721a18a812a7cf3efaa38b2d3fb..91db33ec5cdb8142a656e3ffed31ad521fbfefe6 100644 (file)
@@ -10,24 +10,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 b3ae20d93df1f21a6d6387acb33a4efcffe0656e..1269c27d0bb77676fb53a837bbe9407e542f8b56 100644 (file)
@@ -306,6 +306,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));