| Index: net/third_party/udt/src/queue.h
|
| ===================================================================
|
| --- net/third_party/udt/src/queue.h (revision 78992)
|
| +++ net/third_party/udt/src/queue.h (working copy)
|
| @@ -1,519 +0,0 @@
|
| -/*****************************************************************************
|
| -Copyright (c) 2001 - 2011, The Board of Trustees of the University of Illinois.
|
| -All rights reserved.
|
| -
|
| -Redistribution and use in source and binary forms, with or without
|
| -modification, are permitted provided that the following conditions are
|
| -met:
|
| -
|
| -* Redistributions of source code must retain the above
|
| - copyright notice, this list of conditions and the
|
| - following disclaimer.
|
| -
|
| -* Redistributions in binary form must reproduce the
|
| - above copyright notice, this list of conditions
|
| - and the following disclaimer in the documentation
|
| - and/or other materials provided with the distribution.
|
| -
|
| -* Neither the name of the University of Illinois
|
| - nor the names of its contributors may be used to
|
| - endorse or promote products derived from this
|
| - software without specific prior written permission.
|
| -
|
| -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
| -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
| -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
| -PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
| -CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
| -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
| -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
| -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
| -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
| -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
| -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| -*****************************************************************************/
|
| -
|
| -/*****************************************************************************
|
| -written by
|
| - Yunhong Gu, last updated 01/12/2011
|
| -*****************************************************************************/
|
| -
|
| -
|
| -#ifndef __UDT_QUEUE_H__
|
| -#define __UDT_QUEUE_H__
|
| -
|
| -#include "common.h"
|
| -#include "packet.h"
|
| -#include "channel.h"
|
| -#include <vector>
|
| -#include <map>
|
| -#include <queue>
|
| -
|
| -class CUDT;
|
| -
|
| -struct CUnit
|
| -{
|
| - CPacket m_Packet; // packet
|
| - int m_iFlag; // 0: free, 1: occupied, 2: msg read but not freed (out-of-order), 3: msg dropped
|
| -};
|
| -
|
| -class CUnitQueue
|
| -{
|
| -friend class CRcvQueue;
|
| -friend class CRcvBuffer;
|
| -
|
| -public:
|
| - CUnitQueue();
|
| - ~CUnitQueue();
|
| -
|
| -public:
|
| -
|
| - // Functionality:
|
| - // Initialize the unit queue.
|
| - // Parameters:
|
| - // 1) [in] size: queue size
|
| - // 2) [in] mss: maximum segament size
|
| - // 3) [in] version: IP version
|
| - // Returned value:
|
| - // 0: success, -1: failure.
|
| -
|
| - int init(const int& size, const int& mss, const int& version);
|
| -
|
| - // Functionality:
|
| - // Increase (double) the unit queue size.
|
| - // Parameters:
|
| - // None.
|
| - // Returned value:
|
| - // 0: success, -1: failure.
|
| -
|
| - int increase();
|
| -
|
| - // Functionality:
|
| - // Decrease (halve) the unit queue size.
|
| - // Parameters:
|
| - // None.
|
| - // Returned value:
|
| - // 0: success, -1: failure.
|
| -
|
| - int shrink();
|
| -
|
| - // Functionality:
|
| - // find an available unit for incoming packet.
|
| - // Parameters:
|
| - // None.
|
| - // Returned value:
|
| - // Pointer to the available unit, NULL if not found.
|
| -
|
| - CUnit* getNextAvailUnit();
|
| -
|
| -private:
|
| - struct CQEntry
|
| - {
|
| - CUnit* m_pUnit; // unit queue
|
| - char* m_pBuffer; // data buffer
|
| - int m_iSize; // size of each queue
|
| -
|
| - CQEntry* m_pNext;
|
| - }
|
| - *m_pQEntry, // pointer to the first unit queue
|
| - *m_pCurrQueue, // pointer to the current available queue
|
| - *m_pLastQueue; // pointer to the last unit queue
|
| -
|
| - CUnit* m_pAvailUnit; // recent available unit
|
| -
|
| - int m_iSize; // total size of the unit queue, in number of packets
|
| - int m_iCount; // total number of valid packets in the queue
|
| -
|
| - int m_iMSS; // unit buffer size
|
| - int m_iIPversion; // IP version
|
| -
|
| -private:
|
| - CUnitQueue(const CUnitQueue&);
|
| - CUnitQueue& operator=(const CUnitQueue&);
|
| -};
|
| -
|
| -struct CSNode
|
| -{
|
| - CUDT* m_pUDT; // Pointer to the instance of CUDT socket
|
| - uint64_t m_llTimeStamp; // Time Stamp
|
| -
|
| - int m_iHeapLoc; // location on the heap, -1 means not on the heap
|
| -};
|
| -
|
| -class CSndUList
|
| -{
|
| -friend class CSndQueue;
|
| -
|
| -public:
|
| - CSndUList();
|
| - ~CSndUList();
|
| -
|
| -public:
|
| -
|
| - // Functionality:
|
| - // Insert a new UDT instance into the list.
|
| - // Parameters:
|
| - // 1) [in] ts: time stamp: next processing time
|
| - // 2) [in] u: pointer to the UDT instance
|
| - // Returned value:
|
| - // None.
|
| -
|
| - void insert(const int64_t& ts, const CUDT* u);
|
| -
|
| - // Functionality:
|
| - // Update the timestamp of the UDT instance on the list.
|
| - // Parameters:
|
| - // 1) [in] u: pointer to the UDT instance
|
| - // 2) [in] resechedule: if the timestampe shoudl be rescheduled
|
| - // Returned value:
|
| - // None.
|
| -
|
| - void update(const CUDT* u, const bool& reschedule = true);
|
| -
|
| - // Functionality:
|
| - // Retrieve the next packet and peer address from the first entry, and reschedule it in the queue.
|
| - // Parameters:
|
| - // 0) [out] addr: destination address of the next packet
|
| - // 1) [out] pkt: the next packet to be sent
|
| - // Returned value:
|
| - // 1 if successfully retrieved, -1 if no packet found.
|
| -
|
| - int pop(sockaddr*& addr, CPacket& pkt);
|
| -
|
| - // Functionality:
|
| - // Remove UDT instance from the list.
|
| - // Parameters:
|
| - // 1) [in] u: pointer to the UDT instance
|
| - // Returned value:
|
| - // None.
|
| -
|
| - void remove(const CUDT* u);
|
| -
|
| - // Functionality:
|
| - // Retrieve the next scheduled processing time.
|
| - // Parameters:
|
| - // None.
|
| - // Returned value:
|
| - // Scheduled processing time of the first UDT socket in the list.
|
| -
|
| - uint64_t getNextProcTime();
|
| -
|
| -private:
|
| - void insert_(const int64_t& ts, const CUDT* u);
|
| - void remove_(const CUDT* u);
|
| -
|
| -private:
|
| - CSNode** m_pHeap; // The heap array
|
| - int m_iArrayLength; // physical length of the array
|
| - int m_iLastEntry; // position of last entry on the heap array
|
| -
|
| - pthread_mutex_t m_ListLock;
|
| -
|
| - pthread_mutex_t* m_pWindowLock;
|
| - pthread_cond_t* m_pWindowCond;
|
| -
|
| - CTimer* m_pTimer;
|
| -
|
| -private:
|
| - CSndUList(const CSndUList&);
|
| - CSndUList& operator=(const CSndUList&);
|
| -};
|
| -
|
| -struct CRNode
|
| -{
|
| - CUDT* m_pUDT; // Pointer to the instance of CUDT socket
|
| - uint64_t m_llTimeStamp; // Time Stamp
|
| -
|
| - CRNode* m_pPrev; // previous link
|
| - CRNode* m_pNext; // next link
|
| -
|
| - bool m_bOnList; // if the node is already on the list
|
| -};
|
| -
|
| -class CRcvUList
|
| -{
|
| -public:
|
| - CRcvUList();
|
| - ~CRcvUList();
|
| -
|
| -public:
|
| -
|
| - // Functionality:
|
| - // Insert a new UDT instance to the list.
|
| - // Parameters:
|
| - // 1) [in] u: pointer to the UDT instance
|
| - // Returned value:
|
| - // None.
|
| -
|
| - void insert(const CUDT* u);
|
| -
|
| - // Functionality:
|
| - // Remove the UDT instance from the list.
|
| - // Parameters:
|
| - // 1) [in] u: pointer to the UDT instance
|
| - // Returned value:
|
| - // None.
|
| -
|
| - void remove(const CUDT* u);
|
| -
|
| - // Functionality:
|
| - // Move the UDT instance to the end of the list, if it already exists; otherwise, do nothing.
|
| - // Parameters:
|
| - // 1) [in] u: pointer to the UDT instance
|
| - // Returned value:
|
| - // None.
|
| -
|
| - void update(const CUDT* u);
|
| -
|
| -public:
|
| - CRNode* m_pUList; // the head node
|
| -
|
| -private:
|
| - CRNode* m_pLast; // the last node
|
| -
|
| -private:
|
| - CRcvUList(const CRcvUList&);
|
| - CRcvUList& operator=(const CRcvUList&);
|
| -};
|
| -
|
| -class CHash
|
| -{
|
| -public:
|
| - CHash();
|
| - ~CHash();
|
| -
|
| -public:
|
| -
|
| - // Functionality:
|
| - // Initialize the hash table.
|
| - // Parameters:
|
| - // 1) [in] size: hash table size
|
| - // Returned value:
|
| - // None.
|
| -
|
| - void init(const int& size);
|
| -
|
| - // Functionality:
|
| - // Look for a UDT instance from the hash table.
|
| - // Parameters:
|
| - // 1) [in] id: socket ID
|
| - // Returned value:
|
| - // Pointer to a UDT instance, or NULL if not found.
|
| -
|
| - CUDT* lookup(const int32_t& id);
|
| -
|
| - // Functionality:
|
| - // Insert an entry to the hash table.
|
| - // Parameters:
|
| - // 1) [in] id: socket ID
|
| - // 2) [in] u: pointer to the UDT instance
|
| - // Returned value:
|
| - // None.
|
| -
|
| - void insert(const int32_t& id, const CUDT* u);
|
| -
|
| - // Functionality:
|
| - // Remove an entry from the hash table.
|
| - // Parameters:
|
| - // 1) [in] id: socket ID
|
| - // Returned value:
|
| - // None.
|
| -
|
| - void remove(const int32_t& id);
|
| -
|
| -private:
|
| - struct CBucket
|
| - {
|
| - int32_t m_iID; // Socket ID
|
| - CUDT* m_pUDT; // Socket instance
|
| -
|
| - CBucket* m_pNext; // next bucket
|
| - } **m_pBucket; // list of buckets (the hash table)
|
| -
|
| - int m_iHashSize; // size of hash table
|
| -
|
| -private:
|
| - CHash(const CHash&);
|
| - CHash& operator=(const CHash&);
|
| -};
|
| -
|
| -class CRendezvousQueue
|
| -{
|
| -public:
|
| - CRendezvousQueue();
|
| - ~CRendezvousQueue();
|
| -
|
| -public:
|
| - void insert(const UDTSOCKET& id, const int& ipv, const sockaddr* addr);
|
| - void remove(const UDTSOCKET& id);
|
| - bool retrieve(const sockaddr* addr, UDTSOCKET& id);
|
| -
|
| -private:
|
| - struct CRL
|
| - {
|
| - UDTSOCKET m_iID;
|
| - int m_iIPversion;
|
| - sockaddr* m_pPeerAddr;
|
| - };
|
| - std::vector<CRL> m_vRendezvousID; // The sockets currently in rendezvous mode
|
| -
|
| - pthread_mutex_t m_RIDVectorLock;
|
| -};
|
| -
|
| -class CSndQueue
|
| -{
|
| -friend class CUDT;
|
| -friend class CUDTUnited;
|
| -
|
| -public:
|
| - CSndQueue();
|
| - ~CSndQueue();
|
| -
|
| -public:
|
| -
|
| - // Functionality:
|
| - // Initialize the sending queue.
|
| - // Parameters:
|
| - // 1) [in] c: UDP channel to be associated to the queue
|
| - // 2) [in] t: Timer
|
| - // Returned value:
|
| - // None.
|
| -
|
| - void init(const CChannel* c, const CTimer* t);
|
| -
|
| - // Functionality:
|
| - // Send out a packet to a given address.
|
| - // Parameters:
|
| - // 1) [in] addr: destination address
|
| - // 2) [in] packet: packet to be sent out
|
| - // Returned value:
|
| - // Size of data sent out.
|
| -
|
| - int sendto(const sockaddr* addr, CPacket& packet);
|
| -
|
| -private:
|
| -#ifndef WIN32
|
| - static void* worker(void* param);
|
| -#else
|
| - static DWORD WINAPI worker(LPVOID param);
|
| -#endif
|
| -
|
| - pthread_t m_WorkerThread;
|
| -
|
| -private:
|
| - CSndUList* m_pSndUList; // List of UDT instances for data sending
|
| - CChannel* m_pChannel; // The UDP channel for data sending
|
| - CTimer* m_pTimer; // Timing facility
|
| -
|
| - pthread_mutex_t m_WindowLock;
|
| - pthread_cond_t m_WindowCond;
|
| -
|
| - volatile bool m_bClosing; // closing the worker
|
| - pthread_cond_t m_ExitCond;
|
| -
|
| -private:
|
| - CSndQueue(const CSndQueue&);
|
| - CSndQueue& operator=(const CSndQueue&);
|
| -};
|
| -
|
| -class CRcvQueue
|
| -{
|
| -friend class CUDT;
|
| -friend class CUDTUnited;
|
| -
|
| -public:
|
| - CRcvQueue();
|
| - ~CRcvQueue();
|
| -
|
| -public:
|
| -
|
| - // Functionality:
|
| - // Initialize the receiving queue.
|
| - // Parameters:
|
| - // 1) [in] size: queue size
|
| - // 2) [in] mss: maximum packet size
|
| - // 3) [in] version: IP version
|
| - // 4) [in] hsize: hash table size
|
| - // 5) [in] c: UDP channel to be associated to the queue
|
| - // 6) [in] t: timer
|
| - // Returned value:
|
| - // None.
|
| -
|
| - void init(const int& size, const int& payload, const int& version, const int& hsize, const CChannel* c, const CTimer* t);
|
| -
|
| - // Functionality:
|
| - // Read a packet for a specific UDT socket id.
|
| - // Parameters:
|
| - // 1) [in] id: Socket ID
|
| - // 2) [out] packet: received packet
|
| - // Returned value:
|
| - // Data size of the packet
|
| -
|
| - int recvfrom(const int32_t& id, CPacket& packet);
|
| -
|
| -private:
|
| -#ifndef WIN32
|
| - static void* worker(void* param);
|
| -#else
|
| - static DWORD WINAPI worker(LPVOID param);
|
| -#endif
|
| -
|
| - pthread_t m_WorkerThread;
|
| -
|
| -private:
|
| - CUnitQueue m_UnitQueue; // The received packet queue
|
| -
|
| - CRcvUList* m_pRcvUList; // List of UDT instances that will read packets from the queue
|
| - CHash* m_pHash; // Hash table for UDT socket looking up
|
| - CChannel* m_pChannel; // UDP channel for receving packets
|
| - CTimer* m_pTimer; // shared timer with the snd queue
|
| -
|
| - int m_iPayloadSize; // packet payload size
|
| -
|
| - volatile bool m_bClosing; // closing the workder
|
| - pthread_cond_t m_ExitCond;
|
| -
|
| -private:
|
| - int setListener(const CUDT* u);
|
| - void removeListener(const CUDT* u);
|
| -
|
| - void setNewEntry(CUDT* u);
|
| - bool ifNewEntry();
|
| - CUDT* getNewEntry();
|
| -
|
| - void storePkt(const int32_t& id, CPacket* pkt);
|
| -
|
| -private:
|
| - pthread_mutex_t m_LSLock;
|
| - volatile CUDT* m_pListener; // pointer to the (unique, if any) listening UDT entity
|
| - CRendezvousQueue* m_pRendezvousQueue; // The list of sockets in rendezvous mode
|
| -
|
| - std::vector<CUDT*> m_vNewEntry; // newly added entries, to be inserted
|
| - pthread_mutex_t m_IDLock;
|
| -
|
| - std::map<int32_t, std::queue<CPacket*> > m_mBuffer; // temporary buffer for rendezvous connection request
|
| - pthread_mutex_t m_PassLock;
|
| - pthread_cond_t m_PassCond;
|
| -
|
| -private:
|
| - CRcvQueue(const CRcvQueue&);
|
| - CRcvQueue& operator=(const CRcvQueue&);
|
| -};
|
| -
|
| -struct CMultiplexer
|
| -{
|
| - CSndQueue* m_pSndQueue; // The sending queue
|
| - CRcvQueue* m_pRcvQueue; // The receiving queue
|
| - CChannel* m_pChannel; // The UDP channel for sending and receiving
|
| - CTimer* m_pTimer; // The timer
|
| -
|
| - int m_iPort; // The UDP port number of this multiplexer
|
| - int m_iIPversion; // IP version
|
| - int m_iMSS; // Maximum Segment Size
|
| - int m_iRefCount; // number of UDT instances that are associated with this multiplexer
|
| - bool m_bReusable; // if this one can be shared with others
|
| -
|
| - int m_iID; // multiplexer ID
|
| -};
|
| -
|
| -#endif
|
|
|