| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- /*
- * Copyright (c) 2014, Oculus VR, Inc.
- * All rights reserved.
- *
- * This source code is licensed under the BSD-style license found in the
- * LICENSE file in the root directory of this source tree. An additional grant
- * of patent rights can be found in the PATENTS file in the same directory.
- *
- */
- #include "SendToThread.h"
- #ifdef USE_THREADED_SEND
- #include "RakThread.h"
- #include "InternalPacket.h"
- #include "GetTime.h"
- #if USE_SLIDING_WINDOW_CONGESTION_CONTROL!=1
- #include "CCRakNetUDT.h"
- #else
- #include "CCRakNetSlidingWindow.h"
- #endif
- using namespace RakNet;
- int SendToThread::refCount=0;
- DataStructures::ThreadsafeAllocatingQueue<SendToThread::SendToThreadBlock> SendToThread::objectQueue;
- ThreadPool<SendToThread::SendToThreadBlock*,SendToThread::SendToThreadBlock*> SendToThread::threadPool;
- SendToThread::SendToThreadBlock* SendToWorkerThread(SendToThread::SendToThreadBlock* input, bool *returnOutput, void* perThreadData)
- {
- (void) perThreadData;
- *returnOutput=false;
- // RakNet::TimeUS *mostRecentTime=(RakNet::TimeUS *)input->data;
- // *mostRecentTime=RakNet::GetTimeUS();
- SocketLayer::SendTo(input->s, input->data, input->dataWriteOffset, input->systemAddress, _FILE_AND_LINE_);
- SendToThread::objectQueue.Push(input);
- return 0;
- }
- SendToThread::SendToThread()
- {
- }
- SendToThread::~SendToThread()
- {
- }
- void SendToThread::AddRef(void)
- {
- if (++refCount==1)
- {
- threadPool.StartThreads(1,0);
- }
- }
- void SendToThread::Deref(void)
- {
- if (refCount>0)
- {
- if (--refCount==0)
- {
- threadPool.StopThreads();
- RakAssert(threadPool.NumThreadsWorking()==0);
- unsigned i;
- SendToThreadBlock* info;
- for (i=0; i < threadPool.InputSize(); i++)
- {
- info = threadPool.GetInputAtIndex(i);
- objectQueue.Push(info);
- }
- threadPool.ClearInput();
- objectQueue.Clear(_FILE_AND_LINE_);
- }
- }
- }
- SendToThread::SendToThreadBlock* SendToThread::AllocateBlock(void)
- {
- SendToThread::SendToThreadBlock *b;
- b=objectQueue.Pop();
- if (b==0)
- b=objectQueue.Allocate(_FILE_AND_LINE_);
- return b;
- }
- void SendToThread::ProcessBlock(SendToThread::SendToThreadBlock* threadedSend)
- {
- RakAssert(threadedSend->dataWriteOffset>0 && threadedSend->dataWriteOffset<=MAXIMUM_MTU_SIZE-UDP_HEADER_SIZE);
- threadPool.AddInput(SendToWorkerThread,threadedSend);
- }
- #endif
|