| Index: webrtc/voice_engine/test/channel_transport/udp_socket_manager_posix.cc
|
| diff --git a/webrtc/voice_engine/test/channel_transport/udp_socket_manager_posix.cc b/webrtc/voice_engine/test/channel_transport/udp_socket_manager_posix.cc
|
| deleted file mode 100644
|
| index 6447e8bec1ff154015c699bf15acd0b01751a013..0000000000000000000000000000000000000000
|
| --- a/webrtc/voice_engine/test/channel_transport/udp_socket_manager_posix.cc
|
| +++ /dev/null
|
| @@ -1,392 +0,0 @@
|
| -/*
|
| - * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
|
| - *
|
| - * Use of this source code is governed by a BSD-style license
|
| - * that can be found in the LICENSE file in the root of the source
|
| - * tree. An additional intellectual property rights grant can be found
|
| - * in the file PATENTS. All contributing project authors may
|
| - * be found in the AUTHORS file in the root of the source tree.
|
| - */
|
| -
|
| -#include "webrtc/voice_engine/test/channel_transport/udp_socket_manager_posix.h"
|
| -
|
| -#include <stdio.h>
|
| -#include <strings.h>
|
| -#include <sys/time.h>
|
| -#include <sys/types.h>
|
| -#include <time.h>
|
| -#include <unistd.h>
|
| -
|
| -#include "webrtc/system_wrappers/include/sleep.h"
|
| -#include "webrtc/system_wrappers/include/trace.h"
|
| -#include "webrtc/voice_engine/test/channel_transport/udp_socket_posix.h"
|
| -
|
| -namespace webrtc {
|
| -namespace test {
|
| -
|
| -UdpSocketManagerPosix::UdpSocketManagerPosix()
|
| - : UdpSocketManager(),
|
| - _id(-1),
|
| - _critSect(CriticalSectionWrapper::CreateCriticalSection()),
|
| - _numberOfSocketMgr(-1),
|
| - _incSocketMgrNextTime(0),
|
| - _nextSocketMgrToAssign(0),
|
| - _socketMgr()
|
| -{
|
| -}
|
| -
|
| -bool UdpSocketManagerPosix::Init(int32_t id, uint8_t& numOfWorkThreads) {
|
| - CriticalSectionScoped cs(_critSect);
|
| - if ((_id != -1) || (_numOfWorkThreads != 0)) {
|
| - assert(_id != -1);
|
| - assert(_numOfWorkThreads != 0);
|
| - return false;
|
| - }
|
| -
|
| - _id = id;
|
| - _numberOfSocketMgr = numOfWorkThreads;
|
| - _numOfWorkThreads = numOfWorkThreads;
|
| -
|
| - if(MAX_NUMBER_OF_SOCKET_MANAGERS_LINUX < _numberOfSocketMgr)
|
| - {
|
| - _numberOfSocketMgr = MAX_NUMBER_OF_SOCKET_MANAGERS_LINUX;
|
| - }
|
| - for(int i = 0;i < _numberOfSocketMgr; i++)
|
| - {
|
| - _socketMgr[i] = new UdpSocketManagerPosixImpl();
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -
|
| -UdpSocketManagerPosix::~UdpSocketManagerPosix()
|
| -{
|
| - Stop();
|
| - WEBRTC_TRACE(kTraceDebug, kTraceTransport, _id,
|
| - "UdpSocketManagerPosix(%d)::UdpSocketManagerPosix()",
|
| - _numberOfSocketMgr);
|
| -
|
| - for(int i = 0;i < _numberOfSocketMgr; i++)
|
| - {
|
| - delete _socketMgr[i];
|
| - }
|
| - delete _critSect;
|
| -}
|
| -
|
| -bool UdpSocketManagerPosix::Start()
|
| -{
|
| - WEBRTC_TRACE(kTraceDebug, kTraceTransport, _id,
|
| - "UdpSocketManagerPosix(%d)::Start()",
|
| - _numberOfSocketMgr);
|
| -
|
| - _critSect->Enter();
|
| - bool retVal = true;
|
| - for(int i = 0;i < _numberOfSocketMgr && retVal; i++)
|
| - {
|
| - retVal = _socketMgr[i]->Start();
|
| - }
|
| - if(!retVal)
|
| - {
|
| - WEBRTC_TRACE(
|
| - kTraceError,
|
| - kTraceTransport,
|
| - _id,
|
| - "UdpSocketManagerPosix(%d)::Start() error starting socket managers",
|
| - _numberOfSocketMgr);
|
| - }
|
| - _critSect->Leave();
|
| - return retVal;
|
| -}
|
| -
|
| -bool UdpSocketManagerPosix::Stop()
|
| -{
|
| - WEBRTC_TRACE(kTraceDebug, kTraceTransport, _id,
|
| - "UdpSocketManagerPosix(%d)::Stop()",_numberOfSocketMgr);
|
| -
|
| - _critSect->Enter();
|
| - bool retVal = true;
|
| - for(int i = 0; i < _numberOfSocketMgr && retVal; i++)
|
| - {
|
| - retVal = _socketMgr[i]->Stop();
|
| - }
|
| - if(!retVal)
|
| - {
|
| - WEBRTC_TRACE(
|
| - kTraceError,
|
| - kTraceTransport,
|
| - _id,
|
| - "UdpSocketManagerPosix(%d)::Stop() there are still active socket "
|
| - "managers",
|
| - _numberOfSocketMgr);
|
| - }
|
| - _critSect->Leave();
|
| - return retVal;
|
| -}
|
| -
|
| -bool UdpSocketManagerPosix::AddSocket(UdpSocketWrapper* s)
|
| -{
|
| - WEBRTC_TRACE(kTraceDebug, kTraceTransport, _id,
|
| - "UdpSocketManagerPosix(%d)::AddSocket()",_numberOfSocketMgr);
|
| -
|
| - _critSect->Enter();
|
| - bool retVal = _socketMgr[_nextSocketMgrToAssign]->AddSocket(s);
|
| - if(!retVal)
|
| - {
|
| - WEBRTC_TRACE(
|
| - kTraceError,
|
| - kTraceTransport,
|
| - _id,
|
| - "UdpSocketManagerPosix(%d)::AddSocket() failed to add socket to\
|
| - manager",
|
| - _numberOfSocketMgr);
|
| - }
|
| -
|
| - // Distribute sockets on UdpSocketManagerPosixImpls in a round-robin
|
| - // fashion.
|
| - if(_incSocketMgrNextTime == 0)
|
| - {
|
| - _incSocketMgrNextTime++;
|
| - } else {
|
| - _incSocketMgrNextTime = 0;
|
| - _nextSocketMgrToAssign++;
|
| - if(_nextSocketMgrToAssign >= _numberOfSocketMgr)
|
| - {
|
| - _nextSocketMgrToAssign = 0;
|
| - }
|
| - }
|
| - _critSect->Leave();
|
| - return retVal;
|
| -}
|
| -
|
| -bool UdpSocketManagerPosix::RemoveSocket(UdpSocketWrapper* s)
|
| -{
|
| - WEBRTC_TRACE(kTraceDebug, kTraceTransport, _id,
|
| - "UdpSocketManagerPosix(%d)::RemoveSocket()",
|
| - _numberOfSocketMgr);
|
| -
|
| - _critSect->Enter();
|
| - bool retVal = false;
|
| - for(int i = 0;i < _numberOfSocketMgr && (retVal == false); i++)
|
| - {
|
| - retVal = _socketMgr[i]->RemoveSocket(s);
|
| - }
|
| - if(!retVal)
|
| - {
|
| - WEBRTC_TRACE(
|
| - kTraceError,
|
| - kTraceTransport,
|
| - _id,
|
| - "UdpSocketManagerPosix(%d)::RemoveSocket() failed to remove socket\
|
| - from manager",
|
| - _numberOfSocketMgr);
|
| - }
|
| - _critSect->Leave();
|
| - return retVal;
|
| -}
|
| -
|
| -UdpSocketManagerPosixImpl::UdpSocketManagerPosixImpl()
|
| - : _thread(UdpSocketManagerPosixImpl::Run,
|
| - this,
|
| - "UdpSocketManagerPosixImplThread"),
|
| - _critSectList(CriticalSectionWrapper::CreateCriticalSection()) {
|
| - FD_ZERO(&_readFds);
|
| - WEBRTC_TRACE(kTraceMemory, kTraceTransport, -1,
|
| - "UdpSocketManagerPosix created");
|
| -}
|
| -
|
| -UdpSocketManagerPosixImpl::~UdpSocketManagerPosixImpl()
|
| -{
|
| - if (_critSectList != NULL)
|
| - {
|
| - UpdateSocketMap();
|
| -
|
| - _critSectList->Enter();
|
| - for (std::map<SOCKET, UdpSocketPosix*>::iterator it =
|
| - _socketMap.begin();
|
| - it != _socketMap.end();
|
| - ++it) {
|
| - delete it->second;
|
| - }
|
| - _socketMap.clear();
|
| - _critSectList->Leave();
|
| -
|
| - delete _critSectList;
|
| - }
|
| -
|
| - WEBRTC_TRACE(kTraceMemory, kTraceTransport, -1,
|
| - "UdpSocketManagerPosix deleted");
|
| -}
|
| -
|
| -bool UdpSocketManagerPosixImpl::Start()
|
| -{
|
| - WEBRTC_TRACE(kTraceStateInfo, kTraceTransport, -1,
|
| - "Start UdpSocketManagerPosix");
|
| - _thread.Start();
|
| - _thread.SetPriority(rtc::kRealtimePriority);
|
| - return true;
|
| -}
|
| -
|
| -bool UdpSocketManagerPosixImpl::Stop()
|
| -{
|
| - WEBRTC_TRACE(kTraceStateInfo, kTraceTransport, -1,
|
| - "Stop UdpSocketManagerPosix");
|
| - _thread.Stop();
|
| - return true;
|
| -}
|
| -
|
| -bool UdpSocketManagerPosixImpl::Process()
|
| -{
|
| - bool doSelect = false;
|
| - // Timeout = 1 second.
|
| - struct timeval timeout;
|
| - timeout.tv_sec = 0;
|
| - timeout.tv_usec = 10000;
|
| -
|
| - FD_ZERO(&_readFds);
|
| -
|
| - UpdateSocketMap();
|
| -
|
| - SOCKET maxFd = 0;
|
| - for (std::map<SOCKET, UdpSocketPosix*>::iterator it = _socketMap.begin();
|
| - it != _socketMap.end();
|
| - ++it) {
|
| - doSelect = true;
|
| - if (it->first > maxFd)
|
| - maxFd = it->first;
|
| - FD_SET(it->first, &_readFds);
|
| - }
|
| -
|
| - int num = 0;
|
| - if (doSelect)
|
| - {
|
| - num = select(maxFd+1, &_readFds, NULL, NULL, &timeout);
|
| -
|
| - if (num == SOCKET_ERROR)
|
| - {
|
| - // Timeout = 10 ms.
|
| - SleepMs(10);
|
| - return true;
|
| - }
|
| - }else
|
| - {
|
| - // Timeout = 10 ms.
|
| - SleepMs(10);
|
| - return true;
|
| - }
|
| -
|
| - for (std::map<SOCKET, UdpSocketPosix*>::iterator it = _socketMap.begin();
|
| - it != _socketMap.end();
|
| - ++it) {
|
| - if (FD_ISSET(it->first, &_readFds)) {
|
| - it->second->HasIncoming();
|
| - --num;
|
| - }
|
| - }
|
| -
|
| - return true;
|
| -}
|
| -
|
| -bool UdpSocketManagerPosixImpl::Run(void* obj)
|
| -{
|
| - UdpSocketManagerPosixImpl* mgr =
|
| - static_cast<UdpSocketManagerPosixImpl*>(obj);
|
| - return mgr->Process();
|
| -}
|
| -
|
| -bool UdpSocketManagerPosixImpl::AddSocket(UdpSocketWrapper* s)
|
| -{
|
| - UdpSocketPosix* sl = static_cast<UdpSocketPosix*>(s);
|
| - if(sl->GetFd() == INVALID_SOCKET || !(sl->GetFd() < FD_SETSIZE))
|
| - {
|
| - return false;
|
| - }
|
| - _critSectList->Enter();
|
| - _addList.push_back(s);
|
| - _critSectList->Leave();
|
| - return true;
|
| -}
|
| -
|
| -bool UdpSocketManagerPosixImpl::RemoveSocket(UdpSocketWrapper* s)
|
| -{
|
| - // Put in remove list if this is the correct UdpSocketManagerPosixImpl.
|
| - _critSectList->Enter();
|
| -
|
| - // If the socket is in the add list it's safe to remove and delete it.
|
| - for (SocketList::iterator iter = _addList.begin();
|
| - iter != _addList.end(); ++iter) {
|
| - UdpSocketPosix* addSocket = static_cast<UdpSocketPosix*>(*iter);
|
| - unsigned int addFD = addSocket->GetFd();
|
| - unsigned int removeFD = static_cast<UdpSocketPosix*>(s)->GetFd();
|
| - if(removeFD == addFD)
|
| - {
|
| - _removeList.push_back(removeFD);
|
| - _critSectList->Leave();
|
| - return true;
|
| - }
|
| - }
|
| -
|
| - // Checking the socket map is safe since all Erase and Insert calls to this
|
| - // map are also protected by _critSectList.
|
| - if (_socketMap.find(static_cast<UdpSocketPosix*>(s)->GetFd()) !=
|
| - _socketMap.end()) {
|
| - _removeList.push_back(static_cast<UdpSocketPosix*>(s)->GetFd());
|
| - _critSectList->Leave();
|
| - return true;
|
| - }
|
| - _critSectList->Leave();
|
| - return false;
|
| -}
|
| -
|
| -void UdpSocketManagerPosixImpl::UpdateSocketMap()
|
| -{
|
| - // Remove items in remove list.
|
| - _critSectList->Enter();
|
| - for (FdList::iterator iter = _removeList.begin();
|
| - iter != _removeList.end(); ++iter) {
|
| - UdpSocketPosix* deleteSocket = NULL;
|
| - SOCKET removeFD = *iter;
|
| -
|
| - // If the socket is in the add list it hasn't been added to the socket
|
| - // map yet. Just remove the socket from the add list.
|
| - for (SocketList::iterator iter = _addList.begin();
|
| - iter != _addList.end(); ++iter) {
|
| - UdpSocketPosix* addSocket = static_cast<UdpSocketPosix*>(*iter);
|
| - SOCKET addFD = addSocket->GetFd();
|
| - if(removeFD == addFD)
|
| - {
|
| - deleteSocket = addSocket;
|
| - _addList.erase(iter);
|
| - break;
|
| - }
|
| - }
|
| -
|
| - // Find and remove socket from _socketMap.
|
| - std::map<SOCKET, UdpSocketPosix*>::iterator it =
|
| - _socketMap.find(removeFD);
|
| - if(it != _socketMap.end())
|
| - {
|
| - deleteSocket = it->second;
|
| - _socketMap.erase(it);
|
| - }
|
| - if(deleteSocket)
|
| - {
|
| - deleteSocket->ReadyForDeletion();
|
| - delete deleteSocket;
|
| - }
|
| - }
|
| - _removeList.clear();
|
| -
|
| - // Add sockets from add list.
|
| - for (SocketList::iterator iter = _addList.begin();
|
| - iter != _addList.end(); ++iter) {
|
| - UdpSocketPosix* s = static_cast<UdpSocketPosix*>(*iter);
|
| - if(s) {
|
| - _socketMap[s->GetFd()] = s;
|
| - }
|
| - }
|
| - _addList.clear();
|
| - _critSectList->Leave();
|
| -}
|
| -
|
| -} // namespace test
|
| -} // namespace webrtc
|
|
|