eventmachine 0.12.4 → 0.12.6
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
}
|