//------------------------------------------------------------------------------------- bool TCPPacketSender::processSend(Channel* pChannel) { bool noticed = pChannel == NULL; // 如果是有poller通知的,我们需要通过地址找到channel if(noticed) pChannel = getChannel(); KBE_ASSERT(pChannel != NULL); if(pChannel->isCondemn()) { return false; } Channel::Bundles& bundles = pChannel->bundles(); Reason reason = REASON_SUCCESS; Channel::Bundles::iterator iter = bundles.begin(); for(; iter != bundles.end(); ++iter) { Bundle::Packets& pakcets = (*iter)->packets(); Bundle::Packets::iterator iter1 = pakcets.begin(); for (; iter1 != pakcets.end(); ++iter1) { reason = processPacket(pChannel, (*iter1)); if(reason != REASON_SUCCESS) break; else RECLAIM_PACKET((*iter)->isTCPPacket(), (*iter1)); } if(reason == REASON_SUCCESS) { pakcets.clear(); Network::Bundle::ObjPool().reclaimObject((*iter)); } else { pakcets.erase(pakcets.begin(), iter1); bundles.erase(bundles.begin(), iter); if (reason == REASON_RESOURCE_UNAVAILABLE) { /* 此处输出可能会造成debugHelper处死锁 WARNING_MSG(fmt::format("TCPPacketSender::processSend: " "Transmit queue full, waiting for space(kbengine.xml->channelCommon->writeBufferSize->{})...\n", (pChannel->isInternal() ? "internal" : "external"))); */ this->dispatcher().errorReporter().reportException(reason, pEndpoint_->addr()); } else { this->dispatcher().errorReporter().reportException(reason, pEndpoint_->addr()); onGetError(pChannel); } return false; } } bundles.clear(); if(noticed) pChannel->onSendCompleted(); return true; }
bool TCPPacketSender::processSend(Channel* pChannel) { bool noticed = pChannel == NULL; //如果由poller通知的,我們需要通過地址找到channel if(noticed) { pChannel = getChannel(); } SLASSERT(pChannel != NULL, "wtf"); if(pChannel->isCondemn()) { return false; } if(!pChannel->isConnected()){ return false; } Channel::Bundles& bundles = pChannel->bundles(); Reason reason = REASON_SUCCESS; Channel::Bundles::iterator iter = bundles.begin(); for (; iter != bundles.end(); ++iter) { Bundle::Packets& packets = (*iter)->packets(); Bundle::Packets::iterator iter1 = packets.begin(); for (; iter1 != packets.end(); ++iter1) { reason = processPacket(pChannel, (*iter1)); if(reason != REASON_SUCCESS) break; else { RECLAIM_PACKET((*iter)->isTCPPacket(), (*iter1)); } } if(reason == REASON_SUCCESS) { packets.clear(); RELEASE_POOL_OBJECT(Bundle, *iter); } else { packets.erase(packets.begin(), iter1); bundles.erase(bundles.begin(), iter); if(reason == REASON_RESOURCE_UNAVAILABLE) { } else { onGetError(pChannel); } return false; } } bundles.clear(); if(noticed) pChannel->onSendCompleted(); return true; }