eventmachine 0.10.0 → 0.12.0
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/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