eventmachine 0.10.0 → 0.12.0
Sign up to get free protection for your applications and to get access to all the features.
- data/DEFERRABLES +1 -1
- data/LIGHTWEIGHT_CONCURRENCY +1 -1
- data/PURE_RUBY +1 -1
- data/README +1 -1
- data/RELEASE_NOTES +1 -1
- data/SMTP +1 -1
- data/SPAWNED_PROCESSES +1 -1
- data/TODO +1 -1
- data/ext/binder.cpp +1 -1
- data/ext/binder.h +1 -1
- data/ext/cmain.cpp +29 -1
- data/ext/cplusplus.cpp +1 -1
- data/ext/ed.cpp +79 -1
- data/ext/ed.h +6 -1
- data/ext/em.cpp +343 -27
- data/ext/em.h +25 -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 +3 -1
- data/ext/eventmachine_cpp.h +1 -1
- data/ext/extconf.rb +31 -1
- data/ext/files.cpp +1 -1
- data/ext/files.h +1 -1
- data/ext/kb.cpp +4 -1
- data/ext/page.cpp +1 -1
- data/ext/page.h +1 -1
- data/ext/pipe.cpp +4 -1
- data/ext/project.h +8 -2
- data/ext/rubymain.cpp +73 -2
- data/ext/sigs.cpp +1 -1
- data/ext/sigs.h +1 -1
- data/ext/ssl.cpp +4 -1
- data/ext/ssl.h +1 -1
- 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 +68 -0
- data/lib/em/spawnable.rb +1 -1
- data/lib/em/streamer.rb +1 -1
- data/lib/eventmachine.rb +113 -66
- 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 +1 -1
- data/lib/pr_eventmachine.rb +35 -8
- data/lib/protocols/header_and_content.rb +1 -1
- data/lib/protocols/httpcli2.rb +1 -1
- data/lib/protocols/httpclient.rb +1 -1
- data/lib/protocols/line_and_text.rb +1 -1
- data/lib/protocols/linetext2.rb +1 -1
- data/lib/protocols/saslauth.rb +59 -1
- data/lib/protocols/smtpclient.rb +4 -3
- data/lib/protocols/smtpserver.rb +3 -3
- data/lib/protocols/stomp.rb +1 -1
- data/lib/protocols/tcptest.rb +1 -1
- data/tests/test_basic.rb +2 -1
- data/tests/test_defer.rb +63 -0
- data/tests/test_epoll.rb +10 -5
- data/tests/test_errors.rb +13 -3
- data/tests/test_eventables.rb +1 -1
- data/tests/test_exc.rb +2 -1
- data/tests/test_futures.rb +2 -1
- data/tests/test_hc.rb +26 -2
- data/tests/test_httpclient.rb +2 -1
- data/tests/test_httpclient2.rb +2 -1
- data/tests/test_kb.rb +2 -1
- data/tests/test_ltp.rb +3 -1
- data/tests/test_ltp2.rb +2 -1
- data/tests/test_next_tick.rb +2 -1
- data/tests/test_processes.rb +56 -0
- data/tests/test_pure.rb +2 -1
- data/tests/test_running.rb +2 -1
- data/tests/test_sasl.rb +73 -0
- data/tests/test_send_file.rb +3 -1
- data/tests/test_servers.rb +4 -1
- data/tests/test_smtpclient.rb +2 -1
- data/tests/test_smtpserver.rb +3 -2
- data/tests/test_spawn.rb +2 -1
- data/tests/test_timers.rb +2 -2
- data/tests/test_ud.rb +2 -1
- data/tests/testem.rb +1 -1
- metadata +115 -104
data/ext/em.h
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
/*****************************************************************************
|
2
2
|
|
3
|
-
$Id: em.h
|
3
|
+
$Id: em.h 668 2008-01-04 23:00:34Z blackhedd $
|
4
4
|
|
5
5
|
File: em.h
|
6
6
|
Date: 06Apr06
|
@@ -79,6 +79,8 @@ class EventMachine_t
|
|
79
79
|
|
80
80
|
void Add (EventableDescriptor*);
|
81
81
|
void Modify (EventableDescriptor*);
|
82
|
+
void ArmKqueueWriter (EventableDescriptor*);
|
83
|
+
void ArmKqueueReader (EventableDescriptor*);
|
82
84
|
|
83
85
|
void SetTimerQuantum (int);
|
84
86
|
static void SetuidString (const char*);
|
@@ -88,6 +90,7 @@ class EventMachine_t
|
|
88
90
|
|
89
91
|
// Temporary:
|
90
92
|
void _UseEpoll();
|
93
|
+
void _UseKqueue();
|
91
94
|
|
92
95
|
|
93
96
|
private:
|
@@ -99,6 +102,7 @@ class EventMachine_t
|
|
99
102
|
|
100
103
|
bool _RunSelectOnce();
|
101
104
|
bool _RunEpollOnce();
|
105
|
+
bool _RunKqueueOnce();
|
102
106
|
|
103
107
|
void _ModifyEpollEvent (EventableDescriptor*);
|
104
108
|
|
@@ -133,9 +137,29 @@ class EventMachine_t
|
|
133
137
|
private:
|
134
138
|
bool bEpoll;
|
135
139
|
int epfd; // Epoll file-descriptor
|
140
|
+
|
141
|
+
bool bKqueue;
|
142
|
+
int kqfd; // Kqueue file-descriptor
|
136
143
|
};
|
137
144
|
|
138
145
|
|
146
|
+
/*******************
|
147
|
+
struct SelectData_t
|
148
|
+
*******************/
|
149
|
+
|
150
|
+
struct SelectData_t
|
151
|
+
{
|
152
|
+
SelectData_t();
|
153
|
+
|
154
|
+
int _Select();
|
155
|
+
|
156
|
+
int maxsocket;
|
157
|
+
fd_set fdreads;
|
158
|
+
fd_set fdwrites;
|
159
|
+
timeval tv;
|
160
|
+
int nSockets;
|
161
|
+
};
|
162
|
+
|
139
163
|
|
140
164
|
|
141
165
|
#endif // __EventMachine__H_
|
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
@@ -1,6 +1,6 @@
|
|
1
1
|
/*****************************************************************************
|
2
2
|
|
3
|
-
$Id: eventmachine.h
|
3
|
+
$Id: eventmachine.h 679 2008-01-19 01:40:06Z blackhedd $
|
4
4
|
|
5
5
|
File: eventmachine.h
|
6
6
|
Date: 15Apr06
|
@@ -47,6 +47,7 @@ extern "C" {
|
|
47
47
|
void evma_set_tls_parms (const char *binding, const char *privatekey_filename, const char *certchain_filenane);
|
48
48
|
void evma_start_tls (const char *binding);
|
49
49
|
int evma_get_peername (const char *binding, struct sockaddr*);
|
50
|
+
int evma_get_sockname (const char *binding, struct sockaddr*);
|
50
51
|
int evma_get_subprocess_pid (const char *binding, pid_t*);
|
51
52
|
int evma_get_subprocess_status (const char *binding, int*);
|
52
53
|
int evma_send_data_to_connection (const char *binding, const char *data, int data_length);
|
@@ -71,6 +72,7 @@ extern "C" {
|
|
71
72
|
|
72
73
|
// Temporary:
|
73
74
|
void evma__epoll();
|
75
|
+
void evma__kqueue();
|
74
76
|
|
75
77
|
#if __cplusplus
|
76
78
|
}
|
data/ext/eventmachine_cpp.h
CHANGED
data/ext/extconf.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# $Id: extconf.rb
|
1
|
+
# $Id: extconf.rb 677 2008-01-08 20:37:24Z blackhedd $
|
2
2
|
#
|
3
3
|
#----------------------------------------------------------------------------
|
4
4
|
#
|
@@ -77,10 +77,32 @@ when /solaris/
|
|
77
77
|
CONFIG['CCDLFLAGS'] = "-fPIC"
|
78
78
|
end
|
79
79
|
|
80
|
+
when /openbsd/
|
81
|
+
# OpenBSD branch contributed by Guillaume Sellier.
|
82
|
+
flags << '-DOS_UNIX'
|
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
|
94
|
+
# on Unix we need a g++ link, not gcc. On OpenBSD, linking against libstdc++ have to be explicitly done for shared libs
|
95
|
+
CONFIG['LDSHARED'] = "$(CXX) -shared -lstdc++"
|
96
|
+
|
97
|
+
|
80
98
|
when /darwin/
|
81
99
|
flags << '-DOS_UNIX'
|
82
100
|
flags << '-DBUILD_FOR_RUBY'
|
83
101
|
|
102
|
+
if have_header("sys/event.h") and have_header("sys/queue.h")
|
103
|
+
flags << "-DHAVE_KQUEUE"
|
104
|
+
end
|
105
|
+
|
84
106
|
dir_config('ssl')
|
85
107
|
if have_library('ssl') and
|
86
108
|
have_library('crypto') and
|
@@ -116,6 +138,10 @@ when /linux/
|
|
116
138
|
flags << '-DHAVE_EPOLL' if e == 0
|
117
139
|
end
|
118
140
|
|
141
|
+
if have_func('rb_thread_blocking_region') and have_macro('RB_UBF_DFL', 'ruby.h')
|
142
|
+
flags << "-DHAVE_TBR"
|
143
|
+
end
|
144
|
+
|
119
145
|
dir_config('ssl', "#{ENV['OPENSSL']}/include", ENV['OPENSSL'])
|
120
146
|
# Check for libcrypto twice, before and after ssl. That's because on some platforms
|
121
147
|
# and openssl versions, libssl will emit unresolved externals from crypto. It
|
@@ -149,6 +175,10 @@ else
|
|
149
175
|
flags << '-DOS_UNIX'
|
150
176
|
flags << '-DBUILD_FOR_RUBY'
|
151
177
|
|
178
|
+
if have_header("sys/event.h") and have_header("sys/queue.h")
|
179
|
+
flags << "-DHAVE_KQUEUE"
|
180
|
+
end
|
181
|
+
|
152
182
|
dir_config('ssl')
|
153
183
|
if have_library('ssl') and
|
154
184
|
have_library('crypto') and
|
data/ext/files.cpp
CHANGED
data/ext/files.h
CHANGED
data/ext/kb.cpp
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
/*****************************************************************************
|
2
2
|
|
3
|
-
$Id: kb.cpp
|
3
|
+
$Id: kb.cpp 668 2008-01-04 23:00:34Z blackhedd $
|
4
4
|
|
5
5
|
File: kb.cpp
|
6
6
|
Date: 24Aug07
|
@@ -33,6 +33,9 @@ KeyboardDescriptor::KeyboardDescriptor (EventMachine_t *parent_em):
|
|
33
33
|
#ifdef HAVE_EPOLL
|
34
34
|
EpollEvent.events = EPOLLIN;
|
35
35
|
#endif
|
36
|
+
#ifdef HAVE_KQUEUE
|
37
|
+
MyEventMachine->ArmKqueueReader (this);
|
38
|
+
#endif
|
36
39
|
}
|
37
40
|
|
38
41
|
|
data/ext/page.cpp
CHANGED
data/ext/page.h
CHANGED
data/ext/pipe.cpp
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
/*****************************************************************************
|
2
2
|
|
3
|
-
$Id: pipe.cpp
|
3
|
+
$Id: pipe.cpp 668 2008-01-04 23:00:34Z blackhedd $
|
4
4
|
|
5
5
|
File: pipe.cpp
|
6
6
|
Date: 30May07
|
@@ -38,6 +38,9 @@ PipeDescriptor::PipeDescriptor (int fd, pid_t subpid, EventMachine_t *parent_em)
|
|
38
38
|
#ifdef HAVE_EPOLL
|
39
39
|
EpollEvent.events = EPOLLIN;
|
40
40
|
#endif
|
41
|
+
#ifdef HAVE_KQUEUE
|
42
|
+
MyEventMachine->ArmKqueueReader (this);
|
43
|
+
#endif
|
41
44
|
}
|
42
45
|
|
43
46
|
|
data/ext/project.h
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
/*****************************************************************************
|
2
2
|
|
3
|
-
$Id: project.h
|
3
|
+
$Id: project.h 686 2008-05-14 21:21:10Z francis $
|
4
4
|
|
5
5
|
File: project.h
|
6
6
|
Date: 06Apr06
|
@@ -76,7 +76,8 @@ typedef int SOCKET;
|
|
76
76
|
#ifdef OS_WIN32
|
77
77
|
#define WIN32_LEAN_AND_MEAN
|
78
78
|
#include <windows.h>
|
79
|
-
#include <
|
79
|
+
#include <winsock2.h>
|
80
|
+
#include <ws2tcpip.h>
|
80
81
|
#include <rpc.h>
|
81
82
|
#include <fcntl.h>
|
82
83
|
#include <assert.h>
|
@@ -96,6 +97,11 @@ using namespace std;
|
|
96
97
|
#include <sys/epoll.h>
|
97
98
|
#endif
|
98
99
|
|
100
|
+
#ifdef HAVE_KQUEUE
|
101
|
+
#include <sys/event.h>
|
102
|
+
#include <sys/queue.h>
|
103
|
+
#endif
|
104
|
+
|
99
105
|
#include "binder.h"
|
100
106
|
#include "em.h"
|
101
107
|
#include "epoll.h"
|
data/ext/rubymain.cpp
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
/*****************************************************************************
|
2
2
|
|
3
|
-
$Id: rubymain.cpp
|
3
|
+
$Id: rubymain.cpp 679 2008-01-19 01:40:06Z blackhedd $
|
4
4
|
|
5
5
|
File: rubymain.cpp
|
6
6
|
Date: 06Apr06
|
@@ -31,6 +31,13 @@ static VALUE EmModule;
|
|
31
31
|
static VALUE EmConnection;
|
32
32
|
|
33
33
|
static VALUE Intern_at_signature;
|
34
|
+
static VALUE Intern_at_timers;
|
35
|
+
static VALUE Intern_at_conns;
|
36
|
+
static VALUE Intern_event_callback;
|
37
|
+
static VALUE Intern_run_deferred_callbacks;
|
38
|
+
static VALUE Intern_delete;
|
39
|
+
static VALUE Intern_call;
|
40
|
+
static VALUE Intern_receive_data;
|
34
41
|
|
35
42
|
|
36
43
|
/****************
|
@@ -39,7 +46,25 @@ t_event_callback
|
|
39
46
|
|
40
47
|
static void event_callback (const char *a1, int a2, const char *a3, int a4)
|
41
48
|
{
|
42
|
-
|
49
|
+
if (a2 == EM_CONNECTION_READ) {
|
50
|
+
VALUE t = rb_ivar_get (EmModule, Intern_at_conns);
|
51
|
+
VALUE q = rb_hash_aref (t, rb_str_new2(a1));
|
52
|
+
if (q == Qnil)
|
53
|
+
rb_raise (rb_eRuntimeError, "no connection");
|
54
|
+
rb_funcall (q, Intern_receive_data, 1, rb_str_new (a3, a4));
|
55
|
+
}
|
56
|
+
else if (a2 == EM_LOOPBREAK_SIGNAL) {
|
57
|
+
rb_funcall (EmModule, Intern_run_deferred_callbacks, 0);
|
58
|
+
}
|
59
|
+
else if (a2 == EM_TIMER_FIRED) {
|
60
|
+
VALUE t = rb_ivar_get (EmModule, Intern_at_timers);
|
61
|
+
VALUE q = rb_funcall (t, Intern_delete, 1, rb_str_new(a3, a4));
|
62
|
+
if (q == Qnil)
|
63
|
+
rb_raise (rb_eRuntimeError, "no timer");
|
64
|
+
rb_funcall (q, Intern_call, 0);
|
65
|
+
}
|
66
|
+
else
|
67
|
+
rb_funcall (EmModule, Intern_event_callback, 3, rb_str_new2(a1), (a2 << 1) | 1, rb_str_new(a3,a4));
|
43
68
|
}
|
44
69
|
|
45
70
|
|
@@ -167,6 +192,20 @@ static VALUE t_get_peername (VALUE self, VALUE signature)
|
|
167
192
|
return Qnil;
|
168
193
|
}
|
169
194
|
|
195
|
+
/**************
|
196
|
+
t_get_sockname
|
197
|
+
**************/
|
198
|
+
|
199
|
+
static VALUE t_get_sockname (VALUE self, VALUE signature)
|
200
|
+
{
|
201
|
+
struct sockaddr s;
|
202
|
+
if (evma_get_sockname (StringValuePtr (signature), &s)) {
|
203
|
+
return rb_str_new ((const char*)&s, sizeof(s));
|
204
|
+
}
|
205
|
+
|
206
|
+
return Qnil;
|
207
|
+
}
|
208
|
+
|
170
209
|
/********************
|
171
210
|
t_get_subprocess_pid
|
172
211
|
********************/
|
@@ -434,6 +473,17 @@ static VALUE t__epoll (VALUE self)
|
|
434
473
|
return Qnil;
|
435
474
|
}
|
436
475
|
|
476
|
+
/*********
|
477
|
+
t__kqueue
|
478
|
+
*********/
|
479
|
+
|
480
|
+
static VALUE t__kqueue (VALUE self)
|
481
|
+
{
|
482
|
+
// Temporary.
|
483
|
+
evma__kqueue();
|
484
|
+
return Qnil;
|
485
|
+
}
|
486
|
+
|
437
487
|
|
438
488
|
/****************
|
439
489
|
t_send_file_data
|
@@ -487,6 +537,16 @@ static VALUE conn_get_outbound_data_size (VALUE self)
|
|
487
537
|
}
|
488
538
|
|
489
539
|
|
540
|
+
/******************************
|
541
|
+
conn_associate_callback_target
|
542
|
+
******************************/
|
543
|
+
|
544
|
+
static VALUE conn_associate_callback_target (VALUE self, VALUE sig)
|
545
|
+
{
|
546
|
+
// No-op for the time being.
|
547
|
+
return Qnil;
|
548
|
+
}
|
549
|
+
|
490
550
|
|
491
551
|
/*********************
|
492
552
|
Init_rubyeventmachine
|
@@ -496,6 +556,14 @@ extern "C" void Init_rubyeventmachine()
|
|
496
556
|
{
|
497
557
|
// Tuck away some symbol values so we don't have to look 'em up every time we need 'em.
|
498
558
|
Intern_at_signature = rb_intern ("@signature");
|
559
|
+
Intern_at_timers = rb_intern ("@timers");
|
560
|
+
Intern_at_conns = rb_intern ("@conns");
|
561
|
+
|
562
|
+
Intern_event_callback = rb_intern ("event_callback");
|
563
|
+
Intern_run_deferred_callbacks = rb_intern ("run_deferred_callbacks");
|
564
|
+
Intern_delete = rb_intern ("delete");
|
565
|
+
Intern_call = rb_intern ("call");
|
566
|
+
Intern_receive_data = rb_intern ("receive_data");
|
499
567
|
|
500
568
|
// INCOMPLETE, we need to define class Connections inside module EventMachine
|
501
569
|
// run_machine and run_machine_without_threads are now identical.
|
@@ -538,6 +606,7 @@ extern "C" void Init_rubyeventmachine()
|
|
538
606
|
rb_define_module_function (EmModule, "_write_file", (VALUE(*)(...))t__write_file, 1);
|
539
607
|
|
540
608
|
rb_define_module_function (EmModule, "get_peername", (VALUE(*)(...))t_get_peername, 1);
|
609
|
+
rb_define_module_function (EmModule, "get_sockname", (VALUE(*)(...))t_get_sockname, 1);
|
541
610
|
rb_define_module_function (EmModule, "get_subprocess_pid", (VALUE(*)(...))t_get_subprocess_pid, 1);
|
542
611
|
rb_define_module_function (EmModule, "get_subprocess_status", (VALUE(*)(...))t_get_subprocess_status, 1);
|
543
612
|
rb_define_module_function (EmModule, "get_comm_inactivity_timeout", (VALUE(*)(...))t_get_comm_inactivity_timeout, 1);
|
@@ -546,8 +615,10 @@ extern "C" void Init_rubyeventmachine()
|
|
546
615
|
|
547
616
|
// Temporary:
|
548
617
|
rb_define_module_function (EmModule, "epoll", (VALUE(*)(...))t__epoll, 0);
|
618
|
+
rb_define_module_function (EmModule, "kqueue", (VALUE(*)(...))t__kqueue, 0);
|
549
619
|
|
550
620
|
rb_define_method (EmConnection, "get_outbound_data_size", (VALUE(*)(...))conn_get_outbound_data_size, 0);
|
621
|
+
rb_define_method (EmConnection, "associate_callback_target", (VALUE(*)(...))conn_associate_callback_target, 1);
|
551
622
|
|
552
623
|
rb_define_const (EmModule, "TimerFired", INT2NUM(100));
|
553
624
|
rb_define_const (EmModule, "ConnectionData", INT2NUM(101));
|
data/ext/sigs.cpp
CHANGED