OutputMessage_ptr OutputMessagePool::getOutputMessage(Protocol* protocol, bool autosend /*= true*/) { #ifdef __DEBUG_NET_DETAIL__ std::cout << "request output message - auto = " << autosend << std::endl; #endif if(m_shutdown) return OutputMessage_ptr(); OTSYS_THREAD_LOCK_CLASS lockClass(m_outputPoolLock); if(!protocol->getConnection()) return OutputMessage_ptr(); if(m_outputMessages.empty()) { OutputMessage* msg = new OutputMessage(); m_outputMessages.push_back(msg); #ifdef __TRACK_NETWORK__ m_allOutputMessages.push_back(msg); #endif } OutputMessage_ptr omsg; omsg.reset(m_outputMessages.back(), boost::bind(&OutputMessagePool::releaseMessage, this, _1)); m_outputMessages.pop_back(); configureOutputMessage(omsg, protocol, autosend); return omsg; }
OutputMessage_ptr OutputMessagePool::getOutputMessage(Protocol* protocol, bool autosend /*= true*/) { if (!m_isOpen) { return OutputMessage_ptr(); } std::lock_guard<std::recursive_mutex> lockClass(m_outputPoolLock); if (!protocol->getConnection()) { return OutputMessage_ptr(); } if (m_outputMessages.empty()) { OutputMessage* msg = new OutputMessage(); m_outputMessages.push_back(msg); } OutputMessage_ptr outputmessage; outputmessage.reset(m_outputMessages.back(), std::bind(&OutputMessagePool::releaseMessage, this, std::placeholders::_1)); m_outputMessages.pop_back(); configureOutputMessage(outputmessage, protocol, autosend); return outputmessage; }
void Connection::onWriteOperation(OutputMessage_ptr msg, const boost::system::error_code& error) { #ifdef __DEBUG_NET_DETAIL__ std::cout << "onWriteOperation" << std::endl; #endif m_connectionLock.lock(); m_writeTimer.cancel(); TRACK_MESSAGE(msg); msg.reset(); if(error){ handleWriteError(error); } if(m_connectionState != CONNECTION_STATE_OPEN || m_writeError){ closeSocket(); closeConnection(); m_connectionLock.unlock(); return; } --m_pendingWrite; m_connectionLock.unlock(); }
OutputMessage_ptr OutputMessagePool::getOutputMessage(Protocol* protocol, bool autosend /*= true*/) { #ifdef __DEBUG_NET_DETAIL__ std::cout << "request output message - auto = " << autosend << std::endl; #endif if(!m_isOpen){ return OutputMessage_ptr(); } boost::recursive_mutex::scoped_lock lockClass(m_outputPoolLock); if(protocol->getConnection() == NULL){ return OutputMessage_ptr(); } if(m_outputMessages.empty()){ OutputMessage* msg = new OutputMessage(); m_outputMessages.push_back(msg); #ifdef __TRACK_NETWORK__ m_allOutputMessages.push_back(msg); #endif } OutputMessage_ptr outputmessage; outputmessage.reset(m_outputMessages.back(), boost::bind(&OutputMessagePool::releaseMessage, this, _1)); m_outputMessages.pop_back(); configureOutputMessage(outputmessage, protocol, autosend); return outputmessage; }
void Connection::onWriteOperation(OutputMessage_ptr msg, const boost::system::error_code& error) { #ifdef __DEBUG_NET_DETAIL__ std::clog << "onWriteOperation" << std::endl; #endif msg.reset(); m_connectionLock.lock(); if(!error) { if(m_pendingWrite > 0) { if(!m_outputQueue.empty()) { OutputMessage_ptr msg = m_outputQueue.front(); m_outputQueue.pop_front(); internalSend(msg); #ifdef __DEBUG_NET_DETAIL__ std::clog << "Connection::onWriteOperation send " << msg->getMessageLength() << std::endl; #endif } m_pendingWrite--; } else { std::clog << "Error: [Connection::onWriteOperation] Getting unexpected notification!" << std::endl; // Error. Pending operations counter is 0, but we are getting a // notification!! } } else { m_pendingWrite--; handleWriteError(error); } if(m_closeState == CLOSE_STATE_CLOSING) { if(!closingConnection()) m_connectionLock.lock(); return; } m_connectionLock.unlock(); }
void Connection::onWriteOperation(OutputMessage_ptr msg, const boost::system::error_code& error) { std::lock_guard<std::recursive_mutex> lockClass(m_connectionLock);; m_writeTimer.cancel(); msg.reset(); if (error) { handleWriteError(error); } if (m_connectionState != CONNECTION_STATE_OPEN || m_writeError) { closeSocket(); close(); return; } --m_pendingWrite; }
void Connection::onWriteOperation(OutputMessage_ptr msg, const boost::system::error_code& error) { m_connectionLock.lock(); m_writeTimer.cancel(); msg.reset(); if (error) { handleWriteError(error); } if (m_connectionState != CONNECTION_STATE_OPEN || m_writeError) { closeSocket(); closeConnection(); m_connectionLock.unlock(); return; } --m_pendingWrite; m_connectionLock.unlock(); }
void Connection::onWrite(OutputMessage_ptr msg, const boost::system::error_code& error) { LOGt("Connection::onWrite()"); boost::recursive_mutex::scoped_lock lock(m_connectionLock); m_writeTimer.cancel(); TRACK_MESSAGE(msg); msg.reset(); if(error) handleWriteError(error); if(m_connectionState != CONNECTION_STATE_OPEN || m_writeError) { closeSocket(); close(); return; } --m_pendingWrite; }