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;
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));
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()
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;
#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;
}
void
-CommIO::Initialise()
+CommIO::Initialize()
{
fatal("Not Implemented");
}