void CUdpServer::HandleSend(CONNID dwConnID, TUdpBufferObj* pBufferObj) { BOOL bNeedFree = FALSE; switch(m_enSendPolicy) { case SP_PACK: { TUdpSocketObj* pSocketObj = FindSocketObj(dwConnID); if(TUdpSocketObj::IsValid(pSocketObj)) { long sndCount = ::InterlockedDecrement(&pSocketObj->sndCount); TriggerFireSend(dwConnID, pBufferObj); if(sndCount == 0) DoSendPack(pSocketObj); } else bNeedFree = TRUE; } break; case SP_SAFE: { long sndCount = -1; TUdpSocketObj* pSocketObj = FindSocketObj(dwConnID); if(TUdpSocketObj::IsValid(pSocketObj)) { sndCount = ::InterlockedDecrement(&pSocketObj->sndCount); if(sndCount == 0 && !pSocketObj->smooth) { CCriSecLock locallock(pSocketObj->crisec); if((sndCount = pSocketObj->sndCount) == 0) pSocketObj->smooth = TRUE; } TriggerFireSend(dwConnID, pBufferObj); if(sndCount == 0) DoSendSafe(pSocketObj); } else bNeedFree = TRUE; } break; case SP_DIRECT: { TriggerFireSend(dwConnID, pBufferObj); } break; default: ASSERT(FALSE); } if(bNeedFree) AddFreeBufferObj(pBufferObj); }
int CTcpAgent::DoSend(TSocketObj* pSocketObj) { switch(m_enSendPolicy) { case SP_PACK: return DoSendPack(pSocketObj); case SP_SAFE: return DoSendSafe(pSocketObj); default: ASSERT(FALSE); return ERROR_INVALID_INDEX; } }
void CTcpAgent::HandleSend(CONNID dwConnID, TSocketObj* pSocketObj, TBufferObj* pBufferObj) { switch(m_enSendPolicy) { case SP_PACK: { long sndCount = ::InterlockedDecrement(&pSocketObj->sndCount); TriggerFireSend(dwConnID, pBufferObj); if(sndCount == 0) DoSendPack(pSocketObj); } break; case SP_SAFE: { long sndCount = ::InterlockedDecrement(&pSocketObj->sndCount); if(sndCount == 0 && !pSocketObj->smooth) { CCriSecLock locallock(pSocketObj->crisec); if((sndCount = pSocketObj->sndCount) == 0) pSocketObj->smooth = TRUE; } TriggerFireSend(dwConnID, pBufferObj); if(sndCount == 0) DoSendSafe(pSocketObj); } break; case SP_DIRECT: { TriggerFireSend(dwConnID, pBufferObj); } break; default: ASSERT(FALSE); } }
void CTcpServer::HandleSend(CONNID dwConnID, TSocketObj* pSocketObj, TBufferObj* pBufferObj) { int iLength = -(long)(pBufferObj->buff.len); switch(m_enSendPolicy) { case SP_PACK: { ::InterlockedExchangeAdd(&pSocketObj->sndCount, iLength); TriggerFireSend(pSocketObj, pBufferObj); DoSendPack(pSocketObj); } break; case SP_SAFE: { ::InterlockedExchangeAdd(&pSocketObj->sndCount, iLength); TriggerFireSend(pSocketObj, pBufferObj); DoSendSafe(pSocketObj); } break; case SP_DIRECT: { ::InterlockedExchangeAdd(&pSocketObj->pending, iLength); TriggerFireSend(pSocketObj, pBufferObj); } break; default: ASSERT(FALSE); } }