eventmachine 0.12.2 → 0.12.4
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +191 -0
- data/{COPYING → docs/COPYING} +0 -0
- data/docs/ChangeLog +183 -0
- data/{DEFERRABLES → docs/DEFERRABLES} +1 -1
- data/{EPOLL → docs/EPOLL} +0 -0
- data/{GNU → docs/GNU} +0 -0
- data/docs/INSTALL +15 -0
- data/{KEYBOARD → docs/KEYBOARD} +0 -0
- data/{LEGAL → docs/LEGAL} +0 -0
- data/{LIGHTWEIGHT_CONCURRENCY → docs/LIGHTWEIGHT_CONCURRENCY} +1 -1
- data/{PURE_RUBY → docs/PURE_RUBY} +1 -1
- data/{README → docs/README} +1 -1
- data/{RELEASE_NOTES → docs/RELEASE_NOTES} +1 -1
- data/{SMTP → docs/SMTP} +1 -1
- data/{SPAWNED_PROCESSES → docs/SPAWNED_PROCESSES} +1 -1
- data/{TODO → docs/TODO} +1 -1
- data/ext/binder.cpp +1 -1
- data/ext/binder.h +1 -1
- data/ext/cmain.cpp +65 -74
- data/ext/cplusplus.cpp +1 -1
- data/ext/ed.cpp +41 -25
- data/ext/ed.h +10 -3
- data/ext/em.cpp +39 -12
- data/ext/em.h +13 -1
- data/ext/emwin.cpp +1 -1
- data/ext/emwin.h +1 -1
- data/ext/epoll.cpp +1 -1
- data/ext/epoll.h +1 -1
- data/ext/eventmachine.h +1 -1
- data/ext/eventmachine_cpp.h +1 -1
- data/ext/extconf.rb +86 -139
- data/ext/fastfilereader/extconf.rb +161 -0
- data/ext/fastfilereader/mapper.cpp +202 -0
- data/ext/fastfilereader/mapper.h +59 -0
- data/ext/fastfilereader/rubymain.cpp +127 -0
- data/ext/files.cpp +1 -1
- data/ext/files.h +1 -1
- data/ext/kb.cpp +1 -1
- data/ext/page.cpp +1 -1
- data/ext/page.h +1 -1
- data/ext/pipe.cpp +14 -7
- data/ext/project.h +1 -1
- data/ext/rubymain.cpp +56 -2
- data/ext/sigs.cpp +1 -1
- data/ext/sigs.h +1 -1
- data/ext/ssl.cpp +1 -1
- data/ext/ssl.h +1 -1
- data/java/src/com/rubyeventmachine/Application.java +196 -0
- data/java/src/com/rubyeventmachine/Connection.java +74 -0
- data/java/src/com/rubyeventmachine/ConnectionFactory.java +37 -0
- data/java/src/com/rubyeventmachine/DefaultConnectionFactory.java +46 -0
- data/java/src/com/rubyeventmachine/EmReactor.java +408 -0
- data/java/src/com/rubyeventmachine/EmReactorException.java +40 -0
- data/java/src/com/rubyeventmachine/EventableChannel.java +57 -0
- data/java/src/com/rubyeventmachine/EventableDatagramChannel.java +171 -0
- data/java/src/com/rubyeventmachine/EventableSocketChannel.java +244 -0
- data/java/src/com/rubyeventmachine/PeriodicTimer.java +38 -0
- data/java/src/com/rubyeventmachine/Timer.java +54 -0
- data/java/src/com/rubyeventmachine/tests/ApplicationTest.java +108 -0
- data/java/src/com/rubyeventmachine/tests/ConnectTest.java +124 -0
- data/java/src/com/rubyeventmachine/tests/EMTest.java +80 -0
- data/java/src/com/rubyeventmachine/tests/TestDatagrams.java +53 -0
- data/java/src/com/rubyeventmachine/tests/TestServers.java +74 -0
- data/java/src/com/rubyeventmachine/tests/TestTimers.java +89 -0
- data/lib/em/deferrable.rb +1 -1
- data/lib/em/eventable.rb +1 -1
- data/lib/em/future.rb +1 -1
- data/lib/em/messages.rb +1 -1
- data/lib/em/processes.rb +1 -1
- data/lib/em/spawnable.rb +1 -1
- data/lib/em/streamer.rb +1 -1
- data/lib/eventmachine.rb +138 -116
- data/lib/eventmachine_version.rb +2 -2
- data/lib/evma.rb +1 -1
- data/lib/evma/callback.rb +1 -1
- data/lib/evma/container.rb +1 -1
- data/lib/evma/factory.rb +1 -1
- data/lib/evma/protocol.rb +1 -1
- data/lib/evma/reactor.rb +1 -1
- data/lib/jeventmachine.rb +7 -2
- data/lib/pr_eventmachine.rb +2 -2
- data/lib/protocols/buftok.rb +1 -1
- data/lib/protocols/header_and_content.rb +1 -1
- data/lib/protocols/httpcli2.rb +16 -6
- data/lib/protocols/httpclient.rb +7 -1
- data/lib/protocols/line_and_text.rb +6 -2
- data/lib/protocols/linetext2.rb +12 -14
- data/lib/protocols/postgres.rb +1 -1
- data/lib/protocols/saslauth.rb +1 -1
- data/lib/protocols/smtpclient.rb +1 -1
- data/lib/protocols/smtpserver.rb +36 -23
- data/lib/protocols/stomp.rb +24 -1
- data/lib/protocols/tcptest.rb +1 -1
- data/tasks/cpp.rake +77 -0
- data/tasks/project.rake +78 -0
- data/tasks/tests.rake +192 -0
- data/tests/test_attach.rb +1 -1
- data/tests/test_basic.rb +65 -12
- data/tests/test_defer.rb +13 -29
- data/tests/test_epoll.rb +16 -21
- data/tests/test_errors.rb +1 -1
- data/tests/test_eventables.rb +4 -5
- data/tests/test_exc.rb +1 -1
- data/tests/test_futures.rb +1 -1
- data/tests/test_hc.rb +185 -236
- data/tests/test_httpclient.rb +1 -1
- data/tests/test_httpclient2.rb +28 -6
- data/tests/test_kb.rb +2 -2
- data/tests/test_ltp.rb +139 -141
- data/tests/test_ltp2.rb +1 -1
- data/tests/test_next_tick.rb +1 -1
- data/tests/test_processes.rb +1 -1
- data/tests/test_pure.rb +3 -2
- data/tests/test_running.rb +1 -1
- data/tests/test_sasl.rb +1 -1
- data/tests/test_send_file.rb +56 -51
- data/tests/test_servers.rb +26 -36
- data/tests/test_smtpclient.rb +46 -44
- data/tests/test_smtpserver.rb +1 -1
- data/tests/test_spawn.rb +1 -1
- data/tests/test_ssl_args.rb +68 -0
- data/tests/test_timers.rb +15 -9
- data/tests/test_ud.rb +1 -1
- data/tests/testem.rb +30 -4
- metadata +69 -34
data/ext/ed.h
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
/*****************************************************************************
|
2
2
|
|
3
|
-
$Id
|
3
|
+
$Id$
|
4
4
|
|
5
5
|
File: ed.h
|
6
6
|
Date: 06Apr06
|
@@ -85,7 +85,14 @@ class EventableDescriptor: public Bindable_t
|
|
85
85
|
|
86
86
|
protected:
|
87
87
|
enum {
|
88
|
-
|
88
|
+
// 4 seconds is too short, most other libraries default to OS settings
|
89
|
+
// which in 2.6 kernel defaults to a 60 second connect timeout.
|
90
|
+
//
|
91
|
+
// Curl-Multi: http://curl.haxx.se/mail/lib-2001-01/0019.html
|
92
|
+
//
|
93
|
+
// updating to 50 seconds, so we catch it before the OS does
|
94
|
+
|
95
|
+
PendingConnectTimeout = 50 // can easily be made an instance variable
|
89
96
|
};
|
90
97
|
|
91
98
|
void (*EventCallback)(const char*, int, const char*, int);
|
@@ -139,7 +146,7 @@ class ConnectionDescriptor: public EventableDescriptor
|
|
139
146
|
|
140
147
|
int SendOutboundData (const char*, int);
|
141
148
|
|
142
|
-
void SetConnectPending (bool f)
|
149
|
+
void SetConnectPending (bool f);
|
143
150
|
|
144
151
|
void SetNotifyReadable (bool readable) { bNotifyReadable = readable; }
|
145
152
|
void SetNotifyWritable (bool writable) { bNotifyWritable = writable; }
|
data/ext/em.cpp
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
/*****************************************************************************
|
2
2
|
|
3
|
-
$Id
|
3
|
+
$Id$
|
4
4
|
|
5
5
|
File: em.cpp
|
6
6
|
Date: 06Apr06
|
@@ -426,7 +426,16 @@ bool EventMachine_t::_RunEpollOnce()
|
|
426
426
|
#ifdef HAVE_EPOLL
|
427
427
|
assert (epfd != -1);
|
428
428
|
struct epoll_event ev [MaxEpollDescriptors];
|
429
|
-
int s
|
429
|
+
int s;
|
430
|
+
|
431
|
+
#ifdef BUILD_FOR_RUBY
|
432
|
+
TRAP_BEG;
|
433
|
+
#endif
|
434
|
+
s = epoll_wait (epfd, ev, MaxEpollDescriptors, 50);
|
435
|
+
#ifdef BUILD_FOR_RUBY
|
436
|
+
TRAP_END;
|
437
|
+
#endif
|
438
|
+
|
430
439
|
if (s > 0) {
|
431
440
|
for (int i=0; i < s; i++) {
|
432
441
|
EventableDescriptor *ed = (EventableDescriptor*) ev[i].data.ptr;
|
@@ -511,8 +520,11 @@ bool EventMachine_t::_RunEpollOnce()
|
|
511
520
|
}
|
512
521
|
}
|
513
522
|
|
514
|
-
|
515
|
-
|
523
|
+
#ifdef BUILD_FOR_RUBY
|
524
|
+
if (!rb_thread_alone()) {
|
525
|
+
rb_thread_schedule();
|
526
|
+
}
|
527
|
+
#endif
|
516
528
|
|
517
529
|
return true;
|
518
530
|
#else
|
@@ -533,7 +545,14 @@ bool EventMachine_t::_RunKqueueOnce()
|
|
533
545
|
struct kevent Karray [maxKevents];
|
534
546
|
struct timespec ts = {0, 10000000}; // Too frequent. Use blocking_region
|
535
547
|
|
536
|
-
int k
|
548
|
+
int k;
|
549
|
+
#ifdef BUILD_FOR_RUBY
|
550
|
+
TRAP_BEG;
|
551
|
+
#endif
|
552
|
+
k = kevent (kqfd, NULL, 0, Karray, maxKevents, &ts);
|
553
|
+
#ifdef BUILD_FOR_RUBY
|
554
|
+
TRAP_END;
|
555
|
+
#endif
|
537
556
|
struct kevent *ke = Karray;
|
538
557
|
while (k > 0) {
|
539
558
|
EventableDescriptor *ed = (EventableDescriptor*) (ke->udata);
|
@@ -587,8 +606,11 @@ bool EventMachine_t::_RunKqueueOnce()
|
|
587
606
|
|
588
607
|
|
589
608
|
// TODO, replace this with rb_thread_blocking_region for 1.9 builds.
|
590
|
-
|
591
|
-
|
609
|
+
#ifdef BUILD_FOR_RUBY
|
610
|
+
if (!rb_thread_alone()) {
|
611
|
+
rb_thread_schedule();
|
612
|
+
}
|
613
|
+
#endif
|
592
614
|
|
593
615
|
return true;
|
594
616
|
#else
|
@@ -631,6 +653,7 @@ SelectData_t::SelectData_t()
|
|
631
653
|
}
|
632
654
|
|
633
655
|
|
656
|
+
#ifdef BUILD_FOR_RUBY
|
634
657
|
/*****************
|
635
658
|
_SelectDataSelect
|
636
659
|
*****************/
|
@@ -651,7 +674,7 @@ SelectData_t::_Select
|
|
651
674
|
int SelectData_t::_Select()
|
652
675
|
{
|
653
676
|
#ifdef HAVE_TBR
|
654
|
-
rb_thread_blocking_region (_SelectDataSelect, (void*)this,
|
677
|
+
rb_thread_blocking_region (_SelectDataSelect, (void*)this, RUBY_UBF_IO, 0);
|
655
678
|
return nSockets;
|
656
679
|
#endif
|
657
680
|
|
@@ -659,6 +682,7 @@ int SelectData_t::_Select()
|
|
659
682
|
return EmSelect (maxsocket+1, &fdreads, &fdwrites, NULL, &tv);
|
660
683
|
#endif
|
661
684
|
}
|
685
|
+
#endif
|
662
686
|
|
663
687
|
|
664
688
|
|
@@ -738,7 +762,7 @@ bool EventMachine_t::_RunSelectOnce()
|
|
738
762
|
//timeval tv = Quantum;
|
739
763
|
SelectData.tv = Quantum;
|
740
764
|
int s = SelectData._Select();
|
741
|
-
//rb_thread_blocking_region(xxx,(void*)&SelectData,
|
765
|
+
//rb_thread_blocking_region(xxx,(void*)&SelectData,RUBY_UBF_IO,0);
|
742
766
|
//int s = EmSelect (SelectData.maxsocket+1, &(SelectData.fdreads), &(SelectData.fdwrites), NULL, &(SelectData.tv));
|
743
767
|
//int s = SelectData.nSockets;
|
744
768
|
if (s > 0) {
|
@@ -1183,14 +1207,15 @@ const char *EventMachine_t::AttachFD (int fd, bool notify_readable, bool notify_
|
|
1183
1207
|
#endif
|
1184
1208
|
|
1185
1209
|
{// Check for duplicate descriptors
|
1186
|
-
|
1210
|
+
size_t i;
|
1211
|
+
for (i = 0; i < Descriptors.size(); i++) {
|
1187
1212
|
EventableDescriptor *ed = Descriptors[i];
|
1188
1213
|
assert (ed);
|
1189
1214
|
if (ed->GetSocket() == fd)
|
1190
1215
|
throw std::runtime_error ("adding existing descriptor");
|
1191
1216
|
}
|
1192
1217
|
|
1193
|
-
for (
|
1218
|
+
for (i = 0; i < NewDescriptors.size(); i++) {
|
1194
1219
|
EventableDescriptor *ed = NewDescriptors[i];
|
1195
1220
|
assert (ed);
|
1196
1221
|
if (ed->GetSocket() == fd)
|
@@ -1284,7 +1309,9 @@ struct sockaddr *name2address (const char *server, int port, int *family, int *b
|
|
1284
1309
|
// Return NULL if no resolution.
|
1285
1310
|
|
1286
1311
|
static struct sockaddr_in in4;
|
1312
|
+
#ifndef __CYGWIN__
|
1287
1313
|
static struct sockaddr_in6 in6;
|
1314
|
+
#endif
|
1288
1315
|
struct hostent *hp;
|
1289
1316
|
|
1290
1317
|
if (!server || !*server)
|
@@ -1301,7 +1328,7 @@ struct sockaddr *name2address (const char *server, int port, int *family, int *b
|
|
1301
1328
|
return (struct sockaddr*)&in4;
|
1302
1329
|
}
|
1303
1330
|
|
1304
|
-
#
|
1331
|
+
#if defined(OS_UNIX) && !defined(__CYGWIN__)
|
1305
1332
|
memset (&in6, 0, sizeof(in6));
|
1306
1333
|
if (inet_pton (AF_INET6, server, in6.sin6_addr.s6_addr) > 0) {
|
1307
1334
|
if (family)
|
data/ext/em.h
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
/*****************************************************************************
|
2
2
|
|
3
|
-
$Id
|
3
|
+
$Id$
|
4
4
|
|
5
5
|
File: em.h
|
6
6
|
Date: 06Apr06
|
@@ -33,6 +33,18 @@ See the file COPYING for complete licensing information.
|
|
33
33
|
#ifdef BUILD_FOR_RUBY
|
34
34
|
#include <ruby.h>
|
35
35
|
#define EmSelect rb_thread_select
|
36
|
+
|
37
|
+
#ifdef HAVE_RBTRAP
|
38
|
+
#include <rubysig.h>
|
39
|
+
#else
|
40
|
+
#define TRAP_BEG
|
41
|
+
#define TRAP_END
|
42
|
+
#endif
|
43
|
+
|
44
|
+
// 1.9.0 compat
|
45
|
+
#ifndef RUBY_UDF_IO
|
46
|
+
#define RUBY_UDF_IO RB_UDF_DFL
|
47
|
+
#endif
|
36
48
|
#else
|
37
49
|
#define EmSelect select
|
38
50
|
#endif
|
data/ext/emwin.cpp
CHANGED
data/ext/emwin.h
CHANGED
data/ext/epoll.cpp
CHANGED
data/ext/epoll.h
CHANGED
data/ext/eventmachine.h
CHANGED
data/ext/eventmachine_cpp.h
CHANGED
data/ext/extconf.rb
CHANGED
@@ -1,15 +1,15 @@
|
|
1
|
-
# $Id
|
1
|
+
# $Id$
|
2
2
|
#
|
3
3
|
#----------------------------------------------------------------------------
|
4
4
|
#
|
5
5
|
# Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved.
|
6
6
|
# Gmail: blackhedd
|
7
|
-
#
|
7
|
+
#
|
8
8
|
# This program is free software; you can redistribute it and/or modify
|
9
9
|
# it under the terms of either: 1) the GNU General Public License
|
10
10
|
# as published by the Free Software Foundation; either version 2 of the
|
11
11
|
# License, or (at your option) any later version; or 2) Ruby's License.
|
12
|
-
#
|
12
|
+
#
|
13
13
|
# See the file COPYING for complete licensing information.
|
14
14
|
#
|
15
15
|
#---------------------------------------------------------------------------
|
@@ -18,56 +18,59 @@
|
|
18
18
|
# We have to munge LDSHARED because this code needs a C++ link.
|
19
19
|
#
|
20
20
|
|
21
|
+
def check_libs libs = [], fatal = false
|
22
|
+
libs.all? { |lib| have_library(lib) || (abort("could not find library: #{lib}") if fatal) }
|
23
|
+
end
|
24
|
+
|
25
|
+
def check_heads heads = [], fatal = false
|
26
|
+
heads.all? { |head| have_header(head) || (abort("could not find header: #{head}") if fatal)}
|
27
|
+
end
|
28
|
+
|
29
|
+
def add_define(name)
|
30
|
+
$defs.push("-D#{name}")
|
31
|
+
end
|
32
|
+
|
21
33
|
require 'mkmf'
|
22
34
|
|
23
|
-
|
35
|
+
add_define 'BUILD_FOR_RUBY'
|
36
|
+
add_define 'HAVE_RBTRAP' if have_var('rb_trap_immediate', ['ruby.h', 'rubysig.h'])
|
37
|
+
add_define "HAVE_TBR" if have_func('rb_thread_blocking_region')# and have_macro('RUBY_UBF_IO', 'ruby.h')
|
24
38
|
|
25
|
-
|
26
|
-
when 'mswin32', 'mingw32', 'bccwin32'
|
27
|
-
unless have_header('windows.h') and
|
28
|
-
have_header('winsock.h') and
|
29
|
-
have_library('kernel32') and
|
30
|
-
have_library('rpcrt4') and
|
31
|
-
have_library('gdi32')
|
32
|
-
exit
|
33
|
-
end
|
39
|
+
# Minor platform details between *nix and Windows:
|
34
40
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
have_header('openssl/ssl.h') and
|
44
|
-
have_header('openssl/err.h')
|
45
|
-
flags << '-D WITH_SSL'
|
46
|
-
else
|
47
|
-
flags << '-D WITHOUT_SSL'
|
48
|
-
end
|
41
|
+
if RUBY_PLATFORM =~ /(mswin|mingw|bccwin)/
|
42
|
+
GNU_CHAIN = $1 == 'mingw'
|
43
|
+
OS_WIN32 = true
|
44
|
+
add_define "OS_WIN32"
|
45
|
+
else
|
46
|
+
GNU_CHAIN = true
|
47
|
+
OS_UNIX = true
|
48
|
+
add_define 'OS_UNIX'
|
49
49
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
50
|
+
add_define "HAVE_KQUEUE" if have_header("sys/event.h") and have_header("sys/queue.h")
|
51
|
+
|
52
|
+
# check_libs(%w[pthread], true)
|
53
|
+
end
|
54
|
+
|
55
|
+
# Main platform invariances:
|
56
56
|
|
57
|
-
|
58
|
-
|
59
|
-
|
57
|
+
case RUBY_PLATFORM
|
58
|
+
when /mswin32/, /mingw32/, /bccwin32/
|
59
|
+
check_heads(%w[windows.h winsock.h], true)
|
60
|
+
check_libs(%w[kernel32 rpcrt4 gdi32], true)
|
60
61
|
|
61
|
-
|
62
|
-
|
63
|
-
have_library('crypto') and
|
64
|
-
have_header('openssl/ssl.h') and
|
65
|
-
have_header('openssl/err.h')
|
66
|
-
flags << '-D WITH_SSL'
|
62
|
+
if GNU_CHAIN
|
63
|
+
CONFIG['LDSHARED'] = "$(CXX) -shared -lstdc++"
|
67
64
|
else
|
68
|
-
|
65
|
+
$defs.push "-EHs"
|
66
|
+
$defs.push "-GR"
|
69
67
|
end
|
70
68
|
|
69
|
+
when /solaris/
|
70
|
+
check_libs(%w[nsl socket], true)
|
71
|
+
|
72
|
+
add_define 'OS_SOLARIS8'
|
73
|
+
|
71
74
|
# on Unix we need a g++ link, not gcc.
|
72
75
|
CONFIG['LDSHARED'] = "$(CXX) -shared"
|
73
76
|
|
@@ -77,127 +80,71 @@ when /solaris/
|
|
77
80
|
CONFIG['CCDLFLAGS'] = "-fPIC"
|
78
81
|
end
|
79
82
|
|
80
|
-
when /openbsd/
|
83
|
+
when /openbsd/
|
81
84
|
# OpenBSD branch contributed by Guillaume Sellier.
|
82
|
-
|
83
|
-
flags << '-DBUILD_FOR_RUBY'
|
84
|
-
|
85
|
-
dir_config('ssl') # here I don't know why we have to check -lcrypto before -lssl otherwise -lssl is not found
|
86
|
-
if have_library('crypto') and
|
87
|
-
have_library('ssl') and
|
88
|
-
have_header('openssl/ssl.h') and
|
89
|
-
have_header('openssl/err.h')
|
90
|
-
flags << '-DWITH_SSL'
|
91
|
-
else
|
92
|
-
flags << '-DWITHOUT_SSL'
|
93
|
-
end
|
85
|
+
|
94
86
|
# on Unix we need a g++ link, not gcc. On OpenBSD, linking against libstdc++ have to be explicitly done for shared libs
|
95
87
|
CONFIG['LDSHARED'] = "$(CXX) -shared -lstdc++"
|
96
88
|
|
97
|
-
|
98
89
|
when /darwin/
|
99
|
-
flags << '-DOS_UNIX'
|
100
|
-
flags << '-DBUILD_FOR_RUBY'
|
101
|
-
|
102
|
-
if have_header("sys/event.h") and have_header("sys/queue.h")
|
103
|
-
flags << "-DHAVE_KQUEUE"
|
104
|
-
end
|
105
90
|
|
106
|
-
dir_config('ssl')
|
107
|
-
if have_library('ssl') and
|
108
|
-
have_library('crypto') and
|
109
|
-
have_library('C') and
|
110
|
-
have_header('openssl/ssl.h') and
|
111
|
-
have_header('openssl/err.h')
|
112
|
-
flags << '-DWITH_SSL'
|
113
|
-
else
|
114
|
-
flags << '-DWITHOUT_SSL'
|
115
|
-
end
|
116
91
|
# on Unix we need a g++ link, not gcc.
|
117
92
|
# Ff line contributed by Daniel Harple.
|
118
93
|
CONFIG['LDSHARED'] = "$(CXX) " + CONFIG['LDSHARED'].split[1..-1].join(' ')
|
119
94
|
|
120
95
|
when /linux/
|
121
|
-
unless have_library('pthread')
|
122
|
-
exit
|
123
|
-
end
|
124
|
-
|
125
|
-
flags << '-DOS_UNIX'
|
126
|
-
flags << '-DBUILD_FOR_RUBY'
|
127
96
|
|
128
97
|
# Original epoll test is inadequate because 2.4 kernels have the header
|
129
98
|
# but not the code.
|
130
|
-
#
|
99
|
+
# add_define 'HAVE_EPOLL' if have_header('sys/epoll.h')
|
131
100
|
if have_header('sys/epoll.h')
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
end
|
140
|
-
|
141
|
-
if have_func('rb_thread_blocking_region') and have_macro('RB_UBF_DFL', 'ruby.h')
|
142
|
-
flags << "-DHAVE_TBR"
|
101
|
+
File.open("hasEpollTest.c", "w") {|f|
|
102
|
+
f.puts "#include <sys/epoll.h>"
|
103
|
+
f.puts "int main() { epoll_create(1024); return 0;}"
|
104
|
+
}
|
105
|
+
(e = system( "gcc hasEpollTest.c -o hasEpollTest " )) and (e = $?.to_i)
|
106
|
+
`rm -f hasEpollTest.c hasEpollTest`
|
107
|
+
add_define 'HAVE_EPOLL' if e == 0
|
143
108
|
end
|
144
109
|
|
145
|
-
dir_config('ssl', "#{ENV['OPENSSL']}/include", ENV['OPENSSL'])
|
146
|
-
# Check for libcrypto twice, before and after ssl. That's because on some platforms
|
147
|
-
# and openssl versions, libssl will emit unresolved externals from crypto. It
|
148
|
-
# would be cleaner to simply check crypto first, but that doesn't always work in
|
149
|
-
# Ruby. The order we check them doesn't seem to control the order in which they're
|
150
|
-
# emitted into the link command. This is pretty weird, I have to admit.
|
151
|
-
if have_library('crypto') and
|
152
|
-
have_library('ssl') and
|
153
|
-
have_library('crypto') and
|
154
|
-
have_header('openssl/ssl.h') and
|
155
|
-
have_header('openssl/err.h')
|
156
|
-
flags << '-DWITH_SSL'
|
157
|
-
else
|
158
|
-
flags << '-DWITHOUT_SSL'
|
159
|
-
end
|
160
110
|
# on Unix we need a g++ link, not gcc.
|
161
111
|
CONFIG['LDSHARED'] = "$(CXX) -shared"
|
162
|
-
|
163
|
-
# Modify the mkmf constant LINK_SO so the generated shared object is stripped.
|
164
|
-
# You might think modifying CONFIG['LINK_SO'] would be a better way to do this,
|
165
|
-
# but it doesn't work because mkmf doesn't look at CONFIG['LINK_SO'] again after
|
166
|
-
# it initializes.
|
167
|
-
linkso = Object.send :remove_const, "LINK_SO"
|
168
|
-
LINK_SO = linkso + "; strip $@"
|
169
|
-
|
170
112
|
else
|
171
|
-
unless have_library('pthread')
|
172
|
-
exit
|
173
|
-
end
|
174
|
-
|
175
|
-
flags << '-DOS_UNIX'
|
176
|
-
flags << '-DBUILD_FOR_RUBY'
|
177
|
-
|
178
|
-
if have_header("sys/event.h") and have_header("sys/queue.h")
|
179
|
-
flags << "-DHAVE_KQUEUE"
|
180
|
-
end
|
181
|
-
|
182
|
-
dir_config('ssl')
|
183
|
-
if have_library('ssl') and
|
184
|
-
have_library('crypto') and
|
185
|
-
have_header('openssl/ssl.h') and
|
186
|
-
have_header('openssl/err.h')
|
187
|
-
flags << '-DWITH_SSL'
|
188
|
-
else
|
189
|
-
flags << '-DWITHOUT_SSL'
|
190
|
-
end
|
191
113
|
# on Unix we need a g++ link, not gcc.
|
192
114
|
CONFIG['LDSHARED'] = "$(CXX) -shared"
|
115
|
+
end
|
193
116
|
|
117
|
+
# OpenSSL:
|
118
|
+
|
119
|
+
def manual_ssl_config
|
120
|
+
ssl_libs_heads_args = {
|
121
|
+
:unix => [%w[ssl crypto], %w[openssl/ssl.h openssl/err.h]],
|
122
|
+
:darwin => [%w[ssl crypto C], %w[openssl/ssl.h openssl/err.h]],
|
123
|
+
# openbsd and linux:
|
124
|
+
:crypto_hack => [%w[crypto ssl crypto], %w[openssl/ssl.h openssl/err.h]],
|
125
|
+
:mswin => [%w[ssleay32 libeay32], %w[openssl/ssl.h openssl/err.h]],
|
126
|
+
}
|
127
|
+
|
128
|
+
dc_flags = ['ssl']
|
129
|
+
dc_flags += ["#{ENV['OPENSSL']}/include", ENV['OPENSSL']] if /linux/ =~ RUBY_PLATFORM
|
130
|
+
|
131
|
+
libs, heads = case RUBY_PLATFORM
|
132
|
+
when /mswin/ ; ssl_libs_heads_args[:mswin]
|
133
|
+
when /mingw/ ; ssl_libs_heads_args[:unix]
|
134
|
+
when /darwin/ ; ssl_libs_heads_args[:darwin]
|
135
|
+
when /openbsd/ ; ssl_libs_heads_args[:crypto_hack]
|
136
|
+
when /linux/ ; ssl_libs_heads_args[:crypto_hack]
|
137
|
+
else ssl_libs_heads_args[:unix]
|
138
|
+
end
|
139
|
+
dir_config(*dc_flags)
|
140
|
+
check_libs(libs) and check_heads(heads)
|
194
141
|
end
|
195
142
|
|
196
|
-
|
197
|
-
|
143
|
+
# Try to use pkg_config first, fixes #73
|
144
|
+
if pkg_config('openssl') || manual_ssl_config
|
145
|
+
add_define "WITH_SSL"
|
198
146
|
else
|
199
|
-
|
147
|
+
add_define "WITHOUT_SSL"
|
200
148
|
end
|
201
149
|
|
202
|
-
|
203
|
-
create_makefile "rubyeventmachine"
|
150
|
+
create_makefile "rubyeventmachine"
|