Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(444)

Side by Side Diff: net/third_party/udt/src/queue.h

Issue 6708091: Remove UDT. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 9 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/third_party/udt/src/packet.cpp ('k') | net/third_party/udt/src/queue.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 /*****************************************************************************
2 Copyright (c) 2001 - 2011, The Board of Trustees of the University of Illinois.
3 All rights reserved.
4
5 Redistribution and use in source and binary forms, with or without
6 modification, are permitted provided that the following conditions are
7 met:
8
9 * Redistributions of source code must retain the above
10 copyright notice, this list of conditions and the
11 following disclaimer.
12
13 * Redistributions in binary form must reproduce the
14 above copyright notice, this list of conditions
15 and the following disclaimer in the documentation
16 and/or other materials provided with the distribution.
17
18 * Neither the name of the University of Illinois
19 nor the names of its contributors may be used to
20 endorse or promote products derived from this
21 software without specific prior written permission.
22
23 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
24 IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
25 THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
26 PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
27 CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
28 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
29 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
30 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
31 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
32 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 *****************************************************************************/
35
36 /*****************************************************************************
37 written by
38 Yunhong Gu, last updated 01/12/2011
39 *****************************************************************************/
40
41
42 #ifndef __UDT_QUEUE_H__
43 #define __UDT_QUEUE_H__
44
45 #include "common.h"
46 #include "packet.h"
47 #include "channel.h"
48 #include <vector>
49 #include <map>
50 #include <queue>
51
52 class CUDT;
53
54 struct CUnit
55 {
56 CPacket m_Packet; // packet
57 int m_iFlag; // 0: free, 1: occupied, 2: msg read but not fre ed (out-of-order), 3: msg dropped
58 };
59
60 class CUnitQueue
61 {
62 friend class CRcvQueue;
63 friend class CRcvBuffer;
64
65 public:
66 CUnitQueue();
67 ~CUnitQueue();
68
69 public:
70
71 // Functionality:
72 // Initialize the unit queue.
73 // Parameters:
74 // 1) [in] size: queue size
75 // 2) [in] mss: maximum segament size
76 // 3) [in] version: IP version
77 // Returned value:
78 // 0: success, -1: failure.
79
80 int init(const int& size, const int& mss, const int& version);
81
82 // Functionality:
83 // Increase (double) the unit queue size.
84 // Parameters:
85 // None.
86 // Returned value:
87 // 0: success, -1: failure.
88
89 int increase();
90
91 // Functionality:
92 // Decrease (halve) the unit queue size.
93 // Parameters:
94 // None.
95 // Returned value:
96 // 0: success, -1: failure.
97
98 int shrink();
99
100 // Functionality:
101 // find an available unit for incoming packet.
102 // Parameters:
103 // None.
104 // Returned value:
105 // Pointer to the available unit, NULL if not found.
106
107 CUnit* getNextAvailUnit();
108
109 private:
110 struct CQEntry
111 {
112 CUnit* m_pUnit; // unit queue
113 char* m_pBuffer; // data buffer
114 int m_iSize; // size of each queue
115
116 CQEntry* m_pNext;
117 }
118 *m_pQEntry, // pointer to the first unit queue
119 *m_pCurrQueue, // pointer to the current available queue
120 *m_pLastQueue; // pointer to the last unit queue
121
122 CUnit* m_pAvailUnit; // recent available unit
123
124 int m_iSize; // total size of the unit queue, in number of pa ckets
125 int m_iCount; // total number of valid packets in the queue
126
127 int m_iMSS; // unit buffer size
128 int m_iIPversion; // IP version
129
130 private:
131 CUnitQueue(const CUnitQueue&);
132 CUnitQueue& operator=(const CUnitQueue&);
133 };
134
135 struct CSNode
136 {
137 CUDT* m_pUDT; // Pointer to the instance of CUDT socket
138 uint64_t m_llTimeStamp; // Time Stamp
139
140 int m_iHeapLoc; // location on the heap, -1 means not on the hea p
141 };
142
143 class CSndUList
144 {
145 friend class CSndQueue;
146
147 public:
148 CSndUList();
149 ~CSndUList();
150
151 public:
152
153 // Functionality:
154 // Insert a new UDT instance into the list.
155 // Parameters:
156 // 1) [in] ts: time stamp: next processing time
157 // 2) [in] u: pointer to the UDT instance
158 // Returned value:
159 // None.
160
161 void insert(const int64_t& ts, const CUDT* u);
162
163 // Functionality:
164 // Update the timestamp of the UDT instance on the list.
165 // Parameters:
166 // 1) [in] u: pointer to the UDT instance
167 // 2) [in] resechedule: if the timestampe shoudl be rescheduled
168 // Returned value:
169 // None.
170
171 void update(const CUDT* u, const bool& reschedule = true);
172
173 // Functionality:
174 // Retrieve the next packet and peer address from the first entry, and reschedule it in the queue.
175 // Parameters:
176 // 0) [out] addr: destination address of the next packet
177 // 1) [out] pkt: the next packet to be sent
178 // Returned value:
179 // 1 if successfully retrieved, -1 if no packet found.
180
181 int pop(sockaddr*& addr, CPacket& pkt);
182
183 // Functionality:
184 // Remove UDT instance from the list.
185 // Parameters:
186 // 1) [in] u: pointer to the UDT instance
187 // Returned value:
188 // None.
189
190 void remove(const CUDT* u);
191
192 // Functionality:
193 // Retrieve the next scheduled processing time.
194 // Parameters:
195 // None.
196 // Returned value:
197 // Scheduled processing time of the first UDT socket in the list.
198
199 uint64_t getNextProcTime();
200
201 private:
202 void insert_(const int64_t& ts, const CUDT* u);
203 void remove_(const CUDT* u);
204
205 private:
206 CSNode** m_pHeap; // The heap array
207 int m_iArrayLength; // physical length of the array
208 int m_iLastEntry; // position of last entry on the heap ar ray
209
210 pthread_mutex_t m_ListLock;
211
212 pthread_mutex_t* m_pWindowLock;
213 pthread_cond_t* m_pWindowCond;
214
215 CTimer* m_pTimer;
216
217 private:
218 CSndUList(const CSndUList&);
219 CSndUList& operator=(const CSndUList&);
220 };
221
222 struct CRNode
223 {
224 CUDT* m_pUDT; // Pointer to the instance of CUDT socket
225 uint64_t m_llTimeStamp; // Time Stamp
226
227 CRNode* m_pPrev; // previous link
228 CRNode* m_pNext; // next link
229
230 bool m_bOnList; // if the node is already on the list
231 };
232
233 class CRcvUList
234 {
235 public:
236 CRcvUList();
237 ~CRcvUList();
238
239 public:
240
241 // Functionality:
242 // Insert a new UDT instance to the list.
243 // Parameters:
244 // 1) [in] u: pointer to the UDT instance
245 // Returned value:
246 // None.
247
248 void insert(const CUDT* u);
249
250 // Functionality:
251 // Remove the UDT instance from the list.
252 // Parameters:
253 // 1) [in] u: pointer to the UDT instance
254 // Returned value:
255 // None.
256
257 void remove(const CUDT* u);
258
259 // Functionality:
260 // Move the UDT instance to the end of the list, if it already exists; otherwise, do nothing.
261 // Parameters:
262 // 1) [in] u: pointer to the UDT instance
263 // Returned value:
264 // None.
265
266 void update(const CUDT* u);
267
268 public:
269 CRNode* m_pUList; // the head node
270
271 private:
272 CRNode* m_pLast; // the last node
273
274 private:
275 CRcvUList(const CRcvUList&);
276 CRcvUList& operator=(const CRcvUList&);
277 };
278
279 class CHash
280 {
281 public:
282 CHash();
283 ~CHash();
284
285 public:
286
287 // Functionality:
288 // Initialize the hash table.
289 // Parameters:
290 // 1) [in] size: hash table size
291 // Returned value:
292 // None.
293
294 void init(const int& size);
295
296 // Functionality:
297 // Look for a UDT instance from the hash table.
298 // Parameters:
299 // 1) [in] id: socket ID
300 // Returned value:
301 // Pointer to a UDT instance, or NULL if not found.
302
303 CUDT* lookup(const int32_t& id);
304
305 // Functionality:
306 // Insert an entry to the hash table.
307 // Parameters:
308 // 1) [in] id: socket ID
309 // 2) [in] u: pointer to the UDT instance
310 // Returned value:
311 // None.
312
313 void insert(const int32_t& id, const CUDT* u);
314
315 // Functionality:
316 // Remove an entry from the hash table.
317 // Parameters:
318 // 1) [in] id: socket ID
319 // Returned value:
320 // None.
321
322 void remove(const int32_t& id);
323
324 private:
325 struct CBucket
326 {
327 int32_t m_iID; // Socket ID
328 CUDT* m_pUDT; // Socket instance
329
330 CBucket* m_pNext; // next bucket
331 } **m_pBucket; // list of buckets (the hash table)
332
333 int m_iHashSize; // size of hash table
334
335 private:
336 CHash(const CHash&);
337 CHash& operator=(const CHash&);
338 };
339
340 class CRendezvousQueue
341 {
342 public:
343 CRendezvousQueue();
344 ~CRendezvousQueue();
345
346 public:
347 void insert(const UDTSOCKET& id, const int& ipv, const sockaddr* addr);
348 void remove(const UDTSOCKET& id);
349 bool retrieve(const sockaddr* addr, UDTSOCKET& id);
350
351 private:
352 struct CRL
353 {
354 UDTSOCKET m_iID;
355 int m_iIPversion;
356 sockaddr* m_pPeerAddr;
357 };
358 std::vector<CRL> m_vRendezvousID; // The sockets currently in rendezv ous mode
359
360 pthread_mutex_t m_RIDVectorLock;
361 };
362
363 class CSndQueue
364 {
365 friend class CUDT;
366 friend class CUDTUnited;
367
368 public:
369 CSndQueue();
370 ~CSndQueue();
371
372 public:
373
374 // Functionality:
375 // Initialize the sending queue.
376 // Parameters:
377 // 1) [in] c: UDP channel to be associated to the queue
378 // 2) [in] t: Timer
379 // Returned value:
380 // None.
381
382 void init(const CChannel* c, const CTimer* t);
383
384 // Functionality:
385 // Send out a packet to a given address.
386 // Parameters:
387 // 1) [in] addr: destination address
388 // 2) [in] packet: packet to be sent out
389 // Returned value:
390 // Size of data sent out.
391
392 int sendto(const sockaddr* addr, CPacket& packet);
393
394 private:
395 #ifndef WIN32
396 static void* worker(void* param);
397 #else
398 static DWORD WINAPI worker(LPVOID param);
399 #endif
400
401 pthread_t m_WorkerThread;
402
403 private:
404 CSndUList* m_pSndUList; // List of UDT instances for data sendin g
405 CChannel* m_pChannel; // The UDP channel for data sending
406 CTimer* m_pTimer; // Timing facility
407
408 pthread_mutex_t m_WindowLock;
409 pthread_cond_t m_WindowCond;
410
411 volatile bool m_bClosing; // closing the worker
412 pthread_cond_t m_ExitCond;
413
414 private:
415 CSndQueue(const CSndQueue&);
416 CSndQueue& operator=(const CSndQueue&);
417 };
418
419 class CRcvQueue
420 {
421 friend class CUDT;
422 friend class CUDTUnited;
423
424 public:
425 CRcvQueue();
426 ~CRcvQueue();
427
428 public:
429
430 // Functionality:
431 // Initialize the receiving queue.
432 // Parameters:
433 // 1) [in] size: queue size
434 // 2) [in] mss: maximum packet size
435 // 3) [in] version: IP version
436 // 4) [in] hsize: hash table size
437 // 5) [in] c: UDP channel to be associated to the queue
438 // 6) [in] t: timer
439 // Returned value:
440 // None.
441
442 void init(const int& size, const int& payload, const int& version, const int& hsize, const CChannel* c, const CTimer* t);
443
444 // Functionality:
445 // Read a packet for a specific UDT socket id.
446 // Parameters:
447 // 1) [in] id: Socket ID
448 // 2) [out] packet: received packet
449 // Returned value:
450 // Data size of the packet
451
452 int recvfrom(const int32_t& id, CPacket& packet);
453
454 private:
455 #ifndef WIN32
456 static void* worker(void* param);
457 #else
458 static DWORD WINAPI worker(LPVOID param);
459 #endif
460
461 pthread_t m_WorkerThread;
462
463 private:
464 CUnitQueue m_UnitQueue; // The received packet queue
465
466 CRcvUList* m_pRcvUList; // List of UDT instances that will read packets from the queue
467 CHash* m_pHash; // Hash table for UDT socket looking up
468 CChannel* m_pChannel; // UDP channel for receving packets
469 CTimer* m_pTimer; // shared timer with the snd queue
470
471 int m_iPayloadSize; // packet payload size
472
473 volatile bool m_bClosing; // closing the workder
474 pthread_cond_t m_ExitCond;
475
476 private:
477 int setListener(const CUDT* u);
478 void removeListener(const CUDT* u);
479
480 void setNewEntry(CUDT* u);
481 bool ifNewEntry();
482 CUDT* getNewEntry();
483
484 void storePkt(const int32_t& id, CPacket* pkt);
485
486 private:
487 pthread_mutex_t m_LSLock;
488 volatile CUDT* m_pListener; // pointer to the (uniqu e, if any) listening UDT entity
489 CRendezvousQueue* m_pRendezvousQueue; // The list of sockets i n rendezvous mode
490
491 std::vector<CUDT*> m_vNewEntry; // newly added entries, to be inserted
492 pthread_mutex_t m_IDLock;
493
494 std::map<int32_t, std::queue<CPacket*> > m_mBuffer; // temporary buffer for rendezvous connection request
495 pthread_mutex_t m_PassLock;
496 pthread_cond_t m_PassCond;
497
498 private:
499 CRcvQueue(const CRcvQueue&);
500 CRcvQueue& operator=(const CRcvQueue&);
501 };
502
503 struct CMultiplexer
504 {
505 CSndQueue* m_pSndQueue; // The sending queue
506 CRcvQueue* m_pRcvQueue; // The receiving queue
507 CChannel* m_pChannel; // The UDP channel for sending and receiving
508 CTimer* m_pTimer; // The timer
509
510 int m_iPort; // The UDP port number of this multiplexer
511 int m_iIPversion; // IP version
512 int m_iMSS; // Maximum Segment Size
513 int m_iRefCount; // number of UDT instances that are associated w ith this multiplexer
514 bool m_bReusable; // if this one can be shared with others
515
516 int m_iID; // multiplexer ID
517 };
518
519 #endif
OLDNEW
« no previous file with comments | « net/third_party/udt/src/packet.cpp ('k') | net/third_party/udt/src/queue.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698