sonixlabs-eventmachine-java 1.0.0.rc.7-java → 1.0.3.1-java
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -12
- data/.travis.yml +12 -0
- data/CHANGELOG.md +33 -0
- data/Gemfile +0 -1
- data/README.md +2 -2
- data/README_JP.md +10 -2
- data/eventmachine.gemspec +10 -7
- data/ext/binder.cpp +1 -1
- data/ext/cmain.cpp +11 -0
- data/ext/ed.cpp +22 -7
- data/ext/ed.h +5 -5
- data/ext/em.cpp +64 -66
- data/ext/em.h +10 -5
- data/ext/eventmachine.h +1 -0
- data/ext/extconf.rb +4 -3
- data/ext/fastfilereader/extconf.rb +1 -1
- data/ext/rubymain.cpp +22 -1
- data/ext/ssl.cpp +1 -1
- data/java/.classpath +1 -3
- data/java/.gitignore +1 -0
- data/java/src/com/rubyeventmachine/DatagramPacket.java +13 -0
- data/java/src/com/rubyeventmachine/EmReactor.java +502 -561
- data/java/src/com/rubyeventmachine/EventCallback.java +7 -0
- data/java/src/com/rubyeventmachine/EventCode.java +26 -0
- data/java/src/com/rubyeventmachine/EventableChannel.java +102 -42
- data/java/src/com/rubyeventmachine/EventableDatagramChannel.java +146 -161
- data/java/src/com/rubyeventmachine/EventableSocketChannel.java +371 -334
- data/java/src/com/rubyeventmachine/SslBox.java +310 -0
- data/lib/em/iterator.rb +5 -44
- data/lib/em/processes.rb +1 -1
- data/lib/em/protocols/httpclient.rb +2 -2
- data/lib/em/protocols/line_protocol.rb +2 -2
- data/lib/em/protocols/smtpclient.rb +1 -1
- data/lib/em/protocols/smtpserver.rb +10 -7
- data/lib/em/protocols/stomp.rb +5 -2
- data/lib/em/protocols.rb +1 -0
- data/lib/em/version.rb +1 -1
- data/lib/eventmachine.rb +35 -14
- data/lib/jeventmachine.rb +65 -18
- data/rakelib/package.rake +15 -18
- data/tests/server.crt +36 -0
- data/tests/server.key +51 -0
- data/tests/test_attach.rb +24 -0
- data/tests/test_connection_count.rb +21 -1
- data/tests/test_epoll.rb +15 -0
- data/tests/test_httpclient2.rb +5 -0
- data/tests/test_idle_connection.rb +6 -4
- data/tests/test_iterator.rb +97 -0
- data/tests/test_line_protocol.rb +33 -0
- data/tests/test_pause.rb +24 -0
- data/tests/test_set_sock_opt.rb +1 -1
- data/tests/test_ssl_echo_data.rb +60 -0
- data/tests/test_ssl_methods.rb +15 -7
- data/tests/test_ssl_verify.rb +4 -4
- data/tests/test_stomp.rb +37 -0
- data/tests/test_system.rb +42 -0
- metadata +45 -42
- data/lib/rubyeventmachine.jar +0 -0
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
NDA4OGUxMjA1NzA3ZDdmMTJlODQ2MjcyY2VkM2ViMWIxMDA3M2NhOQ==
|
3
|
+
metadata.gz: 196a510820266752167782d31cc8f8b3d3ed7097
|
4
|
+
data.tar.gz: 8a7360f9dcdbf351eeecae1a386371f1de50a879
|
7
5
|
SHA512:
|
8
|
-
metadata.gz:
|
9
|
-
|
10
|
-
NTk1ZGE0ZjhiNDk0MzMwODI1NWQzMjhkNjEzNGY1YWEyYjg5YTMxMjY5N2E1
|
11
|
-
YjQ4Njg1ZDVlZGRmMzBkMjYzNzI5NzcwYjk2OWU5YzkzMzljYzA=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
MWM1NDY3MzY3ZDA5MWVmMjk1ZWJhZmEwY2Q4OTIxMTEzZjY0YWNjYTM4ZWI4
|
14
|
-
ZTI0ODBlYmEzMjI4YWQwZWQ3ZTVjMzBjMWRlOTY0YWExYTlhYTkzN2U2MWQ0
|
15
|
-
M2IxMWQ1YTc2MTk0YjI4NjU0YmFkNjM3NzU0MTIwMjQ0OWMwYjE=
|
6
|
+
metadata.gz: b04803ccb631b97c9f12818d0b9529f0c79a7b0596e7c0f18a9c72e99f12c4e1683e7528b47c531d0b3d510ebf1d9f64338db99b94c8f88b4de44f5255872f44
|
7
|
+
data.tar.gz: 500b5af57cd9247c169938acef5e9c72babda5d60a6c99aadcacd06d1045146f40867846940a93d22cb1c3e7902f5073bc9d71a7b56d07fddca86aa0c3332bd0
|
data/.travis.yml
ADDED
data/CHANGELOG.md
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
# Changelog
|
2
|
+
|
3
|
+
## 1.0.4
|
4
|
+
* calling pause from receive_data takes effect immediately [#464]
|
5
|
+
* reactor_running? returns false after fork [#455]
|
6
|
+
* fix infinite loop on double close [edc4d0e6, #441, #445]
|
7
|
+
* fix compilation issue on llvm [#433]
|
8
|
+
* fix socket error codes on win32 [ff811a81]
|
9
|
+
* fix EM.stop latency when timers exist [8b613d05, #426]
|
10
|
+
* fix infinite loop when system time changes [1427a2c80, #428]
|
11
|
+
* fix crash when callin attach/detach in the same tick [#427]
|
12
|
+
* fix compilation issue on solaris [#416]
|
13
|
+
|
14
|
+
## 1.0.3 (March 8, 2013)
|
15
|
+
* EM.system was broken in 1.0.2 release [#413]
|
16
|
+
|
17
|
+
## 1.0.2 (March 8, 2013)
|
18
|
+
* binary win32 gems now include fastfilereader shim [#222]
|
19
|
+
* fix long-standing connection timeout issues [27fdd5b, igrigorik/em-http-request#222]
|
20
|
+
* http and line protocol cleanups [#193, #151]
|
21
|
+
* reactor return value cleanup [#225]
|
22
|
+
* fix double require from gemspec [#284]
|
23
|
+
* fix smtp server reset behavior [#351]
|
24
|
+
* fix EM.system argument handling [#322]
|
25
|
+
* ruby 1.9 compat in smtp server and stomp protocols [#349, #315]
|
26
|
+
* fix pause from post_init [#380]
|
27
|
+
|
28
|
+
## 1.0.1 (February 27, 2013)
|
29
|
+
* use rb_wait_for_single_fd() on ruby 2.0 to fix rb_thread_select() deprecation [#363]
|
30
|
+
* fix epoll/kqueue mode in ruby 2.0 by removing calls to rb_enable_interrupt() [#248, #389]
|
31
|
+
* fix memory leak when verifying ssl cerificates [#403]
|
32
|
+
* fix initial connection delay [#393, #374]
|
33
|
+
* fix build on windows [#371]
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# About EventMachine
|
1
|
+
# About EventMachine [](https://codeclimate.com/github/eventmachine/eventmachine)
|
2
2
|
|
3
3
|
|
4
4
|
## What is EventMachine ##
|
@@ -75,7 +75,7 @@ Here's a fully-functional echo server written with EventMachine:
|
|
75
75
|
|
76
76
|
def unbind
|
77
77
|
puts "-- someone disconnected from the echo server!"
|
78
|
-
|
78
|
+
end
|
79
79
|
end
|
80
80
|
|
81
81
|
# Note that this will block current thread.
|
data/README_JP.md
CHANGED
@@ -8,7 +8,15 @@ JRuby実装のビルドとインストール
|
|
8
8
|
$ jgem build eventmachine.gemspec
|
9
9
|
|
10
10
|
// jruby用のgemを作成
|
11
|
-
$ jruby
|
11
|
+
$ jruby rake java gem
|
12
12
|
|
13
13
|
// インストール
|
14
|
-
$ jgem install
|
14
|
+
$ jgem install sonixlabs-eventmachine-java-1.0.x-java
|
15
|
+
|
16
|
+
// rubygemsにpush
|
17
|
+
$ gem push sonixlabs-eventmachine-java-1.0.x-java
|
18
|
+
|
19
|
+
|
20
|
+
# fork
|
21
|
+
|
22
|
+
* jruby_tls: https://github.com/asynchrony/eventmachine/tree/jruby_tls
|
data/eventmachine.gemspec
CHANGED
@@ -1,22 +1,25 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
|
2
|
+
$:.unshift File.expand_path("../lib", __FILE__)
|
3
|
+
require "em/version"
|
4
|
+
|
3
5
|
|
4
6
|
Gem::Specification.new do |s|
|
5
7
|
s.name = 'sonixlabs-eventmachine-java'
|
6
8
|
s.version = EventMachine::VERSION
|
7
|
-
s.homepage = '
|
9
|
+
s.homepage = 'http://rubyeventmachine.com'
|
8
10
|
s.rubyforge_project = 'eventmachine'
|
9
11
|
s.platform = 'java' # jruby only
|
12
|
+
s.licenses = ["Ruby", "GPL"]
|
10
13
|
|
11
|
-
s.authors = ["
|
12
|
-
s.email = ["
|
14
|
+
s.authors = ["Francis Cianfrocca", "Aman Gupta"]
|
15
|
+
s.email = ["garbagecat10@gmail.com", "aman@tmm1.net"]
|
13
16
|
|
14
17
|
s.files = `git ls-files`.split("\n")
|
15
18
|
s.extensions = ["ext/extconf.rb", "ext/fastfilereader/extconf.rb"]
|
16
19
|
|
17
|
-
s.add_development_dependency 'rake-compiler', '~> 0.8.
|
18
|
-
s.add_development_dependency 'yard', ">= 0.
|
19
|
-
s.add_development_dependency 'bluecloth'
|
20
|
+
s.add_development_dependency 'rake-compiler', '~> 0.8.3'
|
21
|
+
s.add_development_dependency 'yard', ">= 0.8.5.2"
|
22
|
+
s.add_development_dependency 'bluecloth' unless RUBY_PLATFORM =~ /java/
|
20
23
|
|
21
24
|
s.summary = 'Ruby/EventMachine library'
|
22
25
|
s.description = "EventMachine implements a fast, single-threaded engine for arbitrary network
|
data/ext/binder.cpp
CHANGED
data/ext/cmain.cpp
CHANGED
@@ -259,6 +259,7 @@ evma_num_close_scheduled
|
|
259
259
|
|
260
260
|
extern "C" int evma_num_close_scheduled ()
|
261
261
|
{
|
262
|
+
ensure_eventmachine("evma_num_close_scheduled");
|
262
263
|
return EventMachine->NumCloseScheduled;
|
263
264
|
}
|
264
265
|
|
@@ -282,6 +283,16 @@ extern "C" const unsigned long evma_create_unix_domain_server (const char *filen
|
|
282
283
|
return EventMachine->CreateUnixDomainServer (filename);
|
283
284
|
}
|
284
285
|
|
286
|
+
/***********************
|
287
|
+
evma_attach_sd
|
288
|
+
************************/
|
289
|
+
|
290
|
+
extern "C" const unsigned long evma_attach_sd (int sd)
|
291
|
+
{
|
292
|
+
ensure_eventmachine("evma_attach_sd");
|
293
|
+
return EventMachine->AttachSD (sd);
|
294
|
+
}
|
295
|
+
|
285
296
|
/*************************
|
286
297
|
evma_open_datagram_socket
|
287
298
|
*************************/
|
data/ext/ed.cpp
CHANGED
@@ -217,6 +217,8 @@ EventableDescriptor::ScheduleClose
|
|
217
217
|
|
218
218
|
void EventableDescriptor::ScheduleClose (bool after_writing)
|
219
219
|
{
|
220
|
+
if (IsCloseScheduled())
|
221
|
+
return;
|
220
222
|
MyEventMachine->NumCloseScheduled++;
|
221
223
|
// KEEP THIS SYNCHRONIZED WITH ::IsCloseScheduled.
|
222
224
|
if (after_writing)
|
@@ -460,6 +462,7 @@ ConnectionDescriptor::SetConnectPending
|
|
460
462
|
void ConnectionDescriptor::SetConnectPending(bool f)
|
461
463
|
{
|
462
464
|
bConnectPending = f;
|
465
|
+
MyEventMachine->QueueHeartbeat(this);
|
463
466
|
_UpdateEvents();
|
464
467
|
}
|
465
468
|
|
@@ -764,7 +767,11 @@ void ConnectionDescriptor::Read()
|
|
764
767
|
|
765
768
|
|
766
769
|
int r = read (sd, readbuffer, sizeof(readbuffer) - 1);
|
770
|
+
#ifdef OS_WIN32
|
771
|
+
int e = WSAGetLastError();
|
772
|
+
#else
|
767
773
|
int e = errno;
|
774
|
+
#endif
|
768
775
|
//cerr << "<R:" << r << ">";
|
769
776
|
|
770
777
|
if (r > 0) {
|
@@ -778,6 +785,8 @@ void ConnectionDescriptor::Read()
|
|
778
785
|
// a security guard against buffer overflows.
|
779
786
|
readbuffer [r] = 0;
|
780
787
|
_DispatchInboundData (readbuffer, r);
|
788
|
+
if (bPaused)
|
789
|
+
break;
|
781
790
|
}
|
782
791
|
else if (r == 0) {
|
783
792
|
break;
|
@@ -980,11 +989,7 @@ void ConnectionDescriptor::_WriteOutboundData()
|
|
980
989
|
// Max of 16 outbound pages at a time
|
981
990
|
if (iovcnt > 16) iovcnt = 16;
|
982
991
|
|
983
|
-
|
984
|
-
struct iovec iov[16];
|
985
|
-
#else
|
986
|
-
struct iovec iov[ iovcnt ];
|
987
|
-
#endif
|
992
|
+
iovec iov[16];
|
988
993
|
|
989
994
|
for(int i = 0; i < iovcnt; i++){
|
990
995
|
OutboundPage *op = &(OutboundPages[i]);
|
@@ -1031,7 +1036,11 @@ void ConnectionDescriptor::_WriteOutboundData()
|
|
1031
1036
|
#endif
|
1032
1037
|
|
1033
1038
|
bool err = false;
|
1039
|
+
#ifdef OS_WIN32
|
1040
|
+
int e = WSAGetLastError();
|
1041
|
+
#else
|
1034
1042
|
int e = errno;
|
1043
|
+
#endif
|
1035
1044
|
if (bytes_written < 0) {
|
1036
1045
|
err = true;
|
1037
1046
|
bytes_written = 0;
|
@@ -1445,14 +1454,16 @@ void AcceptorDescriptor::Read()
|
|
1445
1454
|
(*EventCallback) (GetBinding(), EM_CONNECTION_ACCEPTED, NULL, cd->GetBinding());
|
1446
1455
|
}
|
1447
1456
|
#ifdef HAVE_EPOLL
|
1448
|
-
cd->GetEpollEvent()->events =
|
1457
|
+
cd->GetEpollEvent()->events =
|
1458
|
+
(cd->SelectForRead() ? EPOLLIN : 0) | (cd->SelectForWrite() ? EPOLLOUT : 0);
|
1449
1459
|
#endif
|
1450
1460
|
assert (MyEventMachine);
|
1451
1461
|
MyEventMachine->Add (cd);
|
1452
1462
|
#ifdef HAVE_KQUEUE
|
1453
1463
|
if (cd->SelectForWrite())
|
1454
1464
|
MyEventMachine->ArmKqueueWriter (cd);
|
1455
|
-
|
1465
|
+
if (cd->SelectForRead())
|
1466
|
+
MyEventMachine->ArmKqueueReader (cd);
|
1456
1467
|
#endif
|
1457
1468
|
}
|
1458
1469
|
|
@@ -1660,7 +1671,11 @@ void DatagramDescriptor::Write()
|
|
1660
1671
|
|
1661
1672
|
// The nasty cast to (char*) is needed because Windows is brain-dead.
|
1662
1673
|
int s = sendto (sd, (char*)op->Buffer, op->Length, 0, (struct sockaddr*)&(op->From), sizeof(op->From));
|
1674
|
+
#ifdef OS_WIN32
|
1675
|
+
int e = WSAGetLastError();
|
1676
|
+
#else
|
1663
1677
|
int e = errno;
|
1678
|
+
#endif
|
1664
1679
|
|
1665
1680
|
OutboundDataSize -= op->Length;
|
1666
1681
|
op->Free();
|
data/ext/ed.h
CHANGED
@@ -69,14 +69,14 @@ class EventableDescriptor: public Bindable_t
|
|
69
69
|
virtual bool GetSubprocessPid (pid_t*) {return false;}
|
70
70
|
|
71
71
|
virtual void StartTls() {}
|
72
|
-
virtual void SetTlsParms (const char
|
72
|
+
virtual void SetTlsParms (const char *, const char *, bool) {}
|
73
73
|
|
74
74
|
#ifdef WITH_SSL
|
75
75
|
virtual X509 *GetPeerCert() {return NULL;}
|
76
76
|
#endif
|
77
77
|
|
78
78
|
virtual uint64_t GetCommInactivityTimeout() {return 0;}
|
79
|
-
virtual int SetCommInactivityTimeout (uint64_t
|
79
|
+
virtual int SetCommInactivityTimeout (uint64_t) {return 0;}
|
80
80
|
uint64_t GetPendingConnectTimeout();
|
81
81
|
int SetPendingConnectTimeout (uint64_t value);
|
82
82
|
uint64_t GetLastActivity() { return LastActivity; }
|
@@ -215,7 +215,7 @@ class ConnectionDescriptor: public EventableDescriptor
|
|
215
215
|
protected:
|
216
216
|
struct OutboundPage {
|
217
217
|
OutboundPage (const char *b, int l, int o=0): Buffer(b), Length(l), Offset(o) {}
|
218
|
-
void Free() {if (Buffer) free ((
|
218
|
+
void Free() {if (Buffer) free (const_cast<char*>(Buffer)); }
|
219
219
|
const char *Buffer;
|
220
220
|
int Length;
|
221
221
|
int Offset;
|
@@ -292,7 +292,7 @@ class DatagramDescriptor: public EventableDescriptor
|
|
292
292
|
protected:
|
293
293
|
struct OutboundPage {
|
294
294
|
OutboundPage (const char *b, int l, struct sockaddr_in f, int o=0): Buffer(b), Length(l), Offset(o), From(f) {}
|
295
|
-
void Free() {if (Buffer) free ((
|
295
|
+
void Free() {if (Buffer) free (const_cast<char*>(Buffer)); }
|
296
296
|
const char *Buffer;
|
297
297
|
int Length;
|
298
298
|
int Offset;
|
@@ -354,7 +354,7 @@ class PipeDescriptor: public EventableDescriptor
|
|
354
354
|
protected:
|
355
355
|
struct OutboundPage {
|
356
356
|
OutboundPage (const char *b, int l, int o=0): Buffer(b), Length(l), Offset(o) {}
|
357
|
-
void Free() {if (Buffer) free ((
|
357
|
+
void Free() {if (Buffer) free (const_cast<char*>(Buffer)); }
|
358
358
|
const char *Buffer;
|
359
359
|
int Length;
|
360
360
|
int Offset;
|
data/ext/em.cpp
CHANGED
@@ -382,15 +382,27 @@ EventMachine_t::_DispatchHeartbeats
|
|
382
382
|
|
383
383
|
void EventMachine_t::_DispatchHeartbeats()
|
384
384
|
{
|
385
|
+
// Store the first processed heartbeat descriptor and bail out if
|
386
|
+
// we see it again. This fixes an infinite loop in case the system time
|
387
|
+
// is changed out from underneath MyCurrentLoopTime.
|
388
|
+
const EventableDescriptor *head = NULL;
|
389
|
+
|
385
390
|
while (true) {
|
386
391
|
multimap<uint64_t,EventableDescriptor*>::iterator i = Heartbeats.begin();
|
387
392
|
if (i == Heartbeats.end())
|
388
393
|
break;
|
389
394
|
if (i->first > MyCurrentLoopTime)
|
390
395
|
break;
|
396
|
+
|
391
397
|
EventableDescriptor *ed = i->second;
|
398
|
+
if (ed == head)
|
399
|
+
break;
|
400
|
+
|
392
401
|
ed->Heartbeat();
|
393
402
|
QueueHeartbeat(ed);
|
403
|
+
|
404
|
+
if (head == NULL)
|
405
|
+
head = ed;
|
394
406
|
}
|
395
407
|
}
|
396
408
|
|
@@ -482,8 +494,7 @@ void EventMachine_t::Run()
|
|
482
494
|
_AddNewDescriptors();
|
483
495
|
_ModifyDescriptors();
|
484
496
|
|
485
|
-
|
486
|
-
break;
|
497
|
+
_RunOnce();
|
487
498
|
if (bTerminateSignalReceived)
|
488
499
|
break;
|
489
500
|
}
|
@@ -494,27 +505,24 @@ void EventMachine_t::Run()
|
|
494
505
|
EventMachine_t::_RunOnce
|
495
506
|
************************/
|
496
507
|
|
497
|
-
|
508
|
+
void EventMachine_t::_RunOnce()
|
498
509
|
{
|
499
|
-
bool ret;
|
500
510
|
if (bEpoll)
|
501
|
-
|
511
|
+
_RunEpollOnce();
|
502
512
|
else if (bKqueue)
|
503
|
-
|
513
|
+
_RunKqueueOnce();
|
504
514
|
else
|
505
|
-
|
515
|
+
_RunSelectOnce();
|
506
516
|
_DispatchHeartbeats();
|
507
517
|
_CleanupSockets();
|
508
|
-
return ret;
|
509
518
|
}
|
510
519
|
|
511
520
|
|
512
|
-
|
513
521
|
/*****************************
|
514
522
|
EventMachine_t::_RunEpollOnce
|
515
523
|
*****************************/
|
516
524
|
|
517
|
-
|
525
|
+
void EventMachine_t::_RunEpollOnce()
|
518
526
|
{
|
519
527
|
#ifdef HAVE_EPOLL
|
520
528
|
assert (epfd != -1);
|
@@ -524,17 +532,22 @@ bool EventMachine_t::_RunEpollOnce()
|
|
524
532
|
|
525
533
|
#ifdef BUILD_FOR_RUBY
|
526
534
|
int ret = 0;
|
535
|
+
|
536
|
+
#ifdef HAVE_RB_WAIT_FOR_SINGLE_FD
|
537
|
+
if ((ret = rb_wait_for_single_fd(epfd, RB_WAITFD_IN|RB_WAITFD_PRI, &tv)) < 1) {
|
538
|
+
#else
|
527
539
|
fd_set fdreads;
|
528
540
|
|
529
541
|
FD_ZERO(&fdreads);
|
530
542
|
FD_SET(epfd, &fdreads);
|
531
543
|
|
532
544
|
if ((ret = rb_thread_select(epfd + 1, &fdreads, NULL, NULL, &tv)) < 1) {
|
545
|
+
#endif
|
533
546
|
if (ret == -1) {
|
534
547
|
assert(errno != EINVAL);
|
535
548
|
assert(errno != EBADF);
|
536
549
|
}
|
537
|
-
return
|
550
|
+
return;
|
538
551
|
}
|
539
552
|
|
540
553
|
TRAP_BEG;
|
@@ -572,8 +585,6 @@ bool EventMachine_t::_RunEpollOnce()
|
|
572
585
|
timeval tv = {0, ((errno == EINTR) ? 5 : 50) * 1000};
|
573
586
|
EmSelect (0, NULL, NULL, NULL, &tv);
|
574
587
|
}
|
575
|
-
|
576
|
-
return true;
|
577
588
|
#else
|
578
589
|
throw std::runtime_error ("epoll is not implemented on this platform");
|
579
590
|
#endif
|
@@ -584,7 +595,7 @@ bool EventMachine_t::_RunEpollOnce()
|
|
584
595
|
EventMachine_t::_RunKqueueOnce
|
585
596
|
******************************/
|
586
597
|
|
587
|
-
|
598
|
+
void EventMachine_t::_RunKqueueOnce()
|
588
599
|
{
|
589
600
|
#ifdef HAVE_KQUEUE
|
590
601
|
assert (kqfd != -1);
|
@@ -598,17 +609,22 @@ bool EventMachine_t::_RunKqueueOnce()
|
|
598
609
|
|
599
610
|
#ifdef BUILD_FOR_RUBY
|
600
611
|
int ret = 0;
|
612
|
+
|
613
|
+
#ifdef HAVE_RB_WAIT_FOR_SINGLE_FD
|
614
|
+
if ((ret = rb_wait_for_single_fd(kqfd, RB_WAITFD_IN|RB_WAITFD_PRI, &tv)) < 1) {
|
615
|
+
#else
|
601
616
|
fd_set fdreads;
|
602
617
|
|
603
618
|
FD_ZERO(&fdreads);
|
604
619
|
FD_SET(kqfd, &fdreads);
|
605
620
|
|
606
621
|
if ((ret = rb_thread_select(kqfd + 1, &fdreads, NULL, NULL, &tv)) < 1) {
|
622
|
+
#endif
|
607
623
|
if (ret == -1) {
|
608
624
|
assert(errno != EINVAL);
|
609
625
|
assert(errno != EBADF);
|
610
626
|
}
|
611
|
-
return
|
627
|
+
return;
|
612
628
|
}
|
613
629
|
|
614
630
|
TRAP_BEG;
|
@@ -659,8 +675,6 @@ bool EventMachine_t::_RunKqueueOnce()
|
|
659
675
|
rb_thread_schedule();
|
660
676
|
}
|
661
677
|
#endif
|
662
|
-
|
663
|
-
return true;
|
664
678
|
#else
|
665
679
|
throw std::runtime_error ("kqueue is not implemented on this platform");
|
666
680
|
#endif
|
@@ -673,7 +687,7 @@ EventMachine_t::_TimeTilNextEvent
|
|
673
687
|
|
674
688
|
timeval EventMachine_t::_TimeTilNextEvent()
|
675
689
|
{
|
676
|
-
// 29jul11: Changed calculation base from MyCurrentLoopTime to the
|
690
|
+
// 29jul11: Changed calculation base from MyCurrentLoopTime to the
|
677
691
|
// real time. As MyCurrentLoopTime is set at the beginning of an
|
678
692
|
// iteration and this calculation is done at the end, evenmachine
|
679
693
|
// will potentially oversleep by the amount of time the iteration
|
@@ -695,10 +709,12 @@ timeval EventMachine_t::_TimeTilNextEvent()
|
|
695
709
|
if (!NewDescriptors.empty() || !ModifiedDescriptors.empty()) {
|
696
710
|
next_event = current_time;
|
697
711
|
}
|
698
|
-
|
712
|
+
|
699
713
|
timeval tv;
|
700
714
|
|
701
|
-
if (
|
715
|
+
if (NumCloseScheduled > 0 || bTerminateSignalReceived) {
|
716
|
+
tv.tv_sec = tv.tv_usec = 0;
|
717
|
+
} else if (next_event == 0) {
|
702
718
|
tv = Quantum;
|
703
719
|
} else {
|
704
720
|
if (next_event > current_time) {
|
@@ -833,37 +849,17 @@ int SelectData_t::_Select()
|
|
833
849
|
EventMachine_t::_RunSelectOnce
|
834
850
|
******************************/
|
835
851
|
|
836
|
-
|
852
|
+
void EventMachine_t::_RunSelectOnce()
|
837
853
|
{
|
838
854
|
// Crank the event machine once.
|
839
855
|
// If there are no descriptors to process, then sleep
|
840
856
|
// for a few hundred mills to avoid busy-looping.
|
841
|
-
// Return T/F to indicate whether we should continue.
|
842
857
|
// This is based on a select loop. Alternately provide epoll
|
843
858
|
// if we know we're running on a 2.6 kernel.
|
844
859
|
// epoll will be effective if we provide it as an alternative,
|
845
860
|
// however it has the same problem interoperating with Ruby
|
846
861
|
// threads that select does.
|
847
862
|
|
848
|
-
//cerr << "X";
|
849
|
-
|
850
|
-
/* This protection is now obsolete, because we will ALWAYS
|
851
|
-
* have at least one descriptor (the loop-breaker) to read.
|
852
|
-
*/
|
853
|
-
/*
|
854
|
-
if (Descriptors.size() == 0) {
|
855
|
-
#ifdef OS_UNIX
|
856
|
-
timeval tv = {0, 200 * 1000};
|
857
|
-
EmSelect (0, NULL, NULL, NULL, &tv);
|
858
|
-
return true;
|
859
|
-
#endif
|
860
|
-
#ifdef OS_WIN32
|
861
|
-
Sleep (200);
|
862
|
-
return true;
|
863
|
-
#endif
|
864
|
-
}
|
865
|
-
*/
|
866
|
-
|
867
863
|
SelectData_t SelectData;
|
868
864
|
/*
|
869
865
|
fd_set fdreads, fdwrites;
|
@@ -965,8 +961,6 @@ bool EventMachine_t::_RunSelectOnce()
|
|
965
961
|
}
|
966
962
|
}
|
967
963
|
}
|
968
|
-
|
969
|
-
return true;
|
970
964
|
}
|
971
965
|
|
972
966
|
void EventMachine_t::_CleanBadDescriptors()
|
@@ -1419,6 +1413,14 @@ int EventMachine_t::DetachFD (EventableDescriptor *ed)
|
|
1419
1413
|
// Prevent the descriptor from being modified, in case DetachFD was called from a timer or next_tick
|
1420
1414
|
ModifiedDescriptors.erase (ed);
|
1421
1415
|
|
1416
|
+
// Prevent the descriptor from being added, in case DetachFD was called in the same tick as AttachFD
|
1417
|
+
for (size_t i = 0; i < NewDescriptors.size(); i++) {
|
1418
|
+
if (ed == NewDescriptors[i]) {
|
1419
|
+
NewDescriptors.erase(NewDescriptors.begin() + i);
|
1420
|
+
break;
|
1421
|
+
}
|
1422
|
+
}
|
1423
|
+
|
1422
1424
|
// Set MySocket = INVALID_SOCKET so ShouldDelete() is true (and the descriptor gets deleted and removed),
|
1423
1425
|
// and also to prevent anyone from calling close() on the detached fd
|
1424
1426
|
ed->SetSocketInvalid();
|
@@ -1511,8 +1513,6 @@ const unsigned long EventMachine_t::CreateTcpServer (const char *server, int por
|
|
1511
1513
|
if (!bind_here)
|
1512
1514
|
return 0;
|
1513
1515
|
|
1514
|
-
unsigned long output_binding = 0;
|
1515
|
-
|
1516
1516
|
//struct sockaddr_in sin;
|
1517
1517
|
|
1518
1518
|
int sd_accept = socket (family, SOCK_STREAM, 0);
|
@@ -1549,25 +1549,7 @@ const unsigned long EventMachine_t::CreateTcpServer (const char *server, int por
|
|
1549
1549
|
goto fail;
|
1550
1550
|
}
|
1551
1551
|
|
1552
|
-
|
1553
|
-
// Set the acceptor non-blocking.
|
1554
|
-
// THIS IS CRUCIALLY IMPORTANT because we read it in a select loop.
|
1555
|
-
if (!SetSocketNonblocking (sd_accept)) {
|
1556
|
-
//int val = fcntl (sd_accept, F_GETFL, 0);
|
1557
|
-
//if (fcntl (sd_accept, F_SETFL, val | O_NONBLOCK) == -1) {
|
1558
|
-
goto fail;
|
1559
|
-
}
|
1560
|
-
}
|
1561
|
-
|
1562
|
-
{ // Looking good.
|
1563
|
-
AcceptorDescriptor *ad = new AcceptorDescriptor (sd_accept, this);
|
1564
|
-
if (!ad)
|
1565
|
-
throw std::runtime_error ("unable to allocate acceptor");
|
1566
|
-
Add (ad);
|
1567
|
-
output_binding = ad->GetBinding();
|
1568
|
-
}
|
1569
|
-
|
1570
|
-
return output_binding;
|
1552
|
+
return AttachSD(sd_accept);
|
1571
1553
|
|
1572
1554
|
fail:
|
1573
1555
|
if (sd_accept != INVALID_SOCKET)
|
@@ -1858,7 +1840,6 @@ const unsigned long EventMachine_t::CreateUnixDomainServer (const char *filename
|
|
1858
1840
|
|
1859
1841
|
// The whole rest of this function is only compiled on Unix systems.
|
1860
1842
|
#ifdef OS_UNIX
|
1861
|
-
unsigned long output_binding = 0;
|
1862
1843
|
|
1863
1844
|
struct sockaddr_un s_sun;
|
1864
1845
|
|
@@ -1896,6 +1877,24 @@ const unsigned long EventMachine_t::CreateUnixDomainServer (const char *filename
|
|
1896
1877
|
goto fail;
|
1897
1878
|
}
|
1898
1879
|
|
1880
|
+
return AttachSD(sd_accept);
|
1881
|
+
|
1882
|
+
fail:
|
1883
|
+
if (sd_accept != INVALID_SOCKET)
|
1884
|
+
close (sd_accept);
|
1885
|
+
return 0;
|
1886
|
+
#endif // OS_UNIX
|
1887
|
+
}
|
1888
|
+
|
1889
|
+
|
1890
|
+
/**************************************
|
1891
|
+
EventMachine_t::AttachSD
|
1892
|
+
**************************************/
|
1893
|
+
|
1894
|
+
const unsigned long EventMachine_t::AttachSD (int sd_accept)
|
1895
|
+
{
|
1896
|
+
unsigned long output_binding = 0;
|
1897
|
+
|
1899
1898
|
{
|
1900
1899
|
// Set the acceptor non-blocking.
|
1901
1900
|
// THIS IS CRUCIALLY IMPORTANT because we read it in a select loop.
|
@@ -1920,7 +1919,6 @@ const unsigned long EventMachine_t::CreateUnixDomainServer (const char *filename
|
|
1920
1919
|
if (sd_accept != INVALID_SOCKET)
|
1921
1920
|
close (sd_accept);
|
1922
1921
|
return 0;
|
1923
|
-
#endif // OS_UNIX
|
1924
1922
|
}
|
1925
1923
|
|
1926
1924
|
|
data/ext/em.h
CHANGED
@@ -24,9 +24,13 @@ See the file COPYING for complete licensing information.
|
|
24
24
|
#include <ruby.h>
|
25
25
|
#define EmSelect rb_thread_select
|
26
26
|
|
27
|
+
#ifdef HAVE_RB_WAIT_FOR_SINGLE_FD
|
28
|
+
#include <ruby/io.h>
|
29
|
+
#endif
|
30
|
+
|
27
31
|
#if defined(HAVE_RBTRAP)
|
28
32
|
#include <rubysig.h>
|
29
|
-
#elif defined(
|
33
|
+
#elif defined(HAVE_RB_ENABLE_INTERRUPT)
|
30
34
|
extern "C" {
|
31
35
|
void rb_enable_interrupt(void);
|
32
36
|
void rb_disable_interrupt(void);
|
@@ -84,6 +88,7 @@ class EventMachine_t
|
|
84
88
|
const unsigned long CreateTcpServer (const char *, int);
|
85
89
|
const unsigned long OpenDatagramSocket (const char *, int);
|
86
90
|
const unsigned long CreateUnixDomainServer (const char*);
|
91
|
+
const unsigned long AttachSD (int);
|
87
92
|
const unsigned long OpenKeyboard();
|
88
93
|
//const char *Popen (const char*, const char*);
|
89
94
|
const unsigned long Socketpair (char* const*);
|
@@ -141,7 +146,7 @@ class EventMachine_t
|
|
141
146
|
uint64_t GetRealTime();
|
142
147
|
|
143
148
|
private:
|
144
|
-
|
149
|
+
void _RunOnce();
|
145
150
|
void _RunTimers();
|
146
151
|
void _UpdateTime();
|
147
152
|
void _AddNewDescriptors();
|
@@ -149,9 +154,9 @@ class EventMachine_t
|
|
149
154
|
void _InitializeLoopBreaker();
|
150
155
|
void _CleanupSockets();
|
151
156
|
|
152
|
-
|
153
|
-
|
154
|
-
|
157
|
+
void _RunSelectOnce();
|
158
|
+
void _RunEpollOnce();
|
159
|
+
void _RunKqueueOnce();
|
155
160
|
|
156
161
|
void _ModifyEpollEvent (EventableDescriptor*);
|
157
162
|
void _DispatchHeartbeats();
|
data/ext/eventmachine.h
CHANGED
@@ -64,6 +64,7 @@ extern "C" {
|
|
64
64
|
void evma_stop_tcp_server (const unsigned long signature);
|
65
65
|
const unsigned long evma_create_tcp_server (const char *address, int port);
|
66
66
|
const unsigned long evma_create_unix_domain_server (const char *filename);
|
67
|
+
const unsigned long evma_attach_sd (int sd);
|
67
68
|
const unsigned long evma_open_datagram_socket (const char *server, int port);
|
68
69
|
const unsigned long evma_open_keyboard();
|
69
70
|
void evma_set_tls_parms (const unsigned long binding, const char *privatekey_filename, const char *certchain_filenane, int verify_peer);
|