summaryrefslogtreecommitdiff
path: root/cpp/src/qpid/client/SslConnector.cpp
diff options
context:
space:
mode:
authorGordon Sim <gsim@apache.org>2010-04-15 18:08:04 +0000
committerGordon Sim <gsim@apache.org>2010-04-15 18:08:04 +0000
commit339c98598ac775e21e456c60bdbbdb84655f7a40 (patch)
tree2a3e1bc9a33aad9d3f881a7b025136d59305a367 /cpp/src/qpid/client/SslConnector.cpp
parent1da2769ba27a7b40ad88b6acc526311a45fed3ee (diff)
downloadqpid-python-339c98598ac775e21e456c60bdbbdb84655f7a40.tar.gz
QPID-2511: Altered shutdown sequence in connectors; after connect() has returned there will always now be a shutdown callback made and only at that point is it guaranteed that there will be no further io callbacks. ConnectionImpl consequently waits for this before allowing itself to be deleted.
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@934503 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/client/SslConnector.cpp')
-rw-r--r--cpp/src/qpid/client/SslConnector.cpp28
1 files changed, 11 insertions, 17 deletions
diff --git a/cpp/src/qpid/client/SslConnector.cpp b/cpp/src/qpid/client/SslConnector.cpp
index 0c794145db..990ca90de7 100644
--- a/cpp/src/qpid/client/SslConnector.cpp
+++ b/cpp/src/qpid/client/SslConnector.cpp
@@ -106,9 +106,6 @@ class SslConnector : public Connector
~SslConnector();
- void handleClosed();
- bool closeInternal();
-
void readbuff(qpid::sys::ssl::SslIO&, qpid::sys::ssl::SslIOBufferBase*);
void writebuff(qpid::sys::ssl::SslIO&);
void writeDataBlock(const framing::AMQDataBlock& data);
@@ -128,6 +125,7 @@ class SslConnector : public Connector
framing::OutputHandler* getOutputHandler();
const std::string& getIdentifier() const;
const SecuritySettings* getSecuritySettings();
+ void socketClosed(qpid::sys::ssl::SslIO&, const qpid::sys::ssl::SslSocket&);
public:
SslConnector(Poller::shared_ptr p, framing::ProtocolVersion pVersion,
@@ -204,7 +202,7 @@ void SslConnector::connect(const std::string& host, int port){
boost::bind(&SslConnector::readbuff, this, _1, _2),
boost::bind(&SslConnector::eof, this, _1),
boost::bind(&SslConnector::eof, this, _1),
- 0, // closed
+ boost::bind(&SslConnector::socketClosed, this, _1, _2),
0, // nobuffs
boost::bind(&SslConnector::writebuff, this, _1));
writer.init(identifier, aio);
@@ -220,19 +218,20 @@ void SslConnector::init(){
aio->start(poller);
}
-bool SslConnector::closeInternal() {
+void SslConnector::close() {
Mutex::ScopedLock l(closedLock);
- bool ret = !closed;
if (!closed) {
closed = true;
- aio->queueForDeletion();
- socket.close();
+ if (aio)
+ aio->queueWriteClose();
}
- return ret;
}
-void SslConnector::close() {
- closeInternal();
+void SslConnector::socketClosed(SslIO&, const SslSocket&) {
+ if (aio)
+ aio->queueForDeletion();
+ if (shutdownHandler)
+ shutdownHandler->shutdown();
}
void SslConnector::setInputHandler(InputHandler* handler){
@@ -259,11 +258,6 @@ void SslConnector::send(AMQFrame& frame) {
writer.handle(frame);
}
-void SslConnector::handleClosed() {
- if (closeInternal() && shutdownHandler)
- shutdownHandler->shutdown();
-}
-
SslConnector::Writer::Writer(uint16_t s, Bounds* b) : maxFrameSize(s), aio(0), buffer(0), lastEof(0), bounds(b)
{
}
@@ -365,7 +359,7 @@ void SslConnector::writeDataBlock(const AMQDataBlock& data) {
}
void SslConnector::eof(SslIO&) {
- handleClosed();
+ close();
}
const SecuritySettings* SslConnector::getSecuritySettings()