You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by sh...@apache.org on 2009/05/12 00:26:49 UTC
svn commit: r773712 - in /qpid/trunk/qpid/cpp/src: qpid/framing/Uuid.h
qpid/sys/LockFile.h qpid/sys/windows/LockFile.cpp windows/QpiddBroker.cpp
Author: shuston
Date: Mon May 11 22:26:49 2009
New Revision: 773712
URL: http://svn.apache.org/viewvc?rev=773712&view=rev
Log:
Add --quit, --check for Windows; required fixing LockFile for Windows
Modified:
qpid/trunk/qpid/cpp/src/qpid/framing/Uuid.h
qpid/trunk/qpid/cpp/src/qpid/sys/LockFile.h
qpid/trunk/qpid/cpp/src/qpid/sys/windows/LockFile.cpp
qpid/trunk/qpid/cpp/src/windows/QpiddBroker.cpp
Modified: qpid/trunk/qpid/cpp/src/qpid/framing/Uuid.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/framing/Uuid.h?rev=773712&r1=773711&r2=773712&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/framing/Uuid.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/framing/Uuid.h Mon May 11 22:26:49 2009
@@ -58,8 +58,9 @@
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.
Modified: qpid/trunk/qpid/cpp/src/qpid/sys/LockFile.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/sys/LockFile.h?rev=773712&r1=773711&r2=773712&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/sys/LockFile.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/sys/LockFile.h Mon May 11 22:26:49 2009
@@ -23,6 +23,7 @@
#include <boost/shared_ptr.hpp>
#include <string>
+#include "qpid/CommonImportExport.h"
#include "IntegerTypes.h"
namespace qpid {
@@ -48,8 +49,8 @@
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 @@
*
* @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 @@
*
* Throws an exception if the write fails.
*/
- void writePid(void);
+ QPID_COMMON_EXTERN void writePid(void);
};
}} /* namespace qpid::sys */
Modified: qpid/trunk/qpid/cpp/src/qpid/sys/windows/LockFile.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/sys/windows/LockFile.cpp?rev=773712&r1=773711&r2=773712&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/sys/windows/LockFile.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/sys/windows/LockFile.cpp Mon May 11 22:26:49 2009
@@ -37,10 +37,10 @@
: 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);
Modified: qpid/trunk/qpid/cpp/src/windows/QpiddBroker.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/windows/QpiddBroker.cpp?rev=773712&r1=773711&r2=773712&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/windows/QpiddBroker.cpp (original)
+++ qpid/trunk/qpid/cpp/src/windows/QpiddBroker.cpp Mon May 11 22:26:49 2009
@@ -34,6 +34,7 @@
#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 @@
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 @@
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;
}
---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project: http://qpid.apache.org
Use/Interact: mailto:commits-subscribe@qpid.apache.org