diff options
author | Stephen D. Huston <shuston@apache.org> | 2009-05-11 22:26:49 +0000 |
---|---|---|
committer | Stephen D. Huston <shuston@apache.org> | 2009-05-11 22:26:49 +0000 |
commit | 6ac75b539d14c1344cf00a696daec110d9710d00 (patch) | |
tree | c0e9cfe56d1ee7ffa03522cae4af7a295eb3ece5 /cpp | |
parent | 2be73b1fa71d50ef20d444d0f2bdce9fd90ccc24 (diff) | |
download | qpid-python-6ac75b539d14c1344cf00a696daec110d9710d00.tar.gz |
Add --quit, --check for Windows; required fixing LockFile for Windows
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@773712 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp')
-rw-r--r-- | cpp/src/qpid/framing/Uuid.h | 3 | ||||
-rw-r--r-- | cpp/src/qpid/sys/LockFile.h | 9 | ||||
-rwxr-xr-x | cpp/src/qpid/sys/windows/LockFile.cpp | 6 | ||||
-rw-r--r-- | cpp/src/windows/QpiddBroker.cpp | 68 |
4 files changed, 77 insertions, 9 deletions
diff --git a/cpp/src/qpid/framing/Uuid.h b/cpp/src/qpid/framing/Uuid.h index fe0c32dc0b..b595a2ff42 100644 --- a/cpp/src/qpid/framing/Uuid.h +++ b/cpp/src/qpid/framing/Uuid.h @@ -58,8 +58,9 @@ struct Uuid : public boost::array<uint8_t, 16> { void clear() { uuid_clear(c_array()); } /** Test for null (all zeros). */ + // Force int 0/!0 to false/true; avoids compile warnings. bool isNull() { - return uuid_is_null(data()); + return !!uuid_is_null(data()); } // Default op= and copy ctor are fine. diff --git a/cpp/src/qpid/sys/LockFile.h b/cpp/src/qpid/sys/LockFile.h index 2ff8c2f6d4..71cb5e2f10 100644 --- a/cpp/src/qpid/sys/LockFile.h +++ b/cpp/src/qpid/sys/LockFile.h @@ -23,6 +23,7 @@ #include <boost/shared_ptr.hpp> #include <string> +#include "qpid/CommonImportExport.h" #include "IntegerTypes.h" namespace qpid { @@ -48,8 +49,8 @@ class LockFile : private boost::noncopyable bool created; public: - LockFile(const std::string& path_, bool create); - ~LockFile(); + QPID_COMMON_EXTERN LockFile(const std::string& path_, bool create); + QPID_COMMON_EXTERN ~LockFile(); /** * Read the process ID from the lock file. This method assumes that @@ -60,7 +61,7 @@ public: * * @returns The stored process ID. No validity check is done on it. */ - pid_t readPid(void) const; + QPID_COMMON_EXTERN pid_t readPid(void) const; /** * Write the current process's ID to the lock file. It's written at @@ -69,7 +70,7 @@ public: * * Throws an exception if the write fails. */ - void writePid(void); + QPID_COMMON_EXTERN void writePid(void); }; }} /* namespace qpid::sys */ diff --git a/cpp/src/qpid/sys/windows/LockFile.cpp b/cpp/src/qpid/sys/windows/LockFile.cpp index 9804020167..766fa6466a 100755 --- a/cpp/src/qpid/sys/windows/LockFile.cpp +++ b/cpp/src/qpid/sys/windows/LockFile.cpp @@ -37,10 +37,10 @@ LockFile::LockFile(const std::string& path_, bool create) : path(path_), created(create) { HANDLE h = CreateFile(path.c_str(), - GENERIC_READ|GENERIC_WRITE, - 0, /* Disable opens by any other attempter */ + create ? (GENERIC_READ|GENERIC_WRITE) : GENERIC_READ, + FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, 0, /* Default security */ - OPEN_ALWAYS, /* Create if needed */ + create ? OPEN_ALWAYS : OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, /* Delete file when closed */ NULL); QPID_WINDOWS_CHECK_NOT(h, INVALID_HANDLE_VALUE); diff --git a/cpp/src/windows/QpiddBroker.cpp b/cpp/src/windows/QpiddBroker.cpp index 8694cefb04..ffc5f700af 100644 --- a/cpp/src/windows/QpiddBroker.cpp +++ b/cpp/src/windows/QpiddBroker.cpp @@ -34,6 +34,7 @@ const char *QPIDD_MODULE_DIR = "."; #include "qpid/Options.h" #include "qpid/Plugin.h" #include "qpid/sys/IntegerTypes.h" +#include "qpid/sys/LockFile.h" #include "qpid/sys/windows/check.h" #include "qpid/broker/Broker.h" @@ -52,8 +53,52 @@ BootstrapOptions::BootstrapOptions(const char* argv0) add(log); } +// Local functions to set and get the pid via a LockFile. +namespace { + +const std::string TCP = "tcp"; + +std::string brokerPidFile(std::string piddir, uint16_t port) +{ + std::ostringstream path; + path << piddir << "\\broker_" << port << ".pid"; + return path.str(); +} + +} + +struct ProcessControlOptions : public qpid::Options { + bool quit; + bool check; + std::string piddir; + //std::string transport; No transport options yet - TCP is it. + + ProcessControlOptions() + : qpid::Options("Process control options"), + quit(false), + check(false) //, transport(TCP) + { + char *tempDir = ::getenv("TEMP"); + + if (tempDir == 0) + piddir = "C:\\WINDOWS\\TEMP"; + else + piddir = tempDir; + piddir += "\\qpidd"; + + // Only have TCP for now, so don't need this... + // ("transport", optValue(transport, "TRANSPORT"), "The transport for which to return the port") + addOptions() + ("pid-dir", qpid::optValue(piddir, "DIR"), "Directory where port-specific PID file is stored") + ("check,c", qpid::optValue(check), "Prints the broker's process ID to stdout and returns 0 if the broker is running, otherwise returns 1") + ("quit,q", qpid::optValue(quit), "Tells the broker to shut down"); + } +}; + struct QpiddWindowsOptions : public QpiddOptionsPrivate { + ProcessControlOptions control; QpiddWindowsOptions(QpiddOptions *parent) : QpiddOptionsPrivate(parent) { + parent->add(control); } }; @@ -84,9 +129,30 @@ int QpiddBroker::execute (QpiddOptions *options) { if (myOptions == 0) throw qpid::Exception("Internal error obtaining platform options"); + if (myOptions->control.check || myOptions->control.quit) { + // Relies on port number being set via --port or QPID_PORT env variable. + qpid::sys::LockFile getPid (brokerPidFile(myOptions->control.piddir, + options->broker.port), + false); + pid_t pid = getPid.readPid(); + if (pid < 0) + return 1; + if (myOptions->control.check) + std::cout << pid << std::endl; + if (myOptions->control.quit) + std::cout << "Need to stop pid " << pid << std::endl; + return 0; + } + boost::intrusive_ptr<Broker> brokerPtr(new Broker(options->broker)); if (options->broker.port == 0) - std::cout << (uint16_t)(brokerPtr->getPort("")) << std::endl; + options->broker.port = brokerPtr->getPort(""); + std::cout << options->broker.port << std::endl; + + qpid::sys::LockFile myPid(brokerPidFile(myOptions->control.piddir, + options->broker.port), + true); + myPid.writePid(); brokerPtr->run(); return 0; } |