summaryrefslogtreecommitdiff
path: root/cpp/src/qpid/broker
diff options
context:
space:
mode:
authorAndrew Stitcher <astitcher@apache.org>2008-04-18 21:03:49 +0000
committerAndrew Stitcher <astitcher@apache.org>2008-04-18 21:03:49 +0000
commitdf28afb19a10c804cd02696bd94b09fed1719478 (patch)
tree9aafbc5ee664b561257cebe8edd2c46955b0999d /cpp/src/qpid/broker
parent8633240562fad63a493b319d12b9c663ca081c75 (diff)
downloadqpid-python-df28afb19a10c804cd02696bd94b09fed1719478.tar.gz
Refactored Acceptor code to allow multiple acceptors to be present in the broker
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@649689 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/broker')
-rw-r--r--cpp/src/qpid/broker/Broker.cpp47
-rw-r--r--cpp/src/qpid/broker/Broker.h18
2 files changed, 45 insertions, 20 deletions
diff --git a/cpp/src/qpid/broker/Broker.cpp b/cpp/src/qpid/broker/Broker.cpp
index 9773b49b93..c32a8f889e 100644
--- a/cpp/src/qpid/broker/Broker.cpp
+++ b/cpp/src/qpid/broker/Broker.cpp
@@ -260,8 +260,7 @@ void Broker::setStore (MessageStore* _store)
}
void Broker::run() {
-
- getAcceptor().run(poller, &factory);
+ accept();
Dispatcher d(poller);
int numIOThreads = config.workerThreads;
@@ -298,18 +297,6 @@ Broker::~Broker() {
}
}
-uint16_t Broker::getPort() const { return getAcceptor().getPort(); }
-
-Acceptor& Broker::getAcceptor() const {
- if (!acceptor) {
- const_cast<Acceptor::shared_ptr&>(acceptor) =
- Acceptor::create(config.port,
- config.connectionBacklog);
- QPID_LOG(info, "Listening on port " << getPort());
- }
- return *acceptor;
-}
-
ManagementObject::shared_ptr Broker::GetManagementObject(void) const
{
return dynamic_pointer_cast<ManagementObject> (mgmtObject);
@@ -348,11 +335,41 @@ Manageable::status_t Broker::ManagementMethod (uint32_t methodId,
return status;
}
+boost::shared_ptr<Acceptor> Broker::getAcceptor() const {
+ assert(acceptors.size() > 0);
+#if 0
+ if (!acceptor) {
+ const_cast<Acceptor::shared_ptr&>(acceptor) =
+ Acceptor::create(config.port,
+ config.connectionBacklog);
+ QPID_LOG(info, "Listening on port " << getPort());
+ }
+#endif
+ return acceptors[0];
+}
+
+void Broker::registerAccepter(Acceptor::shared_ptr acceptor) {
+ acceptors.push_back(acceptor);
+}
+
+// TODO: This can only work if there is only one acceptor
+uint16_t Broker::getPort() const {
+ return getAcceptor()->getPort();
+}
+
+// TODO: This should iterate over all acceptors
+void Broker::accept() {
+ for (unsigned int i = 0; i < acceptors.size(); ++i)
+ acceptors[i]->run(poller, &factory);
+}
+
+
+// TODO: How to chose the acceptor to use for the connection
void Broker::connect(
const std::string& host, uint16_t port,
sys::ConnectionCodec::Factory* f)
{
- getAcceptor().connect(poller, host, port, f ? f : &factory);
+ getAcceptor()->connect(poller, host, port, f ? f : &factory);
}
void Broker::connect(
diff --git a/cpp/src/qpid/broker/Broker.h b/cpp/src/qpid/broker/Broker.h
index 49c4b203c4..02f34ff3ba 100644
--- a/cpp/src/qpid/broker/Broker.h
+++ b/cpp/src/qpid/broker/Broker.h
@@ -43,7 +43,6 @@
#include "qpid/framing/FrameHandler.h"
#include "qpid/framing/OutputHandler.h"
#include "qpid/framing/ProtocolInitiation.h"
-#include "qpid/sys/Acceptor.h"
#include "qpid/sys/Runnable.h"
#include <vector>
@@ -51,6 +50,7 @@
namespace qpid {
namespace sys {
+ class Acceptor;
class Poller;
}
@@ -124,6 +124,12 @@ class Broker : public sys::Runnable, public Plugin::Target,
management::Manageable::status_t
ManagementMethod (uint32_t methodId, management::Args& args);
+ /** Add to the broker's acceptors */
+ void registerAccepter(boost::shared_ptr<sys::Acceptor>);
+
+ /** Accept connections */
+ void accept();
+
/** Create a connection to another broker. */
void connect(const std::string& host, uint16_t port,
sys::ConnectionCodec::Factory* =0);
@@ -131,11 +137,9 @@ class Broker : public sys::Runnable, public Plugin::Target,
void connect(const Url& url, sys::ConnectionCodec::Factory* =0);
private:
- sys::Acceptor& getAcceptor() const;
-
- boost::shared_ptr<qpid::sys::Poller> poller;
+ boost::shared_ptr<sys::Poller> poller;
Options config;
- sys::Acceptor::shared_ptr acceptor;
+ std::vector< boost::shared_ptr<sys::Acceptor> > acceptors;
MessageStore* store;
DataDir dataDir;
@@ -150,6 +154,10 @@ class Broker : public sys::Runnable, public Plugin::Target,
Vhost::shared_ptr vhostObject;
System::shared_ptr systemObject;
+ // TODO: There is no longer a single acceptor so the use of the following needs to be fixed
+ // For the present just return the first acceptor registered.
+ boost::shared_ptr<sys::Acceptor> getAcceptor() const;
+
void declareStandardExchange(const std::string& name, const std::string& type);
};