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