diff --git a/src/AppendTask.cpp b/src/AppendTask.cpp index 947c70524..063999282 100644 --- a/src/AppendTask.cpp +++ b/src/AppendTask.cpp @@ -6,8 +6,6 @@ using namespace std; -extern storagemanager::IOCoordinator *ioc; - namespace storagemanager { diff --git a/src/IOCoordinator.cpp b/src/IOCoordinator.cpp index 5982010e7..e1587dad8 100644 --- a/src/IOCoordinator.cpp +++ b/src/IOCoordinator.cpp @@ -10,6 +10,12 @@ using namespace std; +namespace +{ + storagemanager::IOCoordinator *ioc = NULL; + boost::mutex m; +} + namespace storagemanager { @@ -21,6 +27,17 @@ IOCoordinator::~IOCoordinator() { } +IOCoordinator * IOCoordinator::get() +{ + if (ioc) + return ioc; + boost::mutex::scoped_lock s(m); + if (ioc) + return ioc; + ioc = new IOCoordinator(); + return ioc; +} + void IOCoordinator::willRead(const char *, off_t, size_t) { // no cache yet diff --git a/src/IOCoordinator.h b/src/IOCoordinator.h index 1be3a2a30..bb73aafba 100644 --- a/src/IOCoordinator.h +++ b/src/IOCoordinator.h @@ -8,6 +8,7 @@ #include #include #include +#include namespace storagemanager { @@ -15,7 +16,7 @@ namespace storagemanager class IOCoordinator : public boost::noncopyable { public: - IOCoordinator(); + static IOCoordinator *get(); virtual ~IOCoordinator(); void willRead(const char *filename, off_t offset, size_t length); @@ -27,6 +28,9 @@ class IOCoordinator : public boost::noncopyable int stat(const char *path, struct stat *out); int truncate(const char *path, size_t newsize); int unlink(const char *path); + + private: + IOCoordinator(); }; } diff --git a/src/ListDirectoryTask.cpp b/src/ListDirectoryTask.cpp index 4c7a6aa5d..a6eb50ff7 100644 --- a/src/ListDirectoryTask.cpp +++ b/src/ListDirectoryTask.cpp @@ -8,8 +8,6 @@ using namespace std; -extern storagemanager::IOCoordinator *ioc; - namespace storagemanager { diff --git a/src/OpenTask.cpp b/src/OpenTask.cpp index cf2f9e773..e59f12ece 100644 --- a/src/OpenTask.cpp +++ b/src/OpenTask.cpp @@ -9,8 +9,6 @@ using namespace std; -extern storagemanager::IOCoordinator *ioc; - namespace storagemanager { diff --git a/src/PosixTask.cpp b/src/PosixTask.cpp index 6a95d6000..b5479c16e 100644 --- a/src/PosixTask.cpp +++ b/src/PosixTask.cpp @@ -22,6 +22,7 @@ PosixTask::PosixTask(int _sock, uint _length) : bufferLen(0), socketReturned(false) { + ioc = IOCoordinator::get(); } PosixTask::~PosixTask() diff --git a/src/PosixTask.h b/src/PosixTask.h index 53af31904..b406968ef 100644 --- a/src/PosixTask.h +++ b/src/PosixTask.h @@ -6,6 +6,7 @@ #include #include #include +#include "IOCoordinator.h" namespace storagemanager { @@ -30,6 +31,8 @@ class PosixTask void returnSocket(); void socketError(); + IOCoordinator *ioc; + private: PosixTask(); diff --git a/src/ReadTask.cpp b/src/ReadTask.cpp index cb364ccd7..e6b291e99 100644 --- a/src/ReadTask.cpp +++ b/src/ReadTask.cpp @@ -6,8 +6,6 @@ using namespace std; -extern storagemanager::IOCoordinator *ioc; - namespace storagemanager { diff --git a/src/StatTask.cpp b/src/StatTask.cpp index 57d74a07f..a8724ef7c 100644 --- a/src/StatTask.cpp +++ b/src/StatTask.cpp @@ -10,8 +10,6 @@ using namespace std; -extern storagemanager::IOCoordinator *ioc; - namespace storagemanager { diff --git a/src/TruncateTask.cpp b/src/TruncateTask.cpp index bbd43474a..c8077bf06 100644 --- a/src/TruncateTask.cpp +++ b/src/TruncateTask.cpp @@ -6,8 +6,6 @@ using namespace std; -extern storagemanager::IOCoordinator *ioc; - namespace storagemanager { diff --git a/src/UnlinkTask.cpp b/src/UnlinkTask.cpp index b21712bff..ff1446517 100644 --- a/src/UnlinkTask.cpp +++ b/src/UnlinkTask.cpp @@ -6,8 +6,6 @@ using namespace std; -extern storagemanager::IOCoordinator *ioc; - namespace storagemanager { diff --git a/src/WriteTask.cpp b/src/WriteTask.cpp index d0ba240a3..878e2a4fb 100644 --- a/src/WriteTask.cpp +++ b/src/WriteTask.cpp @@ -6,8 +6,6 @@ using namespace std; -extern storagemanager::IOCoordinator *ioc; - namespace storagemanager { diff --git a/src/main.cpp b/src/main.cpp index fd1fe8de6..4caed938c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -10,17 +10,13 @@ using namespace std; #include "SessionManager.h" -#include "IOCoordinator.h" using namespace storagemanager; -IOCoordinator *ioc; - int main(int argc, char** argv) { int ret = 0; SessionManager sessionManager = SessionManager(); - ioc = new IOCoordinator(); ret = sessionManager.start(); diff --git a/src/unit_tests.cpp b/src/unit_tests.cpp index 111a68c6e..575ec98ce 100644 --- a/src/unit_tests.cpp +++ b/src/unit_tests.cpp @@ -6,7 +6,6 @@ #include "TruncateTask.h" #include "ListDirectoryTask.h" #include "PingTask.h" -#include "IOCoordinator.h" #include "messageFormat.h" #include #include @@ -26,8 +25,6 @@ using namespace storagemanager; using namespace std; -IOCoordinator *ioc; - struct scoped_closer { scoped_closer(int f) : fd(f) { } ~scoped_closer() { @@ -403,7 +400,6 @@ bool pingtask() int main() { - ioc = new IOCoordinator(); cout << "connecting" << endl; makeConnection(); cout << "connected" << endl;