eventmachine 0.12.4 → 0.12.6
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.
- data/.gitignore +13 -0
- data/Rakefile +66 -3
- data/docs/ChangeLog +38 -10
- data/eventmachine.gemspec +32 -0
- data/ext/cmain.cpp +45 -3
- data/ext/cplusplus.cpp +21 -0
- data/ext/ed.cpp +34 -1
- data/ext/ed.h +12 -0
- data/ext/em.cpp +23 -3
- data/ext/em.h +6 -2
- data/ext/eventmachine.h +9 -1
- data/ext/eventmachine_cpp.h +1 -0
- data/ext/extconf.rb +8 -29
- data/ext/fastfilereader/extconf.rb +50 -134
- data/ext/fastfilereader/mapper.cpp +12 -0
- data/ext/fastfilereader/mapper.h +1 -1
- data/ext/kb.cpp +0 -286
- data/ext/pipe.cpp +30 -13
- data/ext/rubymain.cpp +127 -12
- data/ext/ssl.cpp +15 -0
- data/ext/ssl.h +4 -0
- data/java/.classpath +8 -0
- data/java/.project +17 -0
- data/lib/em/processes.rb +45 -0
- data/lib/eventmachine.rb +260 -102
- data/lib/eventmachine_version.rb +1 -1
- data/lib/pr_eventmachine.rb +1 -1
- data/lib/protocols/httpcli2.rb +10 -1
- data/lib/protocols/httpclient.rb +2 -2
- data/lib/protocols/memcache.rb +293 -0
- data/lib/protocols/smtpserver.rb +1 -1
- data/setup.rb +1585 -0
- data/tasks/tests.rake +1 -0
- data/tests/test_attach.rb +19 -2
- data/tests/test_basic.rb +2 -2
- data/tests/test_connection_count.rb +45 -0
- data/tests/test_error_handler.rb +35 -0
- data/tests/test_errors.rb +3 -3
- data/tests/test_exc.rb +2 -2
- data/tests/test_handler_check.rb +37 -0
- data/tests/test_httpclient2.rb +1 -1
- data/tests/test_kb.rb +2 -2
- data/tests/test_next_tick.rb +7 -0
- data/tests/test_processes.rb +39 -0
- data/tests/test_pure.rb +2 -2
- data/tests/test_send_file.rb +1 -1
- data/tests/test_ssl_args.rb +3 -3
- data/tests/test_ssl_methods.rb +50 -0
- data/tests/test_timers.rb +3 -1
- data/web/whatis +7 -0
- metadata +88 -84
data/ext/em.cpp
CHANGED
@@ -45,6 +45,15 @@ static int MaxOutstandingTimers = 1000;
|
|
45
45
|
*/
|
46
46
|
static struct sockaddr *name2address (const char *server, int port, int *family, int *bind_size);
|
47
47
|
|
48
|
+
/***************************************
|
49
|
+
STATIC EventMachine_t::GetMaxTimerCount
|
50
|
+
***************************************/
|
51
|
+
|
52
|
+
int EventMachine_t::GetMaxTimerCount()
|
53
|
+
{
|
54
|
+
return MaxOutstandingTimers;
|
55
|
+
}
|
56
|
+
|
48
57
|
|
49
58
|
/***************************************
|
50
59
|
STATIC EventMachine_t::SetMaxTimerCount
|
@@ -77,6 +86,7 @@ EventMachine_t::EventMachine_t (void (*event_callback)(const char*, int, const c
|
|
77
86
|
LoopBreakerWriter (-1),
|
78
87
|
bEpoll (false),
|
79
88
|
bKqueue (false),
|
89
|
+
kqfd (-1),
|
80
90
|
epfd (-1)
|
81
91
|
{
|
82
92
|
// Default time-slice is just smaller than one hundred mills.
|
@@ -923,8 +933,11 @@ const char *EventMachine_t::InstallOneshotTimer (int milliseconds)
|
|
923
933
|
#endif
|
924
934
|
|
925
935
|
Timer_t t;
|
926
|
-
|
927
|
-
|
936
|
+
#ifdef OS_SOLARIS8
|
937
|
+
multimap<Int64,Timer_t>::iterator i = Timers.insert (multimap<Int64,Timer_t>::value_type (fire_at, t));
|
938
|
+
#else
|
939
|
+
multimap<Int64,Timer_t>::iterator i = Timers.insert (make_pair (fire_at, t));
|
940
|
+
#endif
|
928
941
|
return i->second.GetBindingChars();
|
929
942
|
}
|
930
943
|
|
@@ -1227,7 +1240,7 @@ const char *EventMachine_t::AttachFD (int fd, bool notify_readable, bool notify_
|
|
1227
1240
|
if (!cd)
|
1228
1241
|
throw std::runtime_error ("no connection allocated");
|
1229
1242
|
|
1230
|
-
cd->SetConnectPending (
|
1243
|
+
cd->SetConnectPending (false);
|
1231
1244
|
cd->SetNotifyReadable (notify_readable);
|
1232
1245
|
cd->SetNotifyWritable (notify_writable);
|
1233
1246
|
|
@@ -1910,7 +1923,14 @@ const char *EventMachine_t::OpenKeyboard()
|
|
1910
1923
|
}
|
1911
1924
|
|
1912
1925
|
|
1926
|
+
/**********************************
|
1927
|
+
EventMachine_t::GetConnectionCount
|
1928
|
+
**********************************/
|
1913
1929
|
|
1930
|
+
int EventMachine_t::GetConnectionCount ()
|
1931
|
+
{
|
1932
|
+
return Descriptors.size();
|
1933
|
+
}
|
1914
1934
|
|
1915
1935
|
|
1916
1936
|
//#endif // OS_UNIX
|
data/ext/em.h
CHANGED
@@ -42,8 +42,8 @@ See the file COPYING for complete licensing information.
|
|
42
42
|
#endif
|
43
43
|
|
44
44
|
// 1.9.0 compat
|
45
|
-
#ifndef
|
46
|
-
#define
|
45
|
+
#ifndef RUBY_UBF_IO
|
46
|
+
#define RUBY_UBF_IO RB_UBF_DFL
|
47
47
|
#endif
|
48
48
|
#else
|
49
49
|
#define EmSelect select
|
@@ -69,6 +69,7 @@ class EventMachine_t
|
|
69
69
|
class EventMachine_t
|
70
70
|
{
|
71
71
|
public:
|
72
|
+
static int GetMaxTimerCount();
|
72
73
|
static void SetMaxTimerCount (int);
|
73
74
|
|
74
75
|
public:
|
@@ -101,8 +102,11 @@ class EventMachine_t
|
|
101
102
|
static void SetuidString (const char*);
|
102
103
|
static int SetRlimitNofile (int);
|
103
104
|
|
105
|
+
pid_t SubprocessPid;
|
104
106
|
int SubprocessExitStatus;
|
105
107
|
|
108
|
+
int GetConnectionCount();
|
109
|
+
|
106
110
|
// Temporary:
|
107
111
|
void _UseEpoll();
|
108
112
|
void _UseKqueue();
|
data/ext/eventmachine.h
CHANGED
@@ -32,7 +32,8 @@ extern "C" {
|
|
32
32
|
EM_CONNECTION_COMPLETED = 104,
|
33
33
|
EM_LOOPBREAK_SIGNAL = 105,
|
34
34
|
EM_CONNECTION_NOTIFY_READABLE = 106,
|
35
|
-
EM_CONNECTION_NOTIFY_WRITABLE = 107
|
35
|
+
EM_CONNECTION_NOTIFY_WRITABLE = 107,
|
36
|
+
EM_SSL_HANDSHAKE_COMPLETED = 108
|
36
37
|
|
37
38
|
};
|
38
39
|
|
@@ -53,10 +54,16 @@ extern "C" {
|
|
53
54
|
const char *evma_open_keyboard();
|
54
55
|
void evma_set_tls_parms (const char *binding, const char *privatekey_filename, const char *certchain_filenane);
|
55
56
|
void evma_start_tls (const char *binding);
|
57
|
+
|
58
|
+
#ifdef WITH_SSL
|
59
|
+
X509 *evma_get_peer_cert (const char *binding);
|
60
|
+
#endif
|
61
|
+
|
56
62
|
int evma_get_peername (const char *binding, struct sockaddr*);
|
57
63
|
int evma_get_sockname (const char *binding, struct sockaddr*);
|
58
64
|
int evma_get_subprocess_pid (const char *binding, pid_t*);
|
59
65
|
int evma_get_subprocess_status (const char *binding, int*);
|
66
|
+
int evma_get_connection_count();
|
60
67
|
int evma_send_data_to_connection (const char *binding, const char *data, int data_length);
|
61
68
|
int evma_send_datagram (const char *binding, const char *data, int data_length, const char *address, int port);
|
62
69
|
int evma_get_comm_inactivity_timeout (const char *binding, /*out*/int *value);
|
@@ -68,6 +75,7 @@ extern "C" {
|
|
68
75
|
int evma_report_connection_error_status (const char *binding);
|
69
76
|
void evma_signal_loopbreak();
|
70
77
|
void evma_set_timer_quantum (int);
|
78
|
+
int evma_get_max_timer_count();
|
71
79
|
void evma_set_max_timer_count (int);
|
72
80
|
void evma_setuid_string (const char *username);
|
73
81
|
void evma_stop_machine();
|
data/ext/eventmachine_cpp.h
CHANGED
data/ext/extconf.rb
CHANGED
@@ -1,22 +1,4 @@
|
|
1
|
-
|
2
|
-
#
|
3
|
-
#----------------------------------------------------------------------------
|
4
|
-
#
|
5
|
-
# Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved.
|
6
|
-
# Gmail: blackhedd
|
7
|
-
#
|
8
|
-
# This program is free software; you can redistribute it and/or modify
|
9
|
-
# it under the terms of either: 1) the GNU General Public License
|
10
|
-
# as published by the Free Software Foundation; either version 2 of the
|
11
|
-
# License, or (at your option) any later version; or 2) Ruby's License.
|
12
|
-
#
|
13
|
-
# See the file COPYING for complete licensing information.
|
14
|
-
#
|
15
|
-
#---------------------------------------------------------------------------
|
16
|
-
#
|
17
|
-
# extconf.rb for Ruby/EventMachine
|
18
|
-
# We have to munge LDSHARED because this code needs a C++ link.
|
19
|
-
#
|
1
|
+
require 'mkmf'
|
20
2
|
|
21
3
|
def check_libs libs = [], fatal = false
|
22
4
|
libs.all? { |lib| have_library(lib) || (abort("could not find library: #{lib}") if fatal) }
|
@@ -30,8 +12,6 @@ def add_define(name)
|
|
30
12
|
$defs.push("-D#{name}")
|
31
13
|
end
|
32
14
|
|
33
|
-
require 'mkmf'
|
34
|
-
|
35
15
|
add_define 'BUILD_FOR_RUBY'
|
36
16
|
add_define 'HAVE_RBTRAP' if have_var('rb_trap_immediate', ['ruby.h', 'rubysig.h'])
|
37
17
|
add_define "HAVE_TBR" if have_func('rb_thread_blocking_region')# and have_macro('RUBY_UBF_IO', 'ruby.h')
|
@@ -48,8 +28,6 @@ else
|
|
48
28
|
add_define 'OS_UNIX'
|
49
29
|
|
50
30
|
add_define "HAVE_KQUEUE" if have_header("sys/event.h") and have_header("sys/queue.h")
|
51
|
-
|
52
|
-
# check_libs(%w[pthread], true)
|
53
31
|
end
|
54
32
|
|
55
33
|
# Main platform invariances:
|
@@ -71,15 +49,16 @@ when /solaris/
|
|
71
49
|
|
72
50
|
add_define 'OS_SOLARIS8'
|
73
51
|
|
74
|
-
# on Unix we need a g++ link, not gcc.
|
75
|
-
CONFIG['LDSHARED'] = "$(CXX) -shared"
|
76
|
-
|
77
52
|
# Patch by Tim Pease, fixes SUNWspro compile problems.
|
78
53
|
if CONFIG['CC'] == 'cc'
|
79
|
-
|
80
|
-
CONFIG['
|
54
|
+
# SUN CHAIN
|
55
|
+
$CFLAGS = CONFIG['CFLAGS'] = "-KPIC -G"
|
56
|
+
CONFIG['CCDLFLAGS'] = "-KPIC"
|
57
|
+
else
|
58
|
+
# GNU CHAIN
|
59
|
+
# on Unix we need a g++ link, not gcc.
|
60
|
+
CONFIG['LDSHARED'] = "$(CXX) -shared"
|
81
61
|
end
|
82
|
-
|
83
62
|
when /openbsd/
|
84
63
|
# OpenBSD branch contributed by Guillaume Sellier.
|
85
64
|
|
@@ -1,161 +1,77 @@
|
|
1
|
-
# $Id: extconf.rb 4526 2007-07-03 18:04:34Z francis $
|
2
|
-
#
|
3
|
-
#----------------------------------------------------------------------------
|
4
|
-
#
|
5
|
-
# Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved.
|
6
|
-
# Gmail: garbagecat10
|
7
|
-
#
|
8
|
-
# This program is free software; you can redistribute it and/or modify
|
9
|
-
# it under the terms of either: 1) the GNU General Public License
|
10
|
-
# as published by the Free Software Foundation; either version 2 of the
|
11
|
-
# License, or (at your option) any later version; or 2) Ruby's License.
|
12
|
-
#
|
13
|
-
# See the file COPYING for complete licensing information.
|
14
|
-
#
|
15
|
-
#---------------------------------------------------------------------------
|
16
|
-
#
|
17
|
-
# extconf.rb for Fast File Reader
|
18
|
-
# We have to munge LDSHARED because this code needs a C++ link.
|
19
|
-
#
|
20
|
-
|
21
1
|
require 'mkmf'
|
22
2
|
|
23
|
-
|
3
|
+
def check_libs libs = [], fatal = false
|
4
|
+
libs.all? { |lib| have_library(lib) || (abort("could not find library: #{lib}") if fatal) }
|
5
|
+
end
|
24
6
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
7
|
+
def check_heads heads = [], fatal = false
|
8
|
+
heads.all? { |head| have_header(head) || (abort("could not find header: #{head}") if fatal)}
|
9
|
+
end
|
10
|
+
|
11
|
+
def add_define(name)
|
12
|
+
$defs.push("-D#{name}")
|
13
|
+
end
|
14
|
+
|
15
|
+
add_define 'BUILD_FOR_RUBY'
|
16
|
+
|
17
|
+
# Minor platform details between *nix and Windows:
|
34
18
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
19
|
+
if RUBY_PLATFORM =~ /(mswin|mingw|bccwin)/
|
20
|
+
GNU_CHAIN = $1 == 'mingw'
|
21
|
+
OS_WIN32 = true
|
22
|
+
add_define "OS_WIN32"
|
23
|
+
else
|
24
|
+
GNU_CHAIN = true
|
25
|
+
OS_UNIX = true
|
26
|
+
add_define 'OS_UNIX'
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
|
31
|
+
case RUBY_PLATFORM
|
32
|
+
when /mswin32/, /mingw32/, /bccwin32/
|
33
|
+
check_heads(%w[windows.h winsock.h], true)
|
34
|
+
check_libs(%w[kernel32 rpcrt4 gdi32], true)
|
35
|
+
|
36
|
+
if GNU_CHAIN
|
37
|
+
CONFIG['LDSHARED'] = "$(CXX) -shared -lstdc++"
|
46
38
|
else
|
47
|
-
|
39
|
+
$defs.push "-EHs"
|
40
|
+
$defs.push "-GR"
|
48
41
|
end
|
49
42
|
|
50
43
|
when /solaris/
|
51
|
-
|
52
|
-
have_library('nsl') and
|
53
|
-
have_library('socket')
|
54
|
-
exit
|
55
|
-
end
|
44
|
+
check_libs(%w[nsl socket], true)
|
56
45
|
|
57
|
-
|
58
|
-
flags << '-D OS_SOLARIS8'
|
59
|
-
flags << '-D BUILD_FOR_RUBY'
|
46
|
+
add_define 'OS_SOLARIS8'
|
60
47
|
|
61
|
-
|
62
|
-
if
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
flags << '-D WITH_SSL'
|
48
|
+
# Patch by Tim Pease, fixes SUNWspro compile problems.
|
49
|
+
if CONFIG['CC'] == 'cc'
|
50
|
+
# SUN CHAIN
|
51
|
+
$CFLAGS = CONFIG['CFLAGS'] = "-KPIC -G"
|
52
|
+
CONFIG['CCDLFLAGS'] = "-KPIC"
|
67
53
|
else
|
68
|
-
|
54
|
+
# GNU CHAIN
|
55
|
+
# on Unix we need a g++ link, not gcc.
|
56
|
+
CONFIG['LDSHARED'] = "$(CXX) -shared"
|
69
57
|
end
|
58
|
+
when /openbsd/
|
59
|
+
# OpenBSD branch contributed by Guillaume Sellier.
|
70
60
|
|
71
|
-
# on Unix we need a g++ link, not gcc.
|
72
|
-
CONFIG['LDSHARED'] = "$(CXX) -shared"
|
73
|
-
|
61
|
+
# on Unix we need a g++ link, not gcc. On OpenBSD, linking against libstdc++ have to be explicitly done for shared libs
|
62
|
+
CONFIG['LDSHARED'] = "$(CXX) -shared -lstdc++"
|
74
63
|
when /darwin/
|
75
|
-
flags << '-DOS_UNIX'
|
76
|
-
flags << '-DBUILD_FOR_RUBY'
|
77
|
-
|
78
|
-
dir_config('ssl')
|
79
|
-
if have_library('ssl') and
|
80
|
-
have_library('crypto') and
|
81
|
-
have_library('C') and
|
82
|
-
have_header('openssl/ssl.h') and
|
83
|
-
have_header('openssl/err.h')
|
84
|
-
flags << '-DWITH_SSL'
|
85
|
-
else
|
86
|
-
flags << '-DWITHOUT_SSL'
|
87
|
-
end
|
88
64
|
# on Unix we need a g++ link, not gcc.
|
89
65
|
# Ff line contributed by Daniel Harple.
|
90
66
|
CONFIG['LDSHARED'] = "$(CXX) " + CONFIG['LDSHARED'].split[1..-1].join(' ')
|
91
67
|
|
92
68
|
when /linux/
|
93
|
-
unless have_library('pthread')
|
94
|
-
exit
|
95
|
-
end
|
96
69
|
|
97
|
-
flags << '-DOS_UNIX'
|
98
|
-
flags << '-DBUILD_FOR_RUBY'
|
99
|
-
|
100
|
-
# Original epoll test is inadequate because 2.4 kernels have the header
|
101
|
-
# but not the code.
|
102
|
-
#flags << '-DHAVE_EPOLL' if have_header('sys/epoll.h')
|
103
|
-
if have_header('sys/epoll.h')
|
104
|
-
File.open("hasEpollTest.c", "w") {|f|
|
105
|
-
f.puts "#include <sys/epoll.h>"
|
106
|
-
f.puts "int main() { epoll_create(1024); return 0;}"
|
107
|
-
}
|
108
|
-
(e = system( "gcc hasEpollTest.c -o hasEpollTest " )) and (e = $?.to_i)
|
109
|
-
`rm -f hasEpollTest.c hasEpollTest`
|
110
|
-
flags << '-DHAVE_EPOLL' if e == 0
|
111
|
-
end
|
112
|
-
|
113
|
-
dir_config('ssl')
|
114
|
-
if have_library('ssl') and
|
115
|
-
have_library('crypto') and
|
116
|
-
have_header('openssl/ssl.h') and
|
117
|
-
have_header('openssl/err.h')
|
118
|
-
flags << '-DWITH_SSL'
|
119
|
-
else
|
120
|
-
flags << '-DWITHOUT_SSL'
|
121
|
-
end
|
122
70
|
# on Unix we need a g++ link, not gcc.
|
123
71
|
CONFIG['LDSHARED'] = "$(CXX) -shared"
|
124
|
-
|
125
|
-
# Modify the mkmf constant LINK_SO so the generated shared object is stripped.
|
126
|
-
# You might think modifying CONFIG['LINK_SO'] would be a better way to do this,
|
127
|
-
# but it doesn't work because mkmf doesn't look at CONFIG['LINK_SO'] again after
|
128
|
-
# it initializes.
|
129
|
-
linkso = Object.send :remove_const, "LINK_SO"
|
130
|
-
LINK_SO = linkso + "; strip $@"
|
131
|
-
|
132
72
|
else
|
133
|
-
unless have_library('pthread')
|
134
|
-
exit
|
135
|
-
end
|
136
|
-
|
137
|
-
flags << '-DOS_UNIX'
|
138
|
-
flags << '-DBUILD_FOR_RUBY'
|
139
|
-
|
140
|
-
dir_config('ssl')
|
141
|
-
if have_library('ssl') and
|
142
|
-
have_library('crypto') and
|
143
|
-
have_header('openssl/ssl.h') and
|
144
|
-
have_header('openssl/err.h')
|
145
|
-
flags << '-DWITH_SSL'
|
146
|
-
else
|
147
|
-
flags << '-DWITHOUT_SSL'
|
148
|
-
end
|
149
73
|
# on Unix we need a g++ link, not gcc.
|
150
74
|
CONFIG['LDSHARED'] = "$(CXX) -shared"
|
151
|
-
|
152
75
|
end
|
153
76
|
|
154
|
-
|
155
|
-
$CPPFLAGS += ' ' + flags.join(' ')
|
156
|
-
else
|
157
|
-
$CFLAGS += ' ' + flags.join(' ')
|
158
|
-
end
|
159
|
-
|
160
|
-
|
161
|
-
create_makefile "fastfilereaderext"
|
77
|
+
create_makefile "fastfilereaderext"
|
@@ -59,7 +59,11 @@ Mapper_t::Mapper_t (const string &filename)
|
|
59
59
|
throw runtime_error (strerror (errno));
|
60
60
|
FileSize = st.st_size;
|
61
61
|
|
62
|
+
#ifdef OS_WIN32
|
63
|
+
MapPoint = (char*) mmap (0, FileSize, PROT_READ, MAP_SHARED, Fd, 0);
|
64
|
+
#else
|
62
65
|
MapPoint = (const char*) mmap (0, FileSize, PROT_READ, MAP_SHARED, Fd, 0);
|
66
|
+
#endif
|
63
67
|
if (MapPoint == MAP_FAILED)
|
64
68
|
throw runtime_error (strerror (errno));
|
65
69
|
}
|
@@ -84,7 +88,11 @@ void Mapper_t::Close()
|
|
84
88
|
// Can be called multiple times.
|
85
89
|
// Calls to GetChunk are invalid after a call to Close.
|
86
90
|
if (MapPoint) {
|
91
|
+
#ifdef OS_SOLARIS8
|
92
|
+
munmap ((char*)MapPoint, FileSize);
|
93
|
+
#else
|
87
94
|
munmap ((void*)MapPoint, FileSize);
|
95
|
+
#endif
|
88
96
|
MapPoint = NULL;
|
89
97
|
}
|
90
98
|
if (Fd >= 0) {
|
@@ -150,7 +158,11 @@ Mapper_t::Mapper_t (const string &filename)
|
|
150
158
|
if (!hMapping)
|
151
159
|
throw runtime_error ("File not mapped");
|
152
160
|
|
161
|
+
#ifdef OS_WIN32
|
162
|
+
MapPoint = (char*) MapViewOfFile (hMapping, FILE_MAP_WRITE, 0, 0, 0);
|
163
|
+
#else
|
153
164
|
MapPoint = (const char*) MapViewOfFile (hMapping, FILE_MAP_WRITE, 0, 0, 0);
|
165
|
+
#endif
|
154
166
|
if (!MapPoint)
|
155
167
|
throw runtime_error ("Mappoint not read");
|
156
168
|
}
|