int WorldSocket::handle_output_queue (GuardType& g) { if (msg_queue()->is_empty()) return cancel_wakeup_output(g); ACE_Message_Block* mblk; if (msg_queue()->dequeue_head(mblk, (ACE_Time_Value*)&ACE_Time_Value::zero) == -1) { sLog->outError(LOG_FILTER_NETWORKIO, "WorldSocket::handle_output_queue dequeue_head"); return -1; } const size_t send_len = mblk->length(); #ifdef MSG_NOSIGNAL ssize_t n = peer().send (mblk->rd_ptr(), send_len, MSG_NOSIGNAL); #else ssize_t n = peer().send (mblk->rd_ptr(), send_len); #endif // MSG_NOSIGNAL if (n == 0) { mblk->release(); return -1; } else if (n == -1) { if (errno == EWOULDBLOCK || errno == EAGAIN) { msg_queue()->enqueue_head(mblk, (ACE_Time_Value*) &ACE_Time_Value::zero); return schedule_wakeup_output (g); } mblk->release(); return -1; } else if (n < (ssize_t)send_len) //now n > 0 { mblk->rd_ptr(static_cast<size_t> (n)); if (msg_queue()->enqueue_head(mblk, (ACE_Time_Value*) &ACE_Time_Value::zero) == -1) { sLog->outError(LOG_FILTER_NETWORKIO, "WorldSocket::handle_output_queue enqueue_head"); mblk->release(); return -1; } return schedule_wakeup_output (g); } else //now n == send_len { mblk->release(); return msg_queue()->is_empty() ? cancel_wakeup_output(g) : ACE_Event_Handler::WRITE_MASK; } ACE_NOTREACHED(return -1); }
int WorldSocket::handle_output(ACE_HANDLE) { ACE_GUARD_RETURN(LockType, Guard, m_OutBufferLock, -1); if (closing_) { return -1; } const size_t send_len = m_OutBuffer->length(); if (send_len == 0) { return cancel_wakeup_output(Guard); } #ifdef MSG_NOSIGNAL ssize_t n = peer().send(m_OutBuffer->rd_ptr(), send_len, MSG_NOSIGNAL); #else ssize_t n = peer().send(m_OutBuffer->rd_ptr(), send_len); #endif // MSG_NOSIGNAL if (n == 0) { return -1; } else if (n == -1) { if (errno == EWOULDBLOCK || errno == EAGAIN) { return schedule_wakeup_output(Guard); } return -1; } else if (n < (ssize_t)send_len) // now n > 0 { m_OutBuffer->rd_ptr(static_cast<size_t>(n)); // move the data to the base of the buffer m_OutBuffer->crunch(); return schedule_wakeup_output(Guard); } else // now n == send_len { m_OutBuffer->reset(); if (!iFlushPacketQueue()) { return cancel_wakeup_output(Guard); } else { return schedule_wakeup_output(Guard); } } ACE_NOTREACHED(return 0); }
int WorldSocket::handle_output(ACE_HANDLE) { std::lock_guard<std::mutex> guard(m_OutBufferLock); if (closing_) return -1; const size_t send_len = m_OutBuffer->length(); if (send_len == 0) return handle_output_queue(guard); #ifdef MSG_NOSIGNAL ssize_t n = peer().send(m_OutBuffer->rd_ptr(), send_len, MSG_NOSIGNAL); #else ssize_t n = peer().send(m_OutBuffer->rd_ptr(), send_len); #endif // MSG_NOSIGNAL if (n == 0) return -1; else if (n == -1) { if (errno == EWOULDBLOCK || errno == EAGAIN) return schedule_wakeup_output(guard); return -1; } else if (n < (ssize_t)send_len) // now n > 0 { m_OutBuffer->rd_ptr(static_cast<size_t>(n)); // move the data to the base of the buffer m_OutBuffer->crunch(); return schedule_wakeup_output(guard); } else // now n == send_len { m_OutBuffer->reset(); return handle_output_queue(guard); } ACE_NOTREACHED(return 0); }