Beispiel #1
0
//-------------------------------------------------------------------------------------
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;

}