eventmachine 1.0.7-java → 1.0.8-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +12 -0
- data/README.md +1 -1
- data/ext/binder.cpp +9 -9
- data/ext/binder.h +5 -5
- data/ext/cmain.cpp +68 -55
- data/ext/ed.cpp +106 -70
- data/ext/ed.h +19 -13
- data/ext/em.cpp +228 -194
- data/ext/em.h +33 -28
- data/ext/eventmachine.h +53 -52
- data/ext/extconf.rb +26 -3
- data/ext/fastfilereader/rubymain.cpp +1 -1
- data/ext/kb.cpp +1 -1
- data/ext/pipe.cpp +4 -2
- data/ext/project.h +6 -0
- data/ext/rubymain.cpp +218 -188
- data/ext/ssl.cpp +7 -7
- data/ext/ssl.h +1 -1
- data/lib/em/protocols/line_and_text.rb +1 -0
- data/lib/em/protocols/linetext2.rb +44 -38
- data/lib/em/protocols/smtpclient.rb +60 -31
- data/lib/em/version.rb +1 -1
- data/lib/eventmachine.rb +9 -1
- data/tests/test_ltp2.rb +20 -0
- data/tests/test_smtpclient.rb +20 -0
- metadata +4 -4
data/ext/ed.cpp
CHANGED
@@ -31,7 +31,7 @@ bool SetSocketNonblocking (SOCKET sd)
|
|
31
31
|
int val = fcntl (sd, F_GETFL, 0);
|
32
32
|
return (fcntl (sd, F_SETFL, val | O_NONBLOCK) != SOCKET_ERROR) ? true : false;
|
33
33
|
#endif
|
34
|
-
|
34
|
+
|
35
35
|
#ifdef OS_WIN32
|
36
36
|
#ifdef BUILD_FOR_RUBY
|
37
37
|
// 14Jun09 Ruby provides its own wrappers for ioctlsocket. On 1.8 this is a simple wrapper,
|
@@ -45,6 +45,22 @@ bool SetSocketNonblocking (SOCKET sd)
|
|
45
45
|
#endif
|
46
46
|
}
|
47
47
|
|
48
|
+
/************
|
49
|
+
SetFdCloexec
|
50
|
+
************/
|
51
|
+
|
52
|
+
bool SetFdCloexec (int fd)
|
53
|
+
{
|
54
|
+
#ifdef OS_UNIX
|
55
|
+
int flags = fcntl(fd, F_GETFD, 0);
|
56
|
+
assert (flags >= 0);
|
57
|
+
flags |= FD_CLOEXEC;
|
58
|
+
return (fcntl(fd, F_SETFD, FD_CLOEXEC) == 0) ? true : false;
|
59
|
+
#else
|
60
|
+
// TODO: Windows?
|
61
|
+
return true;
|
62
|
+
#endif
|
63
|
+
}
|
48
64
|
|
49
65
|
/****************************************
|
50
66
|
EventableDescriptor::EventableDescriptor
|
@@ -243,7 +259,7 @@ bool EventableDescriptor::IsCloseScheduled()
|
|
243
259
|
EventableDescriptor::StartProxy
|
244
260
|
*******************************/
|
245
261
|
|
246
|
-
void EventableDescriptor::StartProxy(const
|
262
|
+
void EventableDescriptor::StartProxy(const uintptr_t to, const unsigned long bufsize, const unsigned long length)
|
247
263
|
{
|
248
264
|
EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (to));
|
249
265
|
if (ed) {
|
@@ -289,13 +305,13 @@ void EventableDescriptor::SetProxiedFrom(EventableDescriptor *from, const unsign
|
|
289
305
|
EventableDescriptor::_GenericInboundDispatch
|
290
306
|
********************************************/
|
291
307
|
|
292
|
-
void EventableDescriptor::_GenericInboundDispatch(const char *buf,
|
308
|
+
void EventableDescriptor::_GenericInboundDispatch(const char *buf, unsigned long size)
|
293
309
|
{
|
294
310
|
assert(EventCallback);
|
295
311
|
|
296
312
|
if (ProxyTarget) {
|
297
313
|
if (BytesToProxy > 0) {
|
298
|
-
unsigned long proxied = min(BytesToProxy,
|
314
|
+
unsigned long proxied = min(BytesToProxy, size);
|
299
315
|
ProxyTarget->SendOutboundData(buf, proxied);
|
300
316
|
ProxiedBytes += (unsigned long) proxied;
|
301
317
|
BytesToProxy -= proxied;
|
@@ -308,7 +324,7 @@ void EventableDescriptor::_GenericInboundDispatch(const char *buf, int size)
|
|
308
324
|
}
|
309
325
|
} else {
|
310
326
|
ProxyTarget->SendOutboundData(buf, size);
|
311
|
-
ProxiedBytes +=
|
327
|
+
ProxiedBytes += size;
|
312
328
|
}
|
313
329
|
} else {
|
314
330
|
(*EventCallback)(GetBinding(), EM_CONNECTION_READ, buf, size);
|
@@ -450,8 +466,9 @@ void ConnectionDescriptor::_UpdateEvents(bool read, bool write)
|
|
450
466
|
#ifdef HAVE_KQUEUE
|
451
467
|
if (read && SelectForRead())
|
452
468
|
MyEventMachine->ArmKqueueReader (this);
|
453
|
-
|
454
|
-
|
469
|
+
bKqueueArmWrite = SelectForWrite();
|
470
|
+
if (write && bKqueueArmWrite)
|
471
|
+
MyEventMachine->Modify (this);
|
455
472
|
#endif
|
456
473
|
}
|
457
474
|
|
@@ -473,7 +490,7 @@ ConnectionDescriptor::SetAttached
|
|
473
490
|
|
474
491
|
void ConnectionDescriptor::SetAttached(bool state)
|
475
492
|
{
|
476
|
-
|
493
|
+
bAttached = state;
|
477
494
|
}
|
478
495
|
|
479
496
|
|
@@ -555,7 +572,7 @@ void ConnectionDescriptor::SetNotifyWritable(bool writable)
|
|
555
572
|
ConnectionDescriptor::SendOutboundData
|
556
573
|
**************************************/
|
557
574
|
|
558
|
-
int ConnectionDescriptor::SendOutboundData (const char *data,
|
575
|
+
int ConnectionDescriptor::SendOutboundData (const char *data, unsigned long length)
|
559
576
|
{
|
560
577
|
if (bWatchOnly)
|
561
578
|
throw std::runtime_error ("cannot send data on a 'watch only' connection");
|
@@ -566,7 +583,7 @@ int ConnectionDescriptor::SendOutboundData (const char *data, int length)
|
|
566
583
|
#ifdef WITH_SSL
|
567
584
|
if (SslBox) {
|
568
585
|
if (length > 0) {
|
569
|
-
|
586
|
+
unsigned long writed = 0;
|
570
587
|
char *p = (char*)data;
|
571
588
|
|
572
589
|
while (writed < length) {
|
@@ -600,7 +617,7 @@ int ConnectionDescriptor::SendOutboundData (const char *data, int length)
|
|
600
617
|
ConnectionDescriptor::_SendRawOutboundData
|
601
618
|
******************************************/
|
602
619
|
|
603
|
-
int ConnectionDescriptor::_SendRawOutboundData (const char *data,
|
620
|
+
int ConnectionDescriptor::_SendRawOutboundData (const char *data, unsigned long length)
|
604
621
|
{
|
605
622
|
/* This internal method is called to schedule bytes that
|
606
623
|
* will be sent out to the remote peer.
|
@@ -645,28 +662,28 @@ ConnectionDescriptor::SelectForRead
|
|
645
662
|
|
646
663
|
bool ConnectionDescriptor::SelectForRead()
|
647
664
|
{
|
648
|
-
|
649
|
-
|
650
|
-
|
651
|
-
|
652
|
-
|
653
|
-
|
654
|
-
|
655
|
-
|
656
|
-
|
657
|
-
|
658
|
-
|
659
|
-
|
660
|
-
|
661
|
-
|
662
|
-
|
663
|
-
|
664
|
-
|
665
|
-
|
666
|
-
|
667
|
-
|
668
|
-
|
669
|
-
|
665
|
+
/* A connection descriptor is always scheduled for read,
|
666
|
+
* UNLESS it's in a pending-connect state.
|
667
|
+
* On Linux, unlike Unix, a nonblocking socket on which
|
668
|
+
* connect has been called, does NOT necessarily select
|
669
|
+
* both readable and writable in case of error.
|
670
|
+
* The socket will select writable when the disposition
|
671
|
+
* of the connect is known. On the other hand, a socket
|
672
|
+
* which successfully connects and selects writable may
|
673
|
+
* indeed have some data available on it, so it will
|
674
|
+
* select readable in that case, violating expectations!
|
675
|
+
* So we will not poll for readability until the socket
|
676
|
+
* is known to be in a connected state.
|
677
|
+
*/
|
678
|
+
|
679
|
+
if (bPaused)
|
680
|
+
return false;
|
681
|
+
else if (bConnectPending)
|
682
|
+
return false;
|
683
|
+
else if (bWatchOnly)
|
684
|
+
return bNotifyReadable ? true : false;
|
685
|
+
else
|
686
|
+
return true;
|
670
687
|
}
|
671
688
|
|
672
689
|
|
@@ -676,20 +693,20 @@ ConnectionDescriptor::SelectForWrite
|
|
676
693
|
|
677
694
|
bool ConnectionDescriptor::SelectForWrite()
|
678
695
|
{
|
679
|
-
|
680
|
-
|
681
|
-
|
682
|
-
|
683
|
-
|
696
|
+
/* Cf the notes under SelectForRead.
|
697
|
+
* In a pending-connect state, we ALWAYS select for writable.
|
698
|
+
* In a normal state, we only select for writable when we
|
699
|
+
* have outgoing data to send.
|
700
|
+
*/
|
684
701
|
|
685
|
-
|
686
|
-
|
687
|
-
|
688
|
-
|
689
|
-
|
690
|
-
|
691
|
-
|
692
|
-
|
702
|
+
if (bPaused)
|
703
|
+
return false;
|
704
|
+
else if (bConnectPending)
|
705
|
+
return true;
|
706
|
+
else if (bWatchOnly)
|
707
|
+
return bNotifyWritable ? true : false;
|
708
|
+
else
|
709
|
+
return (GetOutboundDataSize() > 0);
|
693
710
|
}
|
694
711
|
|
695
712
|
/***************************
|
@@ -840,7 +857,7 @@ void ConnectionDescriptor::Read()
|
|
840
857
|
ConnectionDescriptor::_DispatchInboundData
|
841
858
|
******************************************/
|
842
859
|
|
843
|
-
void ConnectionDescriptor::_DispatchInboundData (const char *buffer,
|
860
|
+
void ConnectionDescriptor::_DispatchInboundData (const char *buffer, unsigned long size)
|
844
861
|
{
|
845
862
|
#ifdef WITH_SSL
|
846
863
|
if (SslBox) {
|
@@ -953,7 +970,7 @@ void ConnectionDescriptor::Write()
|
|
953
970
|
::Write to be called in a busy-loop.
|
954
971
|
*/
|
955
972
|
#ifdef HAVE_KQUEUE
|
956
|
-
if (MyEventMachine->
|
973
|
+
if (MyEventMachine->GetPoller() == Poller_Kqueue) {
|
957
974
|
if (OutboundDataSize == 0 && !bGotExtraKqueueEvent) {
|
958
975
|
bGotExtraKqueueEvent = true;
|
959
976
|
return;
|
@@ -1311,14 +1328,14 @@ void ConnectionDescriptor::Heartbeat()
|
|
1311
1328
|
UnbindReasonCode = ETIMEDOUT;
|
1312
1329
|
ScheduleClose (false);
|
1313
1330
|
//bCloseNow = true;
|
1314
|
-
|
1331
|
+
}
|
1315
1332
|
}
|
1316
1333
|
else {
|
1317
1334
|
if (InactivityTimeout && ((MyEventMachine->GetCurrentLoopTime() - LastActivity) >= InactivityTimeout)) {
|
1318
1335
|
UnbindReasonCode = ETIMEDOUT;
|
1319
1336
|
ScheduleClose (false);
|
1320
1337
|
//bCloseNow = true;
|
1321
|
-
|
1338
|
+
}
|
1322
1339
|
}
|
1323
1340
|
}
|
1324
1341
|
|
@@ -1366,8 +1383,8 @@ LoopbreakDescriptor::Write
|
|
1366
1383
|
|
1367
1384
|
void LoopbreakDescriptor::Write()
|
1368
1385
|
{
|
1369
|
-
|
1370
|
-
|
1386
|
+
// Why are we here?
|
1387
|
+
throw std::runtime_error ("bad code path in loopbreak");
|
1371
1388
|
}
|
1372
1389
|
|
1373
1390
|
/**************************************
|
@@ -1398,7 +1415,7 @@ AcceptorDescriptor::~AcceptorDescriptor()
|
|
1398
1415
|
STATIC: AcceptorDescriptor::StopAcceptor
|
1399
1416
|
****************************************/
|
1400
1417
|
|
1401
|
-
void AcceptorDescriptor::StopAcceptor (const
|
1418
|
+
void AcceptorDescriptor::StopAcceptor (const uintptr_t binding)
|
1402
1419
|
{
|
1403
1420
|
// TODO: This is something of a hack, or at least it's a static method of the wrong class.
|
1404
1421
|
AcceptorDescriptor *ad = dynamic_cast <AcceptorDescriptor*> (Bindable_t::GetObject (binding));
|
@@ -1434,7 +1451,16 @@ void AcceptorDescriptor::Read()
|
|
1434
1451
|
int accept_count = EventMachine_t::GetSimultaneousAcceptCount();
|
1435
1452
|
|
1436
1453
|
for (int i=0; i < accept_count; i++) {
|
1454
|
+
#if defined(HAVE_SOCK_CLOEXEC) && defined(HAVE_ACCEPT4)
|
1455
|
+
int sd = accept4 (GetSocket(), (struct sockaddr*)&pin, &addrlen, SOCK_CLOEXEC);
|
1456
|
+
if (sd == INVALID_SOCKET) {
|
1457
|
+
// We may be running in a kernel where
|
1458
|
+
// SOCK_CLOEXEC is not supported - fall back:
|
1459
|
+
sd = accept (GetSocket(), (struct sockaddr*)&pin, &addrlen);
|
1460
|
+
}
|
1461
|
+
#else
|
1437
1462
|
int sd = accept (GetSocket(), (struct sockaddr*)&pin, &addrlen);
|
1463
|
+
#endif
|
1438
1464
|
if (sd == INVALID_SOCKET) {
|
1439
1465
|
// This breaks the loop when we've accepted everything on the kernel queue,
|
1440
1466
|
// up to 10 new connections. But what if the *first* accept fails?
|
@@ -1443,10 +1469,10 @@ void AcceptorDescriptor::Read()
|
|
1443
1469
|
break;
|
1444
1470
|
}
|
1445
1471
|
|
1446
|
-
// Set the newly-accepted socket non-blocking.
|
1472
|
+
// Set the newly-accepted socket non-blocking and to close on exec.
|
1447
1473
|
// On Windows, this may fail because, weirdly, Windows inherits the non-blocking
|
1448
1474
|
// attribute that we applied to the acceptor socket into the accepted one.
|
1449
|
-
if (!SetSocketNonblocking (sd)) {
|
1475
|
+
if (!SetFdCloexec(sd) || !SetSocketNonblocking (sd)) {
|
1450
1476
|
//int val = fcntl (sd, F_GETFL, 0);
|
1451
1477
|
//if (fcntl (sd, F_SETFL, val | O_NONBLOCK) == -1) {
|
1452
1478
|
shutdown (sd, 1);
|
@@ -1454,7 +1480,6 @@ void AcceptorDescriptor::Read()
|
|
1454
1480
|
continue;
|
1455
1481
|
}
|
1456
1482
|
|
1457
|
-
|
1458
1483
|
// Disable slow-start (Nagle algorithm). Eventually make this configurable.
|
1459
1484
|
int one = 1;
|
1460
1485
|
setsockopt (sd, IPPROTO_TCP, TCP_NODELAY, (char*) &one, sizeof(one));
|
@@ -1468,14 +1493,18 @@ void AcceptorDescriptor::Read()
|
|
1468
1493
|
(*EventCallback) (GetBinding(), EM_CONNECTION_ACCEPTED, NULL, cd->GetBinding());
|
1469
1494
|
}
|
1470
1495
|
#ifdef HAVE_EPOLL
|
1471
|
-
cd->GetEpollEvent()->events =
|
1472
|
-
|
1496
|
+
cd->GetEpollEvent()->events = 0;
|
1497
|
+
if (cd->SelectForRead())
|
1498
|
+
cd->GetEpollEvent()->events |= EPOLLIN;
|
1499
|
+
if (cd->SelectForWrite())
|
1500
|
+
cd->GetEpollEvent()->events |= EPOLLOUT;
|
1473
1501
|
#endif
|
1474
1502
|
assert (MyEventMachine);
|
1475
1503
|
MyEventMachine->Add (cd);
|
1476
1504
|
#ifdef HAVE_KQUEUE
|
1477
|
-
|
1478
|
-
|
1505
|
+
bKqueueArmWrite = cd->SelectForWrite();
|
1506
|
+
if (bKqueueArmWrite)
|
1507
|
+
MyEventMachine->Modify (cd);
|
1479
1508
|
if (cd->SelectForRead())
|
1480
1509
|
MyEventMachine->ArmKqueueReader (cd);
|
1481
1510
|
#endif
|
@@ -1490,8 +1519,8 @@ AcceptorDescriptor::Write
|
|
1490
1519
|
|
1491
1520
|
void AcceptorDescriptor::Write()
|
1492
1521
|
{
|
1493
|
-
|
1494
|
-
|
1522
|
+
// Why are we here?
|
1523
|
+
throw std::runtime_error ("bad code path in acceptor");
|
1495
1524
|
}
|
1496
1525
|
|
1497
1526
|
|
@@ -1501,7 +1530,7 @@ AcceptorDescriptor::Heartbeat
|
|
1501
1530
|
|
1502
1531
|
void AcceptorDescriptor::Heartbeat()
|
1503
1532
|
{
|
1504
|
-
|
1533
|
+
// No-op
|
1505
1534
|
}
|
1506
1535
|
|
1507
1536
|
|
@@ -1710,13 +1739,16 @@ void DatagramDescriptor::Write()
|
|
1710
1739
|
}
|
1711
1740
|
|
1712
1741
|
#ifdef HAVE_EPOLL
|
1713
|
-
EpollEvent.events =
|
1742
|
+
EpollEvent.events = EPOLLIN;
|
1743
|
+
if (SelectForWrite())
|
1744
|
+
EpollEvent.events |= EPOLLOUT;
|
1714
1745
|
assert (MyEventMachine);
|
1715
1746
|
MyEventMachine->Modify (this);
|
1716
1747
|
#endif
|
1717
1748
|
#ifdef HAVE_KQUEUE
|
1718
|
-
|
1719
|
-
|
1749
|
+
bKqueueArmWrite = SelectForWrite();
|
1750
|
+
assert (MyEventMachine);
|
1751
|
+
MyEventMachine->Modify (this);
|
1720
1752
|
#endif
|
1721
1753
|
}
|
1722
1754
|
|
@@ -1742,7 +1774,7 @@ bool DatagramDescriptor::SelectForWrite()
|
|
1742
1774
|
DatagramDescriptor::SendOutboundData
|
1743
1775
|
************************************/
|
1744
1776
|
|
1745
|
-
int DatagramDescriptor::SendOutboundData (const char *data,
|
1777
|
+
int DatagramDescriptor::SendOutboundData (const char *data, unsigned long length)
|
1746
1778
|
{
|
1747
1779
|
// This is almost an exact clone of ConnectionDescriptor::_SendRawOutboundData.
|
1748
1780
|
// That means most of it could be factored to a common ancestor. Note that
|
@@ -1767,7 +1799,9 @@ int DatagramDescriptor::SendOutboundData (const char *data, int length)
|
|
1767
1799
|
MyEventMachine->Modify (this);
|
1768
1800
|
#endif
|
1769
1801
|
#ifdef HAVE_KQUEUE
|
1770
|
-
|
1802
|
+
bKqueueArmWrite = true;
|
1803
|
+
assert (MyEventMachine);
|
1804
|
+
MyEventMachine->Modify (this);
|
1771
1805
|
#endif
|
1772
1806
|
|
1773
1807
|
return length;
|
@@ -1778,7 +1812,7 @@ int DatagramDescriptor::SendOutboundData (const char *data, int length)
|
|
1778
1812
|
DatagramDescriptor::SendOutboundDatagram
|
1779
1813
|
****************************************/
|
1780
1814
|
|
1781
|
-
int DatagramDescriptor::SendOutboundDatagram (const char *data,
|
1815
|
+
int DatagramDescriptor::SendOutboundDatagram (const char *data, unsigned long length, const char *address, int port)
|
1782
1816
|
{
|
1783
1817
|
// This is an exact clone of ConnectionDescriptor::SendOutboundData.
|
1784
1818
|
// That means it needs to move to a common ancestor.
|
@@ -1825,7 +1859,9 @@ int DatagramDescriptor::SendOutboundDatagram (const char *data, int length, cons
|
|
1825
1859
|
MyEventMachine->Modify (this);
|
1826
1860
|
#endif
|
1827
1861
|
#ifdef HAVE_KQUEUE
|
1828
|
-
|
1862
|
+
bKqueueArmWrite = true;
|
1863
|
+
assert (MyEventMachine);
|
1864
|
+
MyEventMachine->Modify (this);
|
1829
1865
|
#endif
|
1830
1866
|
|
1831
1867
|
return length;
|
data/ext/ed.h
CHANGED
@@ -27,7 +27,7 @@ class SslBox_t; // forward reference
|
|
27
27
|
#endif
|
28
28
|
|
29
29
|
bool SetSocketNonblocking (SOCKET);
|
30
|
-
|
30
|
+
bool SetFdCloexec (int);
|
31
31
|
|
32
32
|
/*************************
|
33
33
|
class EventableDescriptor
|
@@ -85,11 +85,15 @@ class EventableDescriptor: public Bindable_t
|
|
85
85
|
struct epoll_event *GetEpollEvent() { return &EpollEvent; }
|
86
86
|
#endif
|
87
87
|
|
88
|
-
|
88
|
+
#ifdef HAVE_KQUEUE
|
89
|
+
bool GetKqueueArmWrite() { return bKqueueArmWrite; }
|
90
|
+
#endif
|
91
|
+
|
92
|
+
virtual void StartProxy(const uintptr_t, const unsigned long, const unsigned long);
|
89
93
|
virtual void StopProxy();
|
90
94
|
virtual unsigned long GetProxiedBytes(){ return ProxiedBytes; };
|
91
95
|
virtual void SetProxiedFrom(EventableDescriptor*, const unsigned long);
|
92
|
-
virtual int SendOutboundData(const char*,
|
96
|
+
virtual int SendOutboundData(const char*,unsigned long){ return -1; }
|
93
97
|
virtual bool IsPaused(){ return bPaused; }
|
94
98
|
virtual bool Pause(){ bPaused = true; return bPaused; }
|
95
99
|
virtual bool Resume(){ bPaused = false; return bPaused; }
|
@@ -109,7 +113,7 @@ class EventableDescriptor: public Bindable_t
|
|
109
113
|
bool bWatchOnly;
|
110
114
|
|
111
115
|
EMCallback EventCallback;
|
112
|
-
void _GenericInboundDispatch(const char
|
116
|
+
void _GenericInboundDispatch(const char *buffer, unsigned long size);
|
113
117
|
|
114
118
|
uint64_t CreatedAt;
|
115
119
|
bool bCallbackUnbind;
|
@@ -126,6 +130,10 @@ class EventableDescriptor: public Bindable_t
|
|
126
130
|
struct epoll_event EpollEvent;
|
127
131
|
#endif
|
128
132
|
|
133
|
+
#ifdef HAVE_KQUEUE
|
134
|
+
bool bKqueueArmWrite;
|
135
|
+
#endif
|
136
|
+
|
129
137
|
EventMachine_t *MyEventMachine;
|
130
138
|
uint64_t PendingConnectTimeout;
|
131
139
|
uint64_t InactivityTimeout;
|
@@ -165,7 +173,7 @@ class ConnectionDescriptor: public EventableDescriptor
|
|
165
173
|
ConnectionDescriptor (int, EventMachine_t*);
|
166
174
|
virtual ~ConnectionDescriptor();
|
167
175
|
|
168
|
-
int SendOutboundData (const char*,
|
176
|
+
int SendOutboundData (const char*, unsigned long);
|
169
177
|
|
170
178
|
void SetConnectPending (bool f);
|
171
179
|
virtual void ScheduleClose (bool after_writing);
|
@@ -252,9 +260,9 @@ class ConnectionDescriptor: public EventableDescriptor
|
|
252
260
|
void _UpdateEvents();
|
253
261
|
void _UpdateEvents(bool, bool);
|
254
262
|
void _WriteOutboundData();
|
255
|
-
void _DispatchInboundData (const char *buffer,
|
263
|
+
void _DispatchInboundData (const char *buffer, unsigned long size);
|
256
264
|
void _DispatchCiphertext();
|
257
|
-
int _SendRawOutboundData (const char
|
265
|
+
int _SendRawOutboundData (const char *buffer, unsigned long size);
|
258
266
|
void _CheckHandshakeStatus();
|
259
267
|
|
260
268
|
};
|
@@ -277,8 +285,8 @@ class DatagramDescriptor: public EventableDescriptor
|
|
277
285
|
virtual bool SelectForRead() {return true;}
|
278
286
|
virtual bool SelectForWrite();
|
279
287
|
|
280
|
-
int SendOutboundData (const char*,
|
281
|
-
int SendOutboundDatagram (const char*,
|
288
|
+
int SendOutboundData (const char*, unsigned long);
|
289
|
+
int SendOutboundDatagram (const char*, unsigned long, const char*, int);
|
282
290
|
|
283
291
|
// Do we have any data to write? This is used by ShouldDelete.
|
284
292
|
virtual int GetOutboundDataSize() {return OutboundDataSize;}
|
@@ -325,7 +333,7 @@ class AcceptorDescriptor: public EventableDescriptor
|
|
325
333
|
|
326
334
|
virtual bool GetSockname (struct sockaddr*, socklen_t*);
|
327
335
|
|
328
|
-
static void StopAcceptor (const
|
336
|
+
static void StopAcceptor (const uintptr_t binding);
|
329
337
|
};
|
330
338
|
|
331
339
|
/********************
|
@@ -346,7 +354,7 @@ class PipeDescriptor: public EventableDescriptor
|
|
346
354
|
virtual bool SelectForRead();
|
347
355
|
virtual bool SelectForWrite();
|
348
356
|
|
349
|
-
int SendOutboundData (const char*,
|
357
|
+
int SendOutboundData (const char*, unsigned long);
|
350
358
|
virtual int GetOutboundDataSize() {return OutboundDataSize;}
|
351
359
|
|
352
360
|
virtual bool GetSubprocessPid (pid_t*);
|
@@ -418,5 +426,3 @@ class InotifyDescriptor: public EventableDescriptor
|
|
418
426
|
};
|
419
427
|
|
420
428
|
#endif // __EventableDescriptor__H_
|
421
|
-
|
422
|
-
|