eventmachine-maglev- 0.12.10 → 1.0.0.beta.4
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +7 -0
- data/.yardopts +7 -0
- data/Gemfile +3 -0
- data/README.md +109 -0
- data/Rakefile +14 -368
- data/docs/DocumentationGuidesIndex.md +27 -0
- data/docs/GettingStarted.md +521 -0
- data/docs/old/DEFERRABLES +246 -0
- data/docs/{KEYBOARD → old/KEYBOARD} +15 -11
- data/docs/old/LIGHTWEIGHT_CONCURRENCY +130 -0
- data/docs/old/SMTP +4 -0
- data/docs/old/SPAWNED_PROCESSES +148 -0
- data/eventmachine.gemspec +20 -26
- data/examples/guides/getting_started/01_eventmachine_echo_server.rb +18 -0
- data/examples/guides/getting_started/02_eventmachine_echo_server_that_recognizes_exit_command.rb +22 -0
- data/examples/guides/getting_started/03_simple_chat_server.rb +149 -0
- data/examples/guides/getting_started/04_simple_chat_server_step_one.rb +27 -0
- data/examples/guides/getting_started/05_simple_chat_server_step_two.rb +43 -0
- data/examples/guides/getting_started/06_simple_chat_server_step_three.rb +98 -0
- data/examples/guides/getting_started/07_simple_chat_server_step_four.rb +121 -0
- data/examples/guides/getting_started/08_simple_chat_server_step_five.rb +141 -0
- data/examples/{ex_channel.rb → old/ex_channel.rb} +3 -3
- data/examples/old/ex_tick_loop_array.rb +15 -0
- data/examples/old/ex_tick_loop_counter.rb +32 -0
- data/ext/binder.cpp +0 -1
- data/ext/cmain.cpp +40 -29
- data/ext/ed.cpp +189 -134
- data/ext/ed.h +34 -40
- data/ext/em.cpp +388 -340
- data/ext/em.h +29 -32
- data/ext/eventmachine.h +7 -6
- data/ext/extconf.rb +57 -48
- data/ext/fastfilereader/extconf.rb +5 -3
- data/ext/fastfilereader/mapper.cpp +1 -1
- data/ext/fastfilereader/rubymain.cpp +0 -1
- data/ext/kb.cpp +1 -3
- data/ext/pipe.cpp +9 -11
- data/ext/project.h +12 -8
- data/ext/rubymain.cpp +158 -112
- data/java/src/com/rubyeventmachine/EmReactor.java +3 -2
- data/lib/em/buftok.rb +35 -63
- data/lib/em/callback.rb +43 -11
- data/lib/em/channel.rb +22 -15
- data/lib/em/completion.rb +303 -0
- data/lib/em/connection.rb +341 -208
- data/lib/em/deferrable/pool.rb +2 -0
- data/lib/em/deferrable.rb +20 -2
- data/lib/em/file_watch.rb +37 -18
- data/lib/em/iterator.rb +270 -0
- data/lib/em/pool.rb +146 -0
- data/lib/em/process_watch.rb +5 -4
- data/lib/em/processes.rb +8 -4
- data/lib/em/protocols/httpclient.rb +27 -11
- data/lib/em/protocols/httpclient2.rb +15 -5
- data/lib/em/protocols/line_protocol.rb +29 -0
- data/lib/em/protocols/memcache.rb +17 -9
- data/lib/em/protocols/object_protocol.rb +2 -1
- data/lib/em/protocols/postgres3.rb +2 -1
- data/lib/em/protocols/smtpclient.rb +19 -11
- data/lib/em/protocols/smtpserver.rb +101 -8
- data/lib/em/protocols/stomp.rb +9 -7
- data/lib/em/protocols/tcptest.rb +3 -2
- data/lib/em/protocols.rb +1 -1
- data/lib/{pr_eventmachine.rb → em/pure_ruby.rb} +188 -205
- data/lib/em/queue.rb +23 -13
- data/lib/em/resolver.rb +192 -0
- data/lib/em/spawnable.rb +9 -10
- data/lib/em/streamer.rb +34 -46
- data/lib/em/threaded_resource.rb +90 -0
- data/lib/em/tick_loop.rb +85 -0
- data/lib/em/timers.rb +8 -3
- data/lib/em/version.rb +1 -1
- data/lib/eventmachine.rb +582 -686
- data/lib/jeventmachine.rb +25 -3
- data/tasks/package.rake +98 -0
- data/tasks/test.rake +8 -0
- data/tests/em_test_helper.rb +64 -0
- data/tests/test_attach.rb +56 -56
- data/tests/test_basic.rb +111 -168
- data/tests/test_channel.rb +5 -6
- data/tests/test_completion.rb +177 -0
- data/tests/test_connection_count.rb +1 -3
- data/tests/test_defer.rb +3 -32
- data/tests/test_deferrable.rb +35 -0
- data/tests/test_epoll.rb +27 -57
- data/tests/test_error_handler.rb +10 -7
- data/tests/test_exc.rb +6 -33
- data/tests/test_file_watch.rb +51 -35
- data/tests/test_futures.rb +10 -38
- data/tests/test_get_sock_opt.rb +27 -20
- data/tests/test_handler_check.rb +1 -3
- data/tests/test_hc.rb +49 -112
- data/tests/test_httpclient.rb +34 -62
- data/tests/test_httpclient2.rb +14 -39
- data/tests/test_inactivity_timeout.rb +44 -40
- data/tests/test_kb.rb +26 -52
- data/tests/test_ltp.rb +27 -71
- data/tests/test_ltp2.rb +1 -30
- data/tests/test_next_tick.rb +2 -31
- data/tests/test_object_protocol.rb +8 -9
- data/tests/test_pause.rb +45 -37
- data/tests/test_pending_connect_timeout.rb +42 -38
- data/tests/test_pool.rb +128 -0
- data/tests/test_process_watch.rb +37 -37
- data/tests/test_processes.rb +92 -110
- data/tests/test_proxy_connection.rb +137 -61
- data/tests/test_pure.rb +30 -67
- data/tests/test_queue.rb +10 -4
- data/tests/test_resolver.rb +55 -0
- data/tests/test_running.rb +1 -29
- data/tests/test_sasl.rb +8 -33
- data/tests/test_send_file.rb +163 -188
- data/tests/test_servers.rb +12 -55
- data/tests/test_shutdown_hooks.rb +23 -0
- data/tests/test_smtpclient.rb +1 -29
- data/tests/test_smtpserver.rb +1 -29
- data/tests/test_spawn.rb +2 -31
- data/tests/test_ssl_args.rb +9 -10
- data/tests/test_ssl_methods.rb +1 -3
- data/tests/test_ssl_verify.rb +63 -63
- data/tests/test_threaded_resource.rb +53 -0
- data/tests/test_tick_loop.rb +59 -0
- data/tests/test_timers.rb +52 -91
- data/tests/test_ud.rb +1 -29
- data/tests/test_unbind_reason.rb +31 -0
- metadata +113 -70
- data/README +0 -82
- data/docs/DEFERRABLES +0 -133
- data/docs/LIGHTWEIGHT_CONCURRENCY +0 -70
- data/docs/SMTP +0 -2
- data/docs/SPAWNED_PROCESSES +0 -89
- data/ext/cplusplus.cpp +0 -202
- data/ext/emwin.cpp +0 -300
- data/ext/emwin.h +0 -94
- data/ext/epoll.cpp +0 -26
- data/ext/epoll.h +0 -25
- data/ext/eventmachine_cpp.h +0 -96
- data/ext/files.cpp +0 -94
- data/ext/files.h +0 -65
- data/ext/sigs.cpp +0 -89
- data/ext/sigs.h +0 -32
- data/java/src/com/rubyeventmachine/application/Application.java +0 -194
- data/java/src/com/rubyeventmachine/application/Connection.java +0 -74
- data/java/src/com/rubyeventmachine/application/ConnectionFactory.java +0 -37
- data/java/src/com/rubyeventmachine/application/DefaultConnectionFactory.java +0 -46
- data/java/src/com/rubyeventmachine/application/PeriodicTimer.java +0 -38
- data/java/src/com/rubyeventmachine/application/Timer.java +0 -54
- data/java/src/com/rubyeventmachine/tests/ApplicationTest.java +0 -109
- data/java/src/com/rubyeventmachine/tests/ConnectTest.java +0 -148
- data/java/src/com/rubyeventmachine/tests/EMTest.java +0 -80
- data/java/src/com/rubyeventmachine/tests/TestDatagrams.java +0 -53
- data/java/src/com/rubyeventmachine/tests/TestServers.java +0 -75
- data/java/src/com/rubyeventmachine/tests/TestTimers.java +0 -90
- data/lib/evma/callback.rb +0 -32
- data/lib/evma/container.rb +0 -75
- data/lib/evma/factory.rb +0 -77
- data/lib/evma/protocol.rb +0 -87
- data/lib/evma/reactor.rb +0 -48
- data/lib/evma.rb +0 -32
- data/setup.rb +0 -1585
- data/tests/test_errors.rb +0 -82
- data/tests/testem.rb +0 -31
- data/web/whatis +0 -7
- /data/{docs/GNU → GNU} +0 -0
- /data/{docs/COPYING → LICENSE} +0 -0
- /data/docs/{ChangeLog → old/ChangeLog} +0 -0
- /data/docs/{EPOLL → old/EPOLL} +0 -0
- /data/docs/{INSTALL → old/INSTALL} +0 -0
- /data/docs/{LEGAL → old/LEGAL} +0 -0
- /data/docs/{PURE_RUBY → old/PURE_RUBY} +0 -0
- /data/docs/{RELEASE_NOTES → old/RELEASE_NOTES} +0 -0
- /data/docs/{TODO → old/TODO} +0 -0
- /data/examples/{ex_queue.rb → old/ex_queue.rb} +0 -0
- /data/examples/{helper.rb → old/helper.rb} +0 -0
data/ext/em.h
CHANGED
@@ -17,21 +17,11 @@ See the file COPYING for complete licensing information.
|
|
17
17
|
|
18
18
|
*****************************************************************************/
|
19
19
|
|
20
|
-
|
21
|
-
|
22
|
-
#ifdef OS_WIN32
|
23
|
-
#include "emwin.h"
|
24
|
-
#endif
|
25
|
-
|
26
|
-
|
27
|
-
// THIS ENTIRE FILE WILL EVENTUALLY BE FOR UNIX BUILDS ONLY.
|
28
|
-
//#ifdef OS_UNIX
|
29
|
-
|
30
20
|
#ifndef __EventMachine__H_
|
31
21
|
#define __EventMachine__H_
|
32
22
|
|
33
|
-
#
|
34
|
-
|
23
|
+
#if defined(BUILD_FOR_RUBY)
|
24
|
+
#include <ruby.h>
|
35
25
|
#endif
|
36
26
|
|
37
27
|
#if defined(BUILD_FOR_RUBY) && !defined(BUILD_FOR_MAGLEV)
|
@@ -60,16 +50,6 @@ See the file COPYING for complete licensing information.
|
|
60
50
|
#define EmSelect select
|
61
51
|
#endif
|
62
52
|
|
63
|
-
|
64
|
-
#ifdef OS_UNIX
|
65
|
-
typedef long long Int64;
|
66
|
-
#endif
|
67
|
-
#ifdef OS_WIN32
|
68
|
-
typedef __int64 Int64;
|
69
|
-
#endif
|
70
|
-
|
71
|
-
extern Int64 gCurrentLoopTime;
|
72
|
-
|
73
53
|
class EventableDescriptor;
|
74
54
|
class InotifyDescriptor;
|
75
55
|
|
@@ -85,7 +65,7 @@ class EventMachine_t
|
|
85
65
|
static void SetMaxTimerCount (int);
|
86
66
|
|
87
67
|
public:
|
88
|
-
EventMachine_t (
|
68
|
+
EventMachine_t (EMCallback);
|
89
69
|
virtual ~EventMachine_t();
|
90
70
|
|
91
71
|
void Run();
|
@@ -98,13 +78,13 @@ class EventMachine_t
|
|
98
78
|
const unsigned long CreateTcpServer (const char *, int);
|
99
79
|
const unsigned long OpenDatagramSocket (const char *, int);
|
100
80
|
const unsigned long CreateUnixDomainServer (const char*);
|
101
|
-
const unsigned long _OpenFileForWriting (const char*);
|
102
81
|
const unsigned long OpenKeyboard();
|
103
82
|
//const char *Popen (const char*, const char*);
|
104
83
|
const unsigned long Socketpair (char* const*);
|
105
84
|
|
106
85
|
void Add (EventableDescriptor*);
|
107
86
|
void Modify (EventableDescriptor*);
|
87
|
+
void Closing (EventableDescriptor*);
|
108
88
|
|
109
89
|
const unsigned long AttachFD (int, bool);
|
110
90
|
int DetachFD (EventableDescriptor*);
|
@@ -140,6 +120,8 @@ class EventMachine_t
|
|
140
120
|
void _HandleKqueuePidEvent (struct kevent*);
|
141
121
|
#endif
|
142
122
|
|
123
|
+
uint64_t GetCurrentLoopTime() { return MyCurrentLoopTime; }
|
124
|
+
|
143
125
|
// Temporary:
|
144
126
|
void _UseEpoll();
|
145
127
|
void _UseKqueue();
|
@@ -147,19 +129,28 @@ class EventMachine_t
|
|
147
129
|
bool UsingKqueue() { return bKqueue; }
|
148
130
|
bool UsingEpoll() { return bEpoll; }
|
149
131
|
|
132
|
+
void QueueHeartbeat(EventableDescriptor*);
|
133
|
+
void ClearHeartbeat(uint64_t, EventableDescriptor*);
|
134
|
+
|
135
|
+
uint64_t GetRealTime();
|
136
|
+
|
150
137
|
private:
|
151
138
|
bool _RunOnce();
|
152
|
-
|
139
|
+
void _RunTimers();
|
153
140
|
void _UpdateTime();
|
154
141
|
void _AddNewDescriptors();
|
155
142
|
void _ModifyDescriptors();
|
156
143
|
void _InitializeLoopBreaker();
|
144
|
+
void _CleanupSockets();
|
157
145
|
|
158
146
|
bool _RunSelectOnce();
|
159
147
|
bool _RunEpollOnce();
|
160
148
|
bool _RunKqueueOnce();
|
161
149
|
|
162
150
|
void _ModifyEpollEvent (EventableDescriptor*);
|
151
|
+
void _DispatchHeartbeats();
|
152
|
+
timeval _TimeTilNextEvent();
|
153
|
+
void _CleanBadDescriptors();
|
163
154
|
|
164
155
|
public:
|
165
156
|
void _ReadLoopBreaker();
|
@@ -171,19 +162,20 @@ class EventMachine_t
|
|
171
162
|
MaxEvents = 4096
|
172
163
|
};
|
173
164
|
int HeartbeatInterval;
|
174
|
-
|
165
|
+
EMCallback EventCallback;
|
175
166
|
|
176
167
|
class Timer_t: public Bindable_t {
|
177
168
|
};
|
178
169
|
|
179
|
-
multimap<
|
170
|
+
multimap<uint64_t, Timer_t> Timers;
|
171
|
+
multimap<uint64_t, EventableDescriptor*> Heartbeats;
|
180
172
|
map<int, Bindable_t*> Files;
|
181
173
|
map<int, Bindable_t*> Pids;
|
182
174
|
vector<EventableDescriptor*> Descriptors;
|
183
175
|
vector<EventableDescriptor*> NewDescriptors;
|
184
176
|
set<EventableDescriptor*> ModifiedDescriptors;
|
185
177
|
|
186
|
-
|
178
|
+
uint64_t NextHeartbeatTime;
|
187
179
|
|
188
180
|
int LoopBreakerReader;
|
189
181
|
int LoopBreakerWriter;
|
@@ -193,7 +185,16 @@ class EventMachine_t
|
|
193
185
|
|
194
186
|
timeval Quantum;
|
195
187
|
|
188
|
+
uint64_t MyCurrentLoopTime;
|
189
|
+
|
190
|
+
#ifdef OS_WIN32
|
191
|
+
unsigned TickCountTickover;
|
192
|
+
unsigned LastTickCount;
|
193
|
+
#endif
|
194
|
+
|
196
195
|
private:
|
196
|
+
bool bTerminateSignalReceived;
|
197
|
+
|
197
198
|
bool bEpoll;
|
198
199
|
int epfd; // Epoll file-descriptor
|
199
200
|
#ifdef HAVE_EPOLL
|
@@ -228,8 +229,4 @@ struct SelectData_t
|
|
228
229
|
int nSockets;
|
229
230
|
};
|
230
231
|
|
231
|
-
|
232
|
-
|
233
232
|
#endif // __EventMachine__H_
|
234
|
-
|
235
|
-
//#endif // OS_UNIX
|
data/ext/eventmachine.h
CHANGED
@@ -35,11 +35,12 @@ extern "C" {
|
|
35
35
|
EM_CONNECTION_NOTIFY_WRITABLE = 107,
|
36
36
|
EM_SSL_HANDSHAKE_COMPLETED = 108,
|
37
37
|
EM_SSL_VERIFY = 109,
|
38
|
-
EM_PROXY_TARGET_UNBOUND = 110
|
38
|
+
EM_PROXY_TARGET_UNBOUND = 110,
|
39
|
+
EM_PROXY_COMPLETED = 111
|
39
40
|
|
40
41
|
};
|
41
42
|
|
42
|
-
void evma_initialize_library (
|
43
|
+
void evma_initialize_library (EMCallback);
|
43
44
|
void evma_run_machine();
|
44
45
|
void evma_release_library();
|
45
46
|
const unsigned long evma_install_oneshot_timer (int seconds);
|
@@ -71,8 +72,8 @@ extern "C" {
|
|
71
72
|
void evma_accept_ssl_peer (const unsigned long binding);
|
72
73
|
#endif
|
73
74
|
|
74
|
-
int evma_get_peername (const unsigned long binding, struct sockaddr*);
|
75
|
-
int evma_get_sockname (const unsigned long binding, struct sockaddr*);
|
75
|
+
int evma_get_peername (const unsigned long binding, struct sockaddr*, socklen_t*);
|
76
|
+
int evma_get_sockname (const unsigned long binding, struct sockaddr*, socklen_t*);
|
76
77
|
int evma_get_subprocess_pid (const unsigned long binding, pid_t*);
|
77
78
|
int evma_get_subprocess_status (const unsigned long binding, int*);
|
78
79
|
int evma_get_connection_count();
|
@@ -96,7 +97,6 @@ extern "C" {
|
|
96
97
|
float evma_get_heartbeat_interval();
|
97
98
|
int evma_set_heartbeat_interval(float);
|
98
99
|
|
99
|
-
const unsigned long evma__write_file (const char *filename);
|
100
100
|
const unsigned long evma_popen (char * const*cmd_strings);
|
101
101
|
|
102
102
|
const unsigned long evma_watch_filename (const char *fname);
|
@@ -105,7 +105,7 @@ extern "C" {
|
|
105
105
|
const unsigned long evma_watch_pid (int);
|
106
106
|
void evma_unwatch_pid (const unsigned long);
|
107
107
|
|
108
|
-
void evma_start_proxy(const unsigned long, const unsigned long, const unsigned long);
|
108
|
+
void evma_start_proxy(const unsigned long, const unsigned long, const unsigned long, const unsigned long);
|
109
109
|
void evma_stop_proxy(const unsigned long);
|
110
110
|
|
111
111
|
int evma_set_rlimit_nofile (int n_files);
|
@@ -113,6 +113,7 @@ extern "C" {
|
|
113
113
|
void evma_set_epoll (int use);
|
114
114
|
void evma_set_kqueue (int use);
|
115
115
|
|
116
|
+
uint64_t evma_get_current_loop_time();
|
116
117
|
#if __cplusplus
|
117
118
|
}
|
118
119
|
#endif
|
data/ext/extconf.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'fileutils'
|
1
2
|
require 'mkmf'
|
2
3
|
|
3
4
|
def check_libs libs = [], fatal = false
|
@@ -12,12 +13,63 @@ def add_define(name)
|
|
12
13
|
$defs.push("-D#{name}")
|
13
14
|
end
|
14
15
|
|
16
|
+
##
|
17
|
+
# OpenSSL:
|
18
|
+
|
19
|
+
# override append_library, so it actually appends (instead of prepending)
|
20
|
+
# this fixes issues with linking ssl, since libcrypto depends on symbols in libssl
|
21
|
+
def append_library(libs, lib)
|
22
|
+
libs + " " + format(LIBARG, lib)
|
23
|
+
end
|
24
|
+
|
25
|
+
def manual_ssl_config
|
26
|
+
ssl_libs_heads_args = {
|
27
|
+
:unix => [%w[ssl crypto], %w[openssl/ssl.h openssl/err.h]],
|
28
|
+
:mswin => [%w[ssleay32 libeay32], %w[openssl/ssl.h openssl/err.h]],
|
29
|
+
}
|
30
|
+
|
31
|
+
dc_flags = ['ssl']
|
32
|
+
dc_flags += ["#{ENV['OPENSSL']}/include", ENV['OPENSSL']] if /linux/ =~ RUBY_PLATFORM and ENV['OPENSSL']
|
33
|
+
|
34
|
+
libs, heads = case RUBY_PLATFORM
|
35
|
+
when /mswin/ ; ssl_libs_heads_args[:mswin]
|
36
|
+
else ssl_libs_heads_args[:unix]
|
37
|
+
end
|
38
|
+
dir_config(*dc_flags)
|
39
|
+
check_libs(libs) and check_heads(heads)
|
40
|
+
end
|
41
|
+
|
42
|
+
if ENV['CROSS_COMPILING']
|
43
|
+
openssl_dir = File.expand_path("~/.rake-compiler/builds/openssl-1.0.0a/")
|
44
|
+
if File.exists?(openssl_dir)
|
45
|
+
FileUtils.mkdir_p Dir.pwd+"/openssl/"
|
46
|
+
FileUtils.cp Dir[openssl_dir+"/include/openssl/*.h"], Dir.pwd+"/openssl/", :verbose => true
|
47
|
+
FileUtils.cp Dir[openssl_dir+"/lib*.a"], Dir.pwd, :verbose => true
|
48
|
+
$INCFLAGS << " -I#{Dir.pwd}" # for the openssl headers
|
49
|
+
else
|
50
|
+
STDERR.puts
|
51
|
+
STDERR.puts "**************************************************************************************"
|
52
|
+
STDERR.puts "**** Cross-compiled OpenSSL not found"
|
53
|
+
STDERR.puts "**** Run: hg clone http://bitbucket.org/ged/ruby-pg && cd ruby-pg && rake openssl_libs"
|
54
|
+
STDERR.puts "**************************************************************************************"
|
55
|
+
STDERR.puts
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
# Try to use pkg_config first, fixes #73
|
60
|
+
if pkg_config('openssl') || manual_ssl_config
|
61
|
+
add_define "WITH_SSL"
|
62
|
+
else
|
63
|
+
add_define "WITHOUT_SSL"
|
64
|
+
end
|
65
|
+
|
15
66
|
add_define 'BUILD_FOR_RUBY'
|
16
67
|
add_define 'HAVE_RBTRAP' if have_var('rb_trap_immediate', ['ruby.h', 'rubysig.h'])
|
17
68
|
add_define "HAVE_TBR" if have_func('rb_thread_blocking_region')# and have_macro('RUBY_UBF_IO', 'ruby.h')
|
18
69
|
add_define "HAVE_INOTIFY" if inotify = have_func('inotify_init', 'sys/inotify.h')
|
19
70
|
add_define "HAVE_OLD_INOTIFY" if !inotify && have_macro('__NR_inotify_init', 'sys/syscall.h')
|
20
71
|
add_define 'HAVE_WRITEV' if have_func('writev', 'sys/uio.h')
|
72
|
+
|
21
73
|
have_func('rb_thread_check_ints')
|
22
74
|
have_func('rb_time_new')
|
23
75
|
|
@@ -57,11 +109,13 @@ when /solaris/
|
|
57
109
|
add_define 'OS_SOLARIS8'
|
58
110
|
check_libs(%w[nsl socket], true)
|
59
111
|
|
60
|
-
|
61
|
-
if CONFIG['CC'] == 'cc'
|
112
|
+
if CONFIG['CC'] == 'cc' and `cc -flags 2>&1` =~ /Sun/ # detect SUNWspro compiler
|
62
113
|
# SUN CHAIN
|
63
|
-
|
114
|
+
add_define 'CC_SUNWspro'
|
115
|
+
$preload = ["\nCXX = CC"] # hack a CXX= line into the makefile
|
116
|
+
$CFLAGS = CONFIG['CFLAGS'] = "-KPIC"
|
64
117
|
CONFIG['CCDLFLAGS'] = "-KPIC"
|
118
|
+
CONFIG['LDSHARED'] = "$(CXX) -G -KPIC -lCstd"
|
65
119
|
else
|
66
120
|
# GNU CHAIN
|
67
121
|
# on Unix we need a g++ link, not gcc.
|
@@ -83,19 +137,6 @@ when /darwin/
|
|
83
137
|
when /linux/
|
84
138
|
add_define 'HAVE_EPOLL' if have_func('epoll_create', 'sys/epoll.h')
|
85
139
|
|
86
|
-
# Original epoll test is inadequate because 2.4 kernels have the header
|
87
|
-
# but not the code.
|
88
|
-
# add_define 'HAVE_EPOLL' if have_header('sys/epoll.h')
|
89
|
-
# if have_header('sys/epoll.h')
|
90
|
-
# File.open("hasEpollTest.c", "w") {|f|
|
91
|
-
# f.puts "#include <sys/epoll.h>"
|
92
|
-
# f.puts "int main() { epoll_create(1024); return 0;}"
|
93
|
-
# }
|
94
|
-
# (e = system( "gcc hasEpollTest.c -o hasEpollTest " )) and (e = $?.to_i)
|
95
|
-
# `rm -f hasEpollTest.c hasEpollTest`
|
96
|
-
# add_define 'HAVE_EPOLL' if e == 0
|
97
|
-
# end
|
98
|
-
|
99
140
|
# on Unix we need a g++ link, not gcc.
|
100
141
|
CONFIG['LDSHARED'] = "$(CXX) -shared"
|
101
142
|
|
@@ -107,38 +148,6 @@ else
|
|
107
148
|
CONFIG['LDSHARED'] = "$(CXX) -shared"
|
108
149
|
end
|
109
150
|
|
110
|
-
# OpenSSL:
|
111
|
-
|
112
|
-
def manual_ssl_config
|
113
|
-
ssl_libs_heads_args = {
|
114
|
-
:unix => [%w[ssl crypto], %w[openssl/ssl.h openssl/err.h]],
|
115
|
-
:darwin => [%w[ssl crypto C], %w[openssl/ssl.h openssl/err.h]],
|
116
|
-
# openbsd and linux:
|
117
|
-
:crypto_hack => [%w[crypto ssl crypto], %w[openssl/ssl.h openssl/err.h]],
|
118
|
-
:mswin => [%w[ssleay32 libeay32], %w[openssl/ssl.h openssl/err.h]],
|
119
|
-
}
|
120
|
-
|
121
|
-
dc_flags = ['ssl']
|
122
|
-
dc_flags += ["#{ENV['OPENSSL']}/include", ENV['OPENSSL']] if /linux/ =~ RUBY_PLATFORM
|
123
|
-
|
124
|
-
libs, heads = case RUBY_PLATFORM
|
125
|
-
when /mswin/ ; ssl_libs_heads_args[:mswin]
|
126
|
-
when /mingw/ ; ssl_libs_heads_args[:unix]
|
127
|
-
when /darwin/ ; ssl_libs_heads_args[:darwin]
|
128
|
-
when /openbsd/ ; ssl_libs_heads_args[:crypto_hack]
|
129
|
-
when /linux/ ; ssl_libs_heads_args[:crypto_hack]
|
130
|
-
else ssl_libs_heads_args[:unix]
|
131
|
-
end
|
132
|
-
dir_config(*dc_flags)
|
133
|
-
check_libs(libs) and check_heads(heads)
|
134
|
-
end
|
135
|
-
|
136
|
-
# Try to use pkg_config first, fixes #73
|
137
|
-
if pkg_config('openssl') || manual_ssl_config
|
138
|
-
add_define "WITH_SSL"
|
139
|
-
else
|
140
|
-
add_define "WITHOUT_SSL"
|
141
|
-
end
|
142
151
|
|
143
152
|
# solaris c++ compiler doesn't have make_pair()
|
144
153
|
TRY_LINK.sub!('$(CC)', '$(CXX)')
|
@@ -44,11 +44,13 @@ when /solaris/
|
|
44
44
|
add_define 'OS_SOLARIS8'
|
45
45
|
check_libs(%w[nsl socket], true)
|
46
46
|
|
47
|
-
|
48
|
-
if CONFIG['CC'] == 'cc'
|
47
|
+
if CONFIG['CC'] == 'cc' and `cc -flags 2>&1` =~ /Sun/ # detect SUNWspro compiler
|
49
48
|
# SUN CHAIN
|
50
|
-
|
49
|
+
add_define 'CC_SUNWspro'
|
50
|
+
$preload = ["\nCXX = CC"] # hack a CXX= line into the makefile
|
51
|
+
$CFLAGS = CONFIG['CFLAGS'] = "-KPIC"
|
51
52
|
CONFIG['CCDLFLAGS'] = "-KPIC"
|
53
|
+
CONFIG['LDSHARED'] = "$(CXX) -G -KPIC -lCstd"
|
52
54
|
else
|
53
55
|
# GNU CHAIN
|
54
56
|
# on Unix we need a g++ link, not gcc.
|
@@ -88,7 +88,7 @@ void Mapper_t::Close()
|
|
88
88
|
// Can be called multiple times.
|
89
89
|
// Calls to GetChunk are invalid after a call to Close.
|
90
90
|
if (MapPoint) {
|
91
|
-
#ifdef
|
91
|
+
#ifdef CC_SUNWspro
|
92
92
|
munmap ((char*)MapPoint, FileSize);
|
93
93
|
#else
|
94
94
|
munmap ((void*)MapPoint, FileSize);
|
@@ -118,7 +118,6 @@ extern "C" void Init_fastfilereaderext()
|
|
118
118
|
Mapper = rb_define_class_under (FastFileReader, "Mapper", rb_cObject);
|
119
119
|
|
120
120
|
rb_define_singleton_method (Mapper, "new", (VALUE(*)(...))mapper_new, 1);
|
121
|
-
rb_define_method (Mapper, "new", (VALUE(*)(...))mapper_new, 1);
|
122
121
|
rb_define_method (Mapper, "size", (VALUE(*)(...))mapper_size, 0);
|
123
122
|
rb_define_method (Mapper, "close", (VALUE(*)(...))mapper_close, 0);
|
124
123
|
rb_define_method (Mapper, "get_chunk", (VALUE(*)(...))mapper_get_chunk, 2);
|
data/ext/kb.cpp
CHANGED
@@ -26,9 +26,7 @@ KeyboardDescriptor::KeyboardDescriptor
|
|
26
26
|
|
27
27
|
KeyboardDescriptor::KeyboardDescriptor (EventMachine_t *parent_em):
|
28
28
|
EventableDescriptor (0, parent_em),
|
29
|
-
bReadAttemptedAfterClose (false)
|
30
|
-
LastIo (gCurrentLoopTime),
|
31
|
-
InactivityTimeout (0)
|
29
|
+
bReadAttemptedAfterClose (false)
|
32
30
|
{
|
33
31
|
#ifdef HAVE_EPOLL
|
34
32
|
EpollEvent.events = EPOLLIN;
|
data/ext/pipe.cpp
CHANGED
@@ -30,8 +30,6 @@ PipeDescriptor::PipeDescriptor
|
|
30
30
|
PipeDescriptor::PipeDescriptor (int fd, pid_t subpid, EventMachine_t *parent_em):
|
31
31
|
EventableDescriptor (fd, parent_em),
|
32
32
|
bReadAttemptedAfterClose (false),
|
33
|
-
LastIo (gCurrentLoopTime),
|
34
|
-
InactivityTimeout (0),
|
35
33
|
OutboundDataSize (0),
|
36
34
|
SubprocessPid (subpid)
|
37
35
|
{
|
@@ -104,22 +102,22 @@ PipeDescriptor::~PipeDescriptor()
|
|
104
102
|
struct timespec req = {0, 50000000}; // 0.05s
|
105
103
|
int n;
|
106
104
|
|
107
|
-
// wait 0.
|
108
|
-
for (n=0; n<
|
105
|
+
// wait 0.5s for the process to die
|
106
|
+
for (n=0; n<10; n++) {
|
109
107
|
if (waitpid (SubprocessPid, &(MyEventMachine->SubprocessExitStatus), WNOHANG) != 0) return;
|
110
108
|
nanosleep (&req, NULL);
|
111
109
|
}
|
112
110
|
|
113
|
-
// send SIGTERM and wait another
|
111
|
+
// send SIGTERM and wait another 1s
|
114
112
|
kill (SubprocessPid, SIGTERM);
|
115
|
-
for (n=0; n<
|
113
|
+
for (n=0; n<20; n++) {
|
116
114
|
nanosleep (&req, NULL);
|
117
115
|
if (waitpid (SubprocessPid, &(MyEventMachine->SubprocessExitStatus), WNOHANG) != 0) return;
|
118
116
|
}
|
119
117
|
|
120
|
-
// send SIGKILL and wait another
|
118
|
+
// send SIGKILL and wait another 5s
|
121
119
|
kill (SubprocessPid, SIGKILL);
|
122
|
-
for (n=0; n<
|
120
|
+
for (n=0; n<100; n++) {
|
123
121
|
nanosleep (&req, NULL);
|
124
122
|
if (waitpid (SubprocessPid, &(MyEventMachine->SubprocessExitStatus), WNOHANG) != 0) return;
|
125
123
|
}
|
@@ -143,7 +141,7 @@ void PipeDescriptor::Read()
|
|
143
141
|
return;
|
144
142
|
}
|
145
143
|
|
146
|
-
|
144
|
+
LastActivity = MyEventMachine->GetCurrentLoopTime();
|
147
145
|
|
148
146
|
int total_bytes_read = 0;
|
149
147
|
char readbuffer [16 * 1024];
|
@@ -203,7 +201,7 @@ void PipeDescriptor::Write()
|
|
203
201
|
int sd = GetSocket();
|
204
202
|
assert (sd != INVALID_SOCKET);
|
205
203
|
|
206
|
-
|
204
|
+
LastActivity = MyEventMachine->GetCurrentLoopTime();
|
207
205
|
char output_buffer [16 * 1024];
|
208
206
|
size_t nbytes = 0;
|
209
207
|
|
@@ -268,7 +266,7 @@ PipeDescriptor::Heartbeat
|
|
268
266
|
void PipeDescriptor::Heartbeat()
|
269
267
|
{
|
270
268
|
// If an inactivity timeout is defined, then check for it.
|
271
|
-
if (InactivityTimeout && ((
|
269
|
+
if (InactivityTimeout && ((MyEventMachine->GetCurrentLoopTime() - LastActivity) >= InactivityTimeout))
|
272
270
|
ScheduleClose (false);
|
273
271
|
//bCloseNow = true;
|
274
272
|
}
|
data/ext/project.h
CHANGED
@@ -55,8 +55,8 @@ See the file COPYING for complete licensing information.
|
|
55
55
|
#include <netinet/tcp.h>
|
56
56
|
#include <arpa/inet.h>
|
57
57
|
#include <pwd.h>
|
58
|
+
#include <string.h>
|
58
59
|
typedef int SOCKET;
|
59
|
-
#define closesocket close
|
60
60
|
#define INVALID_SOCKET -1
|
61
61
|
#define SOCKET_ERROR -1
|
62
62
|
#ifdef OS_SOLARIS8
|
@@ -96,6 +96,9 @@ typedef int socklen_t;
|
|
96
96
|
typedef int pid_t;
|
97
97
|
#endif
|
98
98
|
|
99
|
+
#if !defined(_MSC_VER) || _MSC_VER > 1400
|
100
|
+
#include <stdint.h>
|
101
|
+
#endif
|
99
102
|
|
100
103
|
using namespace std;
|
101
104
|
|
@@ -134,18 +137,19 @@ static inline int inotify_rm_watch (int fd, __u32 wd) { return syscall (__NR_ino
|
|
134
137
|
#include <sys/uio.h>
|
135
138
|
#endif
|
136
139
|
|
140
|
+
#if __cplusplus
|
141
|
+
extern "C" {
|
142
|
+
#endif
|
143
|
+
typedef void (*EMCallback)(const unsigned long, int, const char*, const unsigned long);
|
144
|
+
#if __cplusplus
|
145
|
+
}
|
146
|
+
#endif
|
147
|
+
|
137
148
|
#include "binder.h"
|
138
149
|
#include "em.h"
|
139
|
-
#include "epoll.h"
|
140
|
-
#include "sigs.h"
|
141
150
|
#include "ed.h"
|
142
|
-
#include "files.h"
|
143
151
|
#include "page.h"
|
144
152
|
#include "ssl.h"
|
145
153
|
#include "eventmachine.h"
|
146
|
-
#include "eventmachine_cpp.h"
|
147
|
-
|
148
|
-
|
149
|
-
|
150
154
|
|
151
155
|
#endif // __Project__H_
|