eventmachine 1.0.8 → 1.0.9
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 -4
- data/CHANGELOG.md +16 -1
- data/ext/ed.cpp +21 -14
- data/ext/em.cpp +24 -8
- data/ext/em.h +13 -0
- data/ext/extconf.rb +82 -38
- data/ext/fastfilereader/extconf.rb +5 -1
- data/ext/fastfilereader/mapper.cpp +2 -0
- data/ext/pipe.cpp +7 -2
- data/ext/rubymain.cpp +13 -12
- data/ext/ssl.cpp +2 -2
- data/lib/em/version.rb +1 -1
- data/lib/eventmachine.rb +6 -1
- data/tests/em_test_helper.rb +4 -0
- data/tests/test_file_watch.rb +1 -0
- metadata +30 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 95a7b099599de06d369149072de07081ad2a1485
|
4
|
+
data.tar.gz: 1b5f7379db7f1314b4cd8663191f60fce59466f3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 49f71fe7325e32e45a1febc789e815e64e94908b6285957180a0e26fa39ebe6ac3377eb7507da11cfdcbcd607f78ee7a3939a6a1374f998a5819f6092cd0c17d
|
7
|
+
data.tar.gz: ec5fbdb8d54d186e5398b843ef6985d5b9e83c26d32483d739268765a99ae84fdd17e0809c9fda8eb36ca71c51ce4ab623eb270d64884e388669656cee19040b
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,20 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 1.0.9 (January 13, 2016)
|
4
|
+
* Try more ways to detect OpenSSL [#602, #643, #661, #663, #668, #669]
|
5
|
+
* Use WSAGetLastError in pipe.cpp same as ed.cpp [#659]
|
6
|
+
* Test compiler flags with the C++ compiler and add them to CXXFLAGS [#634, #651]
|
7
|
+
* Restore silent-fail on unsupported EM.epoll and EM.kqueue [#638, #649]
|
8
|
+
* getDescriptorByFileno deprecated in JRuby 1.7.x, removed in JRuby 9000 [#642, #648]
|
9
|
+
* Add -Wno-address always-true because on Windows rb_fd_select [#578]
|
10
|
+
* Remove the WITHOUT_SSL constant [#578]
|
11
|
+
* Fix SSL error when the server replies a TLS Alert to our ClientHello [#544, #653]
|
12
|
+
* Use WSAStringToAddress in lieu of inet_pton for IPv6 address detection on Windows [#595, #632]
|
13
|
+
* Fix nasty TCP/IPv6 bug [#595, #632]
|
14
|
+
* Use select_large_fdset on Solaris [#611, #625]
|
15
|
+
* Detect the Solaris Studio compiler [#611, #625]
|
16
|
+
* Throw a message with strerror included [#136, #621]
|
17
|
+
|
3
18
|
## 1.0.8 (August 6, 2015)
|
4
19
|
* fix kqueue assertion failed, postpone ArmKqueueWriter until all events are processed [#51, #176, #372, #401, #619]
|
5
20
|
* fix Rubinius GC, crank the machine from Ruby space when running Rubinius [#201, #202, #617]
|
@@ -10,7 +25,7 @@
|
|
10
25
|
* fix for compilation with SSL on windows [#601]
|
11
26
|
* open file descriptors and sockets with O_CLOEXEC where possible [#298, #488, #591]
|
12
27
|
* fix SmtpClient: send second EHLO after STARTTLS. [#589]
|
13
|
-
* fix nul-terminated strings in C, use StringValueCStr instead of StringValuePtr
|
28
|
+
* fix nul-terminated strings in C, use StringValueCStr instead of StringValuePtr
|
14
29
|
|
15
30
|
## 1.0.7 (February 10, 2015)
|
16
31
|
* fix delay in kqueue/epoll reactor shutdown when timers exist [#587]
|
data/ext/ed.cpp
CHANGED
@@ -857,9 +857,9 @@ void ConnectionDescriptor::Read()
|
|
857
857
|
ConnectionDescriptor::_DispatchInboundData
|
858
858
|
******************************************/
|
859
859
|
|
860
|
+
#ifdef WITH_SSL
|
860
861
|
void ConnectionDescriptor::_DispatchInboundData (const char *buffer, unsigned long size)
|
861
862
|
{
|
862
|
-
#ifdef WITH_SSL
|
863
863
|
if (SslBox) {
|
864
864
|
SslBox->PutCiphertext (buffer, size);
|
865
865
|
|
@@ -873,6 +873,7 @@ void ConnectionDescriptor::_DispatchInboundData (const char *buffer, unsigned lo
|
|
873
873
|
|
874
874
|
// If our SSL handshake had a problem, shut down the connection.
|
875
875
|
if (s == -2) {
|
876
|
+
UnbindReasonCode = EPROTO;
|
876
877
|
ScheduleClose(false);
|
877
878
|
return;
|
878
879
|
}
|
@@ -883,12 +884,13 @@ void ConnectionDescriptor::_DispatchInboundData (const char *buffer, unsigned lo
|
|
883
884
|
else {
|
884
885
|
_GenericInboundDispatch(buffer, size);
|
885
886
|
}
|
886
|
-
|
887
|
-
|
888
|
-
|
887
|
+
}
|
888
|
+
#else
|
889
|
+
void ConnectionDescriptor::_DispatchInboundData (const char *buffer, unsigned long size)
|
890
|
+
{
|
889
891
|
_GenericInboundDispatch(buffer, size);
|
890
|
-
#endif
|
891
892
|
}
|
893
|
+
#endif
|
892
894
|
|
893
895
|
|
894
896
|
|
@@ -1024,6 +1026,8 @@ void ConnectionDescriptor::_WriteOutboundData()
|
|
1024
1026
|
for(int i = 0; i < iovcnt; i++){
|
1025
1027
|
OutboundPage *op = &(OutboundPages[i]);
|
1026
1028
|
#ifdef CC_SUNWspro
|
1029
|
+
// TODO: The void * cast works fine on Solaris 11, but
|
1030
|
+
// I don't know at what point that changed from older Solaris.
|
1027
1031
|
iov[i].iov_base = (char *)(op->Buffer + op->Offset);
|
1028
1032
|
#else
|
1029
1033
|
iov[i].iov_base = (void *)(op->Buffer + op->Offset);
|
@@ -1165,29 +1169,31 @@ int ConnectionDescriptor::ReportErrorStatus()
|
|
1165
1169
|
ConnectionDescriptor::StartTls
|
1166
1170
|
******************************/
|
1167
1171
|
|
1172
|
+
#ifdef WITH_SSL
|
1168
1173
|
void ConnectionDescriptor::StartTls()
|
1169
1174
|
{
|
1170
|
-
#ifdef WITH_SSL
|
1171
1175
|
if (SslBox)
|
1172
1176
|
throw std::runtime_error ("SSL/TLS already running on connection");
|
1173
1177
|
|
1174
1178
|
SslBox = new SslBox_t (bIsServer, PrivateKeyFilename, CertChainFilename, bSslVerifyPeer, GetBinding());
|
1175
1179
|
_DispatchCiphertext();
|
1176
|
-
#endif
|
1177
1180
|
|
1178
|
-
|
1181
|
+
}
|
1182
|
+
#else
|
1183
|
+
void ConnectionDescriptor::StartTls()
|
1184
|
+
{
|
1179
1185
|
throw std::runtime_error ("Encryption not available on this event-machine");
|
1180
|
-
#endif
|
1181
1186
|
}
|
1187
|
+
#endif
|
1182
1188
|
|
1183
1189
|
|
1184
1190
|
/*********************************
|
1185
1191
|
ConnectionDescriptor::SetTlsParms
|
1186
1192
|
*********************************/
|
1187
1193
|
|
1194
|
+
#ifdef WITH_SSL
|
1188
1195
|
void ConnectionDescriptor::SetTlsParms (const char *privkey_filename, const char *certchain_filename, bool verify_peer)
|
1189
1196
|
{
|
1190
|
-
#ifdef WITH_SSL
|
1191
1197
|
if (SslBox)
|
1192
1198
|
throw std::runtime_error ("call SetTlsParms before calling StartTls");
|
1193
1199
|
if (privkey_filename && *privkey_filename)
|
@@ -1195,12 +1201,13 @@ void ConnectionDescriptor::SetTlsParms (const char *privkey_filename, const char
|
|
1195
1201
|
if (certchain_filename && *certchain_filename)
|
1196
1202
|
CertChainFilename = certchain_filename;
|
1197
1203
|
bSslVerifyPeer = verify_peer;
|
1198
|
-
|
1199
|
-
|
1200
|
-
|
1204
|
+
}
|
1205
|
+
#else
|
1206
|
+
void ConnectionDescriptor::SetTlsParms (const char *privkey_filename UNUSED, const char *certchain_filename UNUSED, bool verify_peer UNUSED)
|
1207
|
+
{
|
1201
1208
|
throw std::runtime_error ("Encryption not available on this event-machine");
|
1202
|
-
#endif
|
1203
1209
|
}
|
1210
|
+
#endif
|
1204
1211
|
|
1205
1212
|
|
1206
1213
|
/*********************************
|
data/ext/em.cpp
CHANGED
@@ -260,9 +260,17 @@ void EventMachine_t::SetuidString (const char *username)
|
|
260
260
|
if (!username || !*username)
|
261
261
|
throw std::runtime_error ("setuid_string failed: no username specified");
|
262
262
|
|
263
|
+
errno = 0;
|
263
264
|
struct passwd *p = getpwnam (username);
|
264
|
-
if (!p)
|
265
|
-
|
265
|
+
if (!p) {
|
266
|
+
if (errno) {
|
267
|
+
char buf[200];
|
268
|
+
snprintf (buf, sizeof(buf)-1, "setuid_string failed: %s", strerror(errno));
|
269
|
+
throw std::runtime_error (buf);
|
270
|
+
} else {
|
271
|
+
throw std::runtime_error ("setuid_string failed: unknown username");
|
272
|
+
}
|
273
|
+
}
|
266
274
|
|
267
275
|
if (setuid (p->pw_uid) != 0)
|
268
276
|
throw std::runtime_error ("setuid_string failed: no setuid");
|
@@ -1187,9 +1195,12 @@ const uintptr_t EventMachine_t::ConnectToServer (const char *bind_addr, int bind
|
|
1187
1195
|
throw std::runtime_error ("invalid server or port");
|
1188
1196
|
|
1189
1197
|
int family, bind_size;
|
1190
|
-
struct
|
1191
|
-
if (!bind_as_ptr)
|
1192
|
-
|
1198
|
+
struct sockaddr_storage bind_as, *bind_as_ptr = (struct sockaddr_storage*)name2address (server, port, &family, &bind_size);
|
1199
|
+
if (!bind_as_ptr) {
|
1200
|
+
char buf [200];
|
1201
|
+
snprintf (buf, sizeof(buf)-1, "unable to resolve server address: %s", strerror(errno));
|
1202
|
+
throw std::runtime_error (buf);
|
1203
|
+
}
|
1193
1204
|
bind_as = *bind_as_ptr; // copy because name2address points to a static
|
1194
1205
|
|
1195
1206
|
int sd = EmSocket (family, SOCK_STREAM, 0);
|
@@ -1229,7 +1240,7 @@ const uintptr_t EventMachine_t::ConnectToServer (const char *bind_addr, int bind
|
|
1229
1240
|
|
1230
1241
|
#ifdef OS_UNIX
|
1231
1242
|
//if (connect (sd, (sockaddr*)&pin, sizeof pin) == 0) {
|
1232
|
-
if (connect (sd, &bind_as, bind_size) == 0) {
|
1243
|
+
if (connect (sd, (struct sockaddr*)&bind_as, bind_size) == 0) {
|
1233
1244
|
// This is a connect success, which Linux appears
|
1234
1245
|
// never to give when the socket is nonblocking,
|
1235
1246
|
// even if the connection is intramachine or to
|
@@ -1420,8 +1431,13 @@ EventMachine_t::AttachFD
|
|
1420
1431
|
const uintptr_t EventMachine_t::AttachFD (int fd, bool watch_mode)
|
1421
1432
|
{
|
1422
1433
|
#ifdef OS_UNIX
|
1423
|
-
if (fcntl(fd, F_GETFL, 0) < 0)
|
1424
|
-
|
1434
|
+
if (fcntl(fd, F_GETFL, 0) < 0) {
|
1435
|
+
if (errno) {
|
1436
|
+
throw std::runtime_error (strerror(errno));
|
1437
|
+
} else {
|
1438
|
+
throw std::runtime_error ("invalid file descriptor");
|
1439
|
+
}
|
1440
|
+
}
|
1425
1441
|
#endif
|
1426
1442
|
|
1427
1443
|
#ifdef OS_WIN32
|
data/ext/em.h
CHANGED
@@ -93,6 +93,19 @@ typedef fd_set rb_fdset_t;
|
|
93
93
|
rb_thread_select(fd_check((n)-1) ? (n) : FD_SETSIZE, (rfds), (wfds), (efds), (timeout))
|
94
94
|
#endif
|
95
95
|
|
96
|
+
|
97
|
+
// This Solaris fix is adapted from eval_intern.h in Ruby 1.9.3:
|
98
|
+
// Solaris sys/select.h switches select to select_large_fdset to support larger
|
99
|
+
// file descriptors if FD_SETSIZE is larger than 1024 on 32bit environment.
|
100
|
+
// But Ruby doesn't change FD_SETSIZE because fd_set is allocated dynamically.
|
101
|
+
// So following definition is required to use select_large_fdset.
|
102
|
+
#ifdef HAVE_SELECT_LARGE_FDSET
|
103
|
+
#define select(n, r, w, e, t) select_large_fdset((n), (r), (w), (e), (t))
|
104
|
+
extern "C" {
|
105
|
+
int select_large_fdset(int, fd_set *, fd_set *, fd_set *, struct timeval *);
|
106
|
+
}
|
107
|
+
#endif
|
108
|
+
|
96
109
|
class EventableDescriptor;
|
97
110
|
class InotifyDescriptor;
|
98
111
|
struct SelectData_t;
|
data/ext/extconf.rb
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
require 'fileutils'
|
2
2
|
require 'mkmf'
|
3
3
|
|
4
|
+
# Eager check devs tools
|
5
|
+
have_devel? if respond_to?(:have_devel?)
|
6
|
+
|
4
7
|
def check_libs libs = [], fatal = false
|
5
8
|
libs.all? { |lib| have_library(lib) || (abort("could not find library: #{lib}") if fatal) }
|
6
9
|
end
|
@@ -22,34 +25,58 @@ def append_library(libs, lib)
|
|
22
25
|
libs + " " + format(LIBARG, lib)
|
23
26
|
end
|
24
27
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
28
|
+
SSL_HEADS = %w(openssl/ssl.h openssl/err.h)
|
29
|
+
SSL_LIBS = case RUBY_PLATFORM
|
30
|
+
when /mswin|mingw|bccwin/ ; %w(ssleay32 libeay32)
|
31
|
+
else ; %w(crypto ssl)
|
32
|
+
end
|
30
33
|
|
31
|
-
|
32
|
-
|
34
|
+
def dir_config_wrapper(pretty_name, name, idefault=nil, ldefault=nil)
|
35
|
+
inc, lib = dir_config(name, idefault, ldefault)
|
36
|
+
if inc && lib
|
37
|
+
# TODO: Remove when 2.0.0 is the minimum supported version
|
38
|
+
# Ruby versions not incorporating the mkmf fix at
|
39
|
+
# https://bugs.ruby-lang.org/projects/ruby-trunk/repository/revisions/39717
|
40
|
+
# do not properly search for lib directories, and must be corrected
|
41
|
+
unless lib && lib[-3, 3] == 'lib'
|
42
|
+
@libdir_basename = 'lib'
|
43
|
+
inc, lib = dir_config(name, idefault, ldefault)
|
44
|
+
end
|
45
|
+
unless idefault && ldefault
|
46
|
+
abort "-----\nCannot find #{pretty_name} include path #{inc}\n-----" unless inc && inc.split(File::PATH_SEPARATOR).any? { |dir| File.directory?(dir) }
|
47
|
+
abort "-----\nCannot find #{pretty_name} library path #{lib}\n-----" unless lib && lib.split(File::PATH_SEPARATOR).any? { |dir| File.directory?(dir) }
|
48
|
+
warn "-----\nUsing #{pretty_name} in path #{File.dirname inc}\n-----"
|
49
|
+
end
|
50
|
+
true
|
51
|
+
end
|
52
|
+
end
|
33
53
|
|
34
|
-
|
35
|
-
|
36
|
-
|
54
|
+
def dir_config_search(pretty_name, name, paths, &b)
|
55
|
+
paths.each do |p|
|
56
|
+
if dir_config_wrapper('OpenSSL', 'ssl', p + '/include', p + '/lib') && yield
|
57
|
+
warn "-----\nFound #{pretty_name} in path #{p}\n-----"
|
58
|
+
return true
|
59
|
+
end
|
37
60
|
end
|
38
|
-
dir_config(*dc_flags)
|
39
|
-
check_libs(libs) and check_heads(heads)
|
40
61
|
end
|
41
62
|
|
42
|
-
|
43
|
-
|
63
|
+
def pkg_config_wrapper(pretty_name, name)
|
64
|
+
cflags, ldflags, libs = pkg_config(name)
|
65
|
+
unless [cflags, ldflags, libs].any?(&:nil?) || [cflags, ldflags, libs].any?(&:empty?)
|
66
|
+
warn "-----\nUsing #{pretty_name} from pkg-config #{cflags} && #{ldflags} && #{libs}\n-----"
|
67
|
+
true
|
68
|
+
end
|
69
|
+
end
|
44
70
|
|
45
71
|
if ENV['CROSS_COMPILING']
|
46
|
-
openssl_version = ENV.fetch("OPENSSL_VERSION", "1.0.
|
72
|
+
openssl_version = ENV.fetch("OPENSSL_VERSION", "1.0.2e")
|
47
73
|
openssl_dir = File.expand_path("~/.rake-compiler/builds/openssl-#{openssl_version}/")
|
48
74
|
if File.exist?(openssl_dir)
|
49
75
|
FileUtils.mkdir_p Dir.pwd+"/openssl/"
|
50
76
|
FileUtils.cp Dir[openssl_dir+"/include/openssl/*.h"], Dir.pwd+"/openssl/", :verbose => true
|
51
77
|
FileUtils.cp Dir[openssl_dir+"/lib*.a"], Dir.pwd, :verbose => true
|
52
78
|
$INCFLAGS << " -I#{Dir.pwd}" # for the openssl headers
|
79
|
+
add_define "WITH_SSL"
|
53
80
|
else
|
54
81
|
STDERR.puts
|
55
82
|
STDERR.puts "**************************************************************************************"
|
@@ -58,13 +85,20 @@ if ENV['CROSS_COMPILING']
|
|
58
85
|
STDERR.puts "**************************************************************************************"
|
59
86
|
STDERR.puts
|
60
87
|
end
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
88
|
+
elsif dir_config_wrapper('OpenSSL', 'ssl')
|
89
|
+
# If the user has provided a --with-ssl-dir argument, we must respect it or fail.
|
90
|
+
add_define 'WITH_SSL' if check_libs(SSL_LIBS) && check_heads(SSL_HEADS)
|
91
|
+
elsif pkg_config_wrapper('OpenSSL', 'openssl')
|
92
|
+
# If we can detect OpenSSL by pkg-config, use it as the next-best option
|
93
|
+
add_define 'WITH_SSL' if check_libs(SSL_LIBS) && check_heads(SSL_HEADS)
|
94
|
+
elsif check_libs(SSL_LIBS) && check_heads(SSL_HEADS)
|
95
|
+
# If we don't even need any options to find a usable OpenSSL, go with it
|
96
|
+
add_define 'WITH_SSL'
|
97
|
+
elsif dir_config_search('OpenSSL', 'ssl', ['/usr/local', '/opt/local', '/usr/local/opt/openssl']) do
|
98
|
+
check_libs(SSL_LIBS) && check_heads(SSL_HEADS)
|
99
|
+
end
|
100
|
+
# Finally, look for OpenSSL in alternate locations including MacPorts and HomeBrew
|
101
|
+
add_define 'WITH_SSL'
|
68
102
|
end
|
69
103
|
|
70
104
|
add_define 'BUILD_FOR_RUBY'
|
@@ -125,13 +159,21 @@ when /solaris/
|
|
125
159
|
add_define 'OS_SOLARIS8'
|
126
160
|
check_libs(%w[nsl socket], true)
|
127
161
|
|
128
|
-
|
162
|
+
# If Ruby was compiled for 32-bits, then select() can only handle 1024 fds
|
163
|
+
# There is an alternate function, select_large_fdset, that supports more.
|
164
|
+
add_define 'HAVE_SELECT_LARGE_FDSET' if have_func('select_large_fdset', 'sys/select.h')
|
165
|
+
|
166
|
+
if CONFIG['CC'] == 'cc' && (
|
167
|
+
`cc -flags 2>&1` =~ /Sun/ || # detect SUNWspro compiler
|
168
|
+
`cc -V 2>&1` =~ /Sun/ # detect Solaris Studio compiler
|
169
|
+
)
|
129
170
|
# SUN CHAIN
|
130
171
|
add_define 'CC_SUNWspro'
|
131
172
|
$preload = ["\nCXX = CC"] # hack a CXX= line into the makefile
|
132
173
|
$CFLAGS = CONFIG['CFLAGS'] = "-KPIC"
|
133
174
|
CONFIG['CCDLFLAGS'] = "-KPIC"
|
134
175
|
CONFIG['LDSHARED'] = "$(CXX) -G -KPIC -lCstd"
|
176
|
+
CONFIG['LDSHAREDXX'] = "$(CXX) -G -KPIC -lCstd"
|
135
177
|
else
|
136
178
|
# GNU CHAIN
|
137
179
|
# on Unix we need a g++ link, not gcc.
|
@@ -175,37 +217,39 @@ else
|
|
175
217
|
CONFIG['LDSHARED'] = "$(CXX) -shared"
|
176
218
|
end
|
177
219
|
|
220
|
+
# Platform-specific time functions
|
221
|
+
if have_func('clock_gettime')
|
222
|
+
# clock_gettime is POSIX, but the monotonic clocks are not
|
223
|
+
have_const('CLOCK_MONOTONIC_RAW', 'time.h') # Linux
|
224
|
+
have_const('CLOCK_MONOTONIC', 'time.h') # Linux, Solaris, BSDs
|
225
|
+
else
|
226
|
+
have_func('gethrtime') # Older Solaris and HP-UX
|
227
|
+
end
|
228
|
+
|
229
|
+
# Hack so that try_link will test with a C++ compiler instead of a C compiler
|
230
|
+
TRY_LINK.sub!('$(CC)', '$(CXX)')
|
231
|
+
|
178
232
|
# This is our wishlist. We use whichever flags work on the host.
|
179
233
|
# In the future, add -Werror to make sure all warnings are resolved.
|
180
234
|
# deprecated-declarations are used in OS X OpenSSL
|
181
235
|
# ignored-qualifiers are used by the Bindings (would-be void *)
|
182
236
|
# unused-result because GCC 4.6 no longer silences (void) ignore_this(function)
|
237
|
+
# address because on Windows, rb_fd_select checks if &fds is non-NULL, which it cannot be
|
183
238
|
%w(
|
184
239
|
-Wall
|
185
240
|
-Wextra
|
186
241
|
-Wno-deprecated-declarations
|
187
242
|
-Wno-ignored-qualifiers
|
188
243
|
-Wno-unused-result
|
244
|
+
-Wno-address
|
189
245
|
).select do |flag|
|
190
246
|
try_link('int main() {return 0;}', flag)
|
191
247
|
end.each do |flag|
|
192
|
-
|
193
|
-
$CPPFLAGS << ' ' << flag
|
194
|
-
end
|
195
|
-
puts "CFLAGS=#{$CFLAGS}"
|
196
|
-
puts "CPPFLAGS=#{$CPPFLAGS}"
|
197
|
-
|
198
|
-
# Platform-specific time functions
|
199
|
-
if have_func('clock_gettime')
|
200
|
-
# clock_gettime is POSIX, but the monotonic clocks are not
|
201
|
-
have_const('CLOCK_MONOTONIC_RAW', 'time.h') # Linux
|
202
|
-
have_const('CLOCK_MONOTONIC', 'time.h') # Linux, Solaris, BSDs
|
203
|
-
else
|
204
|
-
have_func('gethrtime') # Older Solaris and HP-UX
|
248
|
+
CONFIG['CXXFLAGS'] << ' ' << flag
|
205
249
|
end
|
250
|
+
puts "CXXFLAGS=#{CONFIG['CXXFLAGS']}"
|
206
251
|
|
207
|
-
#
|
208
|
-
TRY_LINK.sub!('$(CC)', '$(CXX)')
|
252
|
+
# Solaris C++ compiler doesn't have make_pair()
|
209
253
|
add_define 'HAVE_MAKE_PAIR' if try_link(<<SRC, '-lstdc++')
|
210
254
|
#include <utility>
|
211
255
|
using namespace std;
|
@@ -56,13 +56,17 @@ when /solaris/
|
|
56
56
|
add_define 'OS_SOLARIS8'
|
57
57
|
check_libs(%w[nsl socket], true)
|
58
58
|
|
59
|
-
if CONFIG['CC'] == 'cc'
|
59
|
+
if CONFIG['CC'] == 'cc' && (
|
60
|
+
`cc -flags 2>&1` =~ /Sun/ || # detect SUNWspro compiler
|
61
|
+
`cc -V 2>&1` =~ /Sun/ # detect Solaris Studio compiler
|
62
|
+
)
|
60
63
|
# SUN CHAIN
|
61
64
|
add_define 'CC_SUNWspro'
|
62
65
|
$preload = ["\nCXX = CC"] # hack a CXX= line into the makefile
|
63
66
|
$CFLAGS = CONFIG['CFLAGS'] = "-KPIC"
|
64
67
|
CONFIG['CCDLFLAGS'] = "-KPIC"
|
65
68
|
CONFIG['LDSHARED'] = "$(CXX) -G -KPIC -lCstd"
|
69
|
+
CONFIG['LDSHAREDXX'] = "$(CXX) -G -KPIC -lCstd"
|
66
70
|
else
|
67
71
|
# GNU CHAIN
|
68
72
|
# on Unix we need a g++ link, not gcc.
|
@@ -89,6 +89,8 @@ void Mapper_t::Close()
|
|
89
89
|
// Calls to GetChunk are invalid after a call to Close.
|
90
90
|
if (MapPoint) {
|
91
91
|
#ifdef CC_SUNWspro
|
92
|
+
// TODO: The void * cast works fine on Solaris 11, but
|
93
|
+
// I don't know at what point that changed from older Solaris.
|
92
94
|
munmap ((char*)MapPoint, FileSize);
|
93
95
|
#else
|
94
96
|
munmap ((void*)MapPoint, FileSize);
|
data/ext/pipe.cpp
CHANGED
@@ -229,6 +229,11 @@ void PipeDescriptor::Write()
|
|
229
229
|
|
230
230
|
assert (GetSocket() != INVALID_SOCKET);
|
231
231
|
int bytes_written = write (GetSocket(), output_buffer, nbytes);
|
232
|
+
#ifdef OS_WIN32
|
233
|
+
int e = WSAGetLastError();
|
234
|
+
#else
|
235
|
+
int e = errno;
|
236
|
+
#endif
|
232
237
|
|
233
238
|
if (bytes_written > 0) {
|
234
239
|
OutboundDataSize -= bytes_written;
|
@@ -251,10 +256,10 @@ void PipeDescriptor::Write()
|
|
251
256
|
}
|
252
257
|
else {
|
253
258
|
#ifdef OS_UNIX
|
254
|
-
if ((
|
259
|
+
if ((e != EINPROGRESS) && (e != EWOULDBLOCK) && (e != EINTR))
|
255
260
|
#endif
|
256
261
|
#ifdef OS_WIN32
|
257
|
-
if ((
|
262
|
+
if ((e != WSAEINPROGRESS) && (e != WSAEWOULDBLOCK))
|
258
263
|
#endif
|
259
264
|
Close();
|
260
265
|
}
|
data/ext/rubymain.cpp
CHANGED
@@ -345,11 +345,11 @@ static VALUE t_set_tls_parms (VALUE self UNUSED, VALUE signature, VALUE privkeyf
|
|
345
345
|
t_get_peer_cert
|
346
346
|
***************/
|
347
347
|
|
348
|
+
#ifdef WITH_SSL
|
348
349
|
static VALUE t_get_peer_cert (VALUE self UNUSED, VALUE signature)
|
349
350
|
{
|
350
351
|
VALUE ret = Qnil;
|
351
352
|
|
352
|
-
#ifdef WITH_SSL
|
353
353
|
X509 *cert = NULL;
|
354
354
|
BUF_MEM *buf;
|
355
355
|
BIO *out;
|
@@ -364,10 +364,15 @@ static VALUE t_get_peer_cert (VALUE self UNUSED, VALUE signature)
|
|
364
364
|
X509_free(cert);
|
365
365
|
BIO_free(out);
|
366
366
|
}
|
367
|
-
#endif
|
368
367
|
|
369
368
|
return ret;
|
370
369
|
}
|
370
|
+
#else
|
371
|
+
static VALUE t_get_peer_cert (VALUE self UNUSED, VALUE signature UNUSED)
|
372
|
+
{
|
373
|
+
return Qnil;
|
374
|
+
}
|
375
|
+
#endif
|
371
376
|
|
372
377
|
/**************
|
373
378
|
t_get_peername
|
@@ -982,10 +987,8 @@ t__epoll
|
|
982
987
|
|
983
988
|
static VALUE t__epoll (VALUE self UNUSED)
|
984
989
|
{
|
985
|
-
if (t__epoll_p(self) == Qfalse)
|
986
|
-
rb_warn ("epoll is not supported on this platform");
|
990
|
+
if (t__epoll_p(self) == Qfalse)
|
987
991
|
return Qfalse;
|
988
|
-
}
|
989
992
|
|
990
993
|
evma_set_epoll (1);
|
991
994
|
return Qtrue;
|
@@ -997,8 +1000,8 @@ t__epoll_set
|
|
997
1000
|
|
998
1001
|
static VALUE t__epoll_set (VALUE self, VALUE val)
|
999
1002
|
{
|
1000
|
-
if (t__epoll_p(self) == Qfalse)
|
1001
|
-
|
1003
|
+
if (t__epoll_p(self) == Qfalse && val == Qtrue)
|
1004
|
+
rb_raise (EM_eUnsupported, "%s", "epoll is not supported on this platform");
|
1002
1005
|
|
1003
1006
|
evma_set_epoll (val == Qtrue ? 1 : 0);
|
1004
1007
|
return val;
|
@@ -1024,10 +1027,8 @@ t__kqueue
|
|
1024
1027
|
|
1025
1028
|
static VALUE t__kqueue (VALUE self UNUSED)
|
1026
1029
|
{
|
1027
|
-
if (t__kqueue_p(self) == Qfalse)
|
1028
|
-
rb_warn ("kqueue is not supported on this platform");
|
1030
|
+
if (t__kqueue_p(self) == Qfalse)
|
1029
1031
|
return Qfalse;
|
1030
|
-
}
|
1031
1032
|
|
1032
1033
|
evma_set_kqueue (1);
|
1033
1034
|
return Qtrue;
|
@@ -1039,8 +1040,8 @@ t__kqueue_set
|
|
1039
1040
|
|
1040
1041
|
static VALUE t__kqueue_set (VALUE self, VALUE val)
|
1041
1042
|
{
|
1042
|
-
if (t__kqueue_p(self) == Qfalse)
|
1043
|
-
|
1043
|
+
if (t__kqueue_p(self) == Qfalse && val == Qtrue)
|
1044
|
+
rb_raise (EM_eUnsupported, "%s", "kqueue is not supported on this platform");
|
1044
1045
|
|
1045
1046
|
evma_set_kqueue (val == Qtrue ? 1 : 0);
|
1046
1047
|
return val;
|
data/ext/ssl.cpp
CHANGED
@@ -296,7 +296,7 @@ int SslBox_t::GetPlaintext (char *buf, int bufsize)
|
|
296
296
|
{
|
297
297
|
if (!SSL_is_init_finished (pSSL)) {
|
298
298
|
int e = bIsServer ? SSL_accept (pSSL) : SSL_connect (pSSL);
|
299
|
-
if (e
|
299
|
+
if (e != 1) {
|
300
300
|
int er = SSL_get_error (pSSL, e);
|
301
301
|
if (er != SSL_ERROR_WANT_READ) {
|
302
302
|
// Return -1 for a nonfatal error, -2 for an error that should force the connection down.
|
@@ -312,7 +312,7 @@ int SslBox_t::GetPlaintext (char *buf, int bufsize)
|
|
312
312
|
if (!SSL_is_init_finished (pSSL)) {
|
313
313
|
// We can get here if a browser abandons a handshake.
|
314
314
|
// The user can see a warning dialog and abort the connection.
|
315
|
-
cerr << "<SSL_incomp>";
|
315
|
+
//cerr << "<SSL_incomp>";
|
316
316
|
return 0;
|
317
317
|
}
|
318
318
|
|
data/lib/em/version.rb
CHANGED
data/lib/eventmachine.rb
CHANGED
@@ -754,7 +754,12 @@ module EventMachine
|
|
754
754
|
end
|
755
755
|
|
756
756
|
if io.respond_to?(:fileno)
|
757
|
-
|
757
|
+
# getDescriptorByFileno deprecated in JRuby 1.7.x, removed in JRuby 9000
|
758
|
+
if defined?(JRuby) && JRuby.runtime.respond_to?(:getDescriptorByFileno)
|
759
|
+
fd = JRuby.runtime.getDescriptorByFileno(io.fileno).getChannel
|
760
|
+
else
|
761
|
+
fd = io.fileno
|
762
|
+
end
|
758
763
|
else
|
759
764
|
fd = io
|
760
765
|
end
|
data/tests/em_test_helper.rb
CHANGED
@@ -41,6 +41,10 @@ class Test::Unit::TestCase
|
|
41
41
|
RbConfig::CONFIG['host_os'] =~ /mswin|mingw/
|
42
42
|
end
|
43
43
|
|
44
|
+
def solaris?
|
45
|
+
RUBY_PLATFORM =~ /solaris/
|
46
|
+
end
|
47
|
+
|
44
48
|
# http://stackoverflow.com/questions/1342535/how-can-i-tell-if-im-running-from-jruby-vs-ruby/1685970#1685970
|
45
49
|
def jruby?
|
46
50
|
defined? JRUBY_VERSION
|
data/tests/test_file_watch.rb
CHANGED
metadata
CHANGED
@@ -1,58 +1,72 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: eventmachine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Francis Cianfrocca
|
8
8
|
- Aman Gupta
|
9
|
-
autorequire:
|
9
|
+
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2016-01-13 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: test-unit
|
16
|
-
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
18
|
- - ~>
|
19
19
|
- !ruby/object:Gem::Version
|
20
20
|
version: '2.0'
|
21
|
-
|
21
|
+
type: :development
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
22
24
|
requirements:
|
23
25
|
- - ~>
|
24
26
|
- !ruby/object:Gem::Version
|
25
27
|
version: '2.0'
|
26
|
-
prerelease: false
|
27
|
-
type: :development
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: rake-compiler
|
30
|
-
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
31
|
requirements:
|
32
32
|
- - ~>
|
33
33
|
- !ruby/object:Gem::Version
|
34
34
|
version: 0.8.3
|
35
|
-
|
35
|
+
type: :development
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
36
38
|
requirements:
|
37
39
|
- - ~>
|
38
40
|
- !ruby/object:Gem::Version
|
39
41
|
version: 0.8.3
|
40
|
-
prerelease: false
|
41
|
-
type: :development
|
42
42
|
- !ruby/object:Gem::Dependency
|
43
43
|
name: yard
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - '>='
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: 0.8.5.2
|
49
|
+
type: :development
|
50
|
+
prerelease: false
|
44
51
|
version_requirements: !ruby/object:Gem::Requirement
|
45
52
|
requirements:
|
46
53
|
- - '>='
|
47
54
|
- !ruby/object:Gem::Version
|
48
55
|
version: 0.8.5.2
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: bluecloth
|
49
58
|
requirement: !ruby/object:Gem::Requirement
|
50
59
|
requirements:
|
51
60
|
- - '>='
|
52
61
|
- !ruby/object:Gem::Version
|
53
|
-
version: 0
|
54
|
-
prerelease: false
|
62
|
+
version: '0'
|
55
63
|
type: :development
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
56
70
|
description: |-
|
57
71
|
EventMachine implements a fast, single-threaded engine for arbitrary network
|
58
72
|
communications. It's extremely easy to use in Ruby. EventMachine wraps all
|
@@ -261,7 +275,7 @@ licenses:
|
|
261
275
|
- Ruby
|
262
276
|
- GPL
|
263
277
|
metadata: {}
|
264
|
-
post_install_message:
|
278
|
+
post_install_message:
|
265
279
|
rdoc_options:
|
266
280
|
- --title
|
267
281
|
- EventMachine
|
@@ -285,8 +299,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
285
299
|
version: '0'
|
286
300
|
requirements: []
|
287
301
|
rubyforge_project: eventmachine
|
288
|
-
rubygems_version: 2.
|
289
|
-
signing_key:
|
302
|
+
rubygems_version: 2.0.14
|
303
|
+
signing_key:
|
290
304
|
specification_version: 4
|
291
305
|
summary: Ruby/EventMachine library
|
292
306
|
test_files: []
|