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

index 4577ab1eea87a49fd3090ea9e7b8c1a6fb569401..33801f160ba8227808942dddc34ffe2d531e7e94 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 25ecbb349efc8811cd9e703a7a2c5b9641f50213..e63746134cf659db945517a3f2bdca2ab1515e05 100644 (file)
@@ -309,6 +309,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));
 
index aff238b425e53811f48e672aa97410ff58419312..97cb50010ee04994ecb87c9443e315933d14d2d9 100644 (file)
@@ -2362,19 +2362,23 @@ comm_accept_try(int fd, void *)
     fdc_table[fd].acceptNext();
 }
 
-void CommIO::Initialise()
+void
+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);
     commSetSelect(DoneReadFD, COMM_SELECT_READ, NULLFDHandler, NULL, 0);
-    Initialised = true;
+    Initialized = true;
 }
 
 void CommIO::NotifyIOClose()
@@ -2385,10 +2389,10 @@ void 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 dfb38ec9543341cc5e6b6a3bb281bfcf925fa49b..61125195190b4ce5171de8dfa4557ea803a7cd81 100644 (file)
@@ -1,7 +1,7 @@
 #include "squid.h"
 #include "CommIO.h"
 
-bool CommIO::Initialised = false;
+bool CommIO::Initialized = false;
 bool CommIO::DoneSignalled = false;
 int CommIO::DoneFD = -1;
 int CommIO::DoneReadFD = -1;
@@ -13,7 +13,7 @@ CommIO::ResetNotifications()
 }
 
 void
-CommIO::Initialise()
+CommIO::Initialize()
 {
     fatal("Not Implemented");
 }