eventmachine 0.12.10-x86-mswin32-60 → 1.0.0.beta.2-x86-mswin32-60
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -0
- data/Gemfile +1 -0
- data/README +80 -81
- data/Rakefile +7 -370
- data/docs/COPYING +60 -60
- data/docs/ChangeLog +211 -211
- data/docs/DEFERRABLES +246 -133
- data/docs/EPOLL +141 -141
- data/docs/GNU +281 -281
- data/docs/INSTALL +13 -13
- data/docs/KEYBOARD +42 -38
- data/docs/LEGAL +25 -25
- data/docs/LIGHTWEIGHT_CONCURRENCY +130 -70
- data/docs/PURE_RUBY +75 -75
- data/docs/RELEASE_NOTES +94 -94
- data/docs/SMTP +4 -2
- data/docs/SPAWNED_PROCESSES +148 -89
- data/docs/TODO +8 -8
- data/eventmachine.gemspec +19 -26
- data/examples/ex_channel.rb +42 -42
- data/examples/ex_queue.rb +2 -2
- data/examples/ex_tick_loop_array.rb +15 -0
- data/examples/ex_tick_loop_counter.rb +32 -0
- data/examples/helper.rb +1 -1
- data/ext/binder.cpp +0 -1
- data/ext/cmain.cpp +36 -25
- data/ext/ed.cpp +104 -113
- data/ext/ed.h +24 -30
- data/ext/em.cpp +349 -283
- data/ext/em.h +25 -29
- data/ext/eventmachine.h +5 -4
- data/ext/extconf.rb +58 -49
- data/ext/fastfilereader/extconf.rb +5 -3
- data/ext/fastfilereader/mapper.cpp +214 -214
- data/ext/fastfilereader/mapper.h +59 -59
- data/ext/fastfilereader/rubymain.cpp +127 -127
- data/ext/kb.cpp +1 -3
- data/ext/page.cpp +107 -107
- data/ext/page.h +51 -51
- data/ext/pipe.cpp +9 -11
- data/ext/project.h +12 -8
- data/ext/rubymain.cpp +138 -104
- data/java/.classpath +8 -8
- data/java/.project +17 -17
- data/java/src/com/rubyeventmachine/EmReactor.java +1 -0
- data/java/src/com/rubyeventmachine/EmReactorException.java +40 -40
- data/lib/em/buftok.rb +138 -138
- data/lib/em/callback.rb +25 -25
- data/lib/em/channel.rb +1 -1
- data/lib/em/connection.rb +6 -1
- data/lib/em/deferrable.rb +16 -2
- data/lib/em/file_watch.rb +53 -53
- data/lib/em/future.rb +61 -61
- data/lib/em/iterator.rb +270 -0
- data/lib/em/messages.rb +66 -66
- data/lib/em/process_watch.rb +43 -43
- data/lib/em/protocols.rb +1 -1
- data/lib/em/protocols/header_and_content.rb +138 -138
- data/lib/em/protocols/httpclient.rb +267 -262
- data/lib/em/protocols/line_protocol.rb +28 -0
- data/lib/em/protocols/memcache.rb +322 -322
- data/lib/em/protocols/postgres3.rb +247 -247
- data/lib/em/protocols/saslauth.rb +175 -175
- data/lib/em/protocols/smtpserver.rb +640 -547
- data/lib/em/protocols/stomp.rb +200 -200
- data/lib/em/protocols/tcptest.rb +52 -52
- data/lib/{pr_eventmachine.rb → em/pure_ruby.rb} +1013 -1022
- data/lib/em/queue.rb +1 -0
- data/lib/em/spawnable.rb +85 -85
- data/lib/em/streamer.rb +130 -130
- data/lib/em/tick_loop.rb +85 -0
- data/lib/em/timers.rb +2 -1
- data/lib/em/version.rb +1 -1
- data/lib/eventmachine.rb +40 -84
- data/lib/jeventmachine.rb +2 -1
- data/lib/rubyeventmachine.rb +2 -0
- data/setup.rb +1585 -1585
- data/tasks/doc.rake +30 -0
- data/tasks/package.rake +85 -0
- data/tasks/test.rake +6 -0
- data/tests/client.crt +31 -31
- data/tests/client.key +51 -51
- data/tests/test_attach.rb +13 -3
- data/tests/test_basic.rb +60 -95
- data/tests/test_channel.rb +3 -2
- data/tests/test_defer.rb +49 -47
- data/tests/test_deferrable.rb +35 -0
- data/tests/test_error_handler.rb +35 -35
- data/tests/test_errors.rb +82 -82
- data/tests/test_exc.rb +55 -55
- data/tests/test_file_watch.rb +49 -49
- data/tests/test_futures.rb +198 -198
- data/tests/test_handler_check.rb +36 -36
- data/tests/test_hc.rb +190 -218
- data/tests/test_httpclient.rb +227 -218
- data/tests/test_httpclient2.rb +3 -2
- data/tests/test_inactivity_timeout.rb +3 -3
- data/tests/test_kb.rb +60 -60
- data/tests/test_ltp.rb +13 -5
- data/tests/test_ltp2.rb +317 -317
- data/tests/test_next_tick.rb +1 -1
- data/tests/test_object_protocol.rb +36 -36
- data/tests/test_pending_connect_timeout.rb +2 -2
- data/tests/test_process_watch.rb +50 -48
- data/tests/test_proxy_connection.rb +52 -0
- data/tests/test_pure.rb +134 -125
- data/tests/test_queue.rb +44 -44
- data/tests/test_running.rb +42 -42
- data/tests/test_sasl.rb +72 -72
- data/tests/test_send_file.rb +251 -242
- data/tests/test_servers.rb +76 -76
- data/tests/test_smtpclient.rb +83 -83
- data/tests/test_smtpserver.rb +85 -85
- data/tests/test_spawn.rb +322 -322
- data/tests/test_ssl_methods.rb +49 -49
- data/tests/test_ssl_verify.rb +82 -82
- data/tests/test_tick_loop.rb +59 -0
- data/tests/test_timers.rb +13 -15
- data/tests/test_ud.rb +36 -36
- data/tests/testem.rb +31 -31
- metadata +66 -51
- 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.rb +0 -32
- 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/web/whatis +0 -7
data/ext/page.h
CHANGED
@@ -1,51 +1,51 @@
|
|
1
|
-
/*****************************************************************************
|
2
|
-
|
3
|
-
$Id$
|
4
|
-
|
5
|
-
File: page.h
|
6
|
-
Date: 30Apr06
|
7
|
-
|
8
|
-
Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved.
|
9
|
-
Gmail: blackhedd
|
10
|
-
|
11
|
-
This program is free software; you can redistribute it and/or modify
|
12
|
-
it under the terms of either: 1) the GNU General Public License
|
13
|
-
as published by the Free Software Foundation; either version 2 of the
|
14
|
-
License, or (at your option) any later version; or 2) Ruby's License.
|
15
|
-
|
16
|
-
See the file COPYING for complete licensing information.
|
17
|
-
|
18
|
-
*****************************************************************************/
|
19
|
-
|
20
|
-
|
21
|
-
#ifndef __PageManager__H_
|
22
|
-
#define __PageManager__H_
|
23
|
-
|
24
|
-
|
25
|
-
/**************
|
26
|
-
class PageList
|
27
|
-
**************/
|
28
|
-
|
29
|
-
class PageList
|
30
|
-
{
|
31
|
-
struct Page {
|
32
|
-
Page (const char *b, size_t s): Buffer(b), Size(s) {}
|
33
|
-
const char *Buffer;
|
34
|
-
size_t Size;
|
35
|
-
};
|
36
|
-
|
37
|
-
public:
|
38
|
-
PageList();
|
39
|
-
virtual ~PageList();
|
40
|
-
|
41
|
-
void Push (const char*, int);
|
42
|
-
bool HasPages();
|
43
|
-
void Front (const char**, int*);
|
44
|
-
void PopFront();
|
45
|
-
|
46
|
-
private:
|
47
|
-
deque<Page> Pages;
|
48
|
-
};
|
49
|
-
|
50
|
-
|
51
|
-
#endif // __PageManager__H_
|
1
|
+
/*****************************************************************************
|
2
|
+
|
3
|
+
$Id$
|
4
|
+
|
5
|
+
File: page.h
|
6
|
+
Date: 30Apr06
|
7
|
+
|
8
|
+
Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved.
|
9
|
+
Gmail: blackhedd
|
10
|
+
|
11
|
+
This program is free software; you can redistribute it and/or modify
|
12
|
+
it under the terms of either: 1) the GNU General Public License
|
13
|
+
as published by the Free Software Foundation; either version 2 of the
|
14
|
+
License, or (at your option) any later version; or 2) Ruby's License.
|
15
|
+
|
16
|
+
See the file COPYING for complete licensing information.
|
17
|
+
|
18
|
+
*****************************************************************************/
|
19
|
+
|
20
|
+
|
21
|
+
#ifndef __PageManager__H_
|
22
|
+
#define __PageManager__H_
|
23
|
+
|
24
|
+
|
25
|
+
/**************
|
26
|
+
class PageList
|
27
|
+
**************/
|
28
|
+
|
29
|
+
class PageList
|
30
|
+
{
|
31
|
+
struct Page {
|
32
|
+
Page (const char *b, size_t s): Buffer(b), Size(s) {}
|
33
|
+
const char *Buffer;
|
34
|
+
size_t Size;
|
35
|
+
};
|
36
|
+
|
37
|
+
public:
|
38
|
+
PageList();
|
39
|
+
virtual ~PageList();
|
40
|
+
|
41
|
+
void Push (const char*, int);
|
42
|
+
bool HasPages();
|
43
|
+
void Front (const char**, int*);
|
44
|
+
void PopFront();
|
45
|
+
|
46
|
+
private:
|
47
|
+
deque<Page> Pages;
|
48
|
+
};
|
49
|
+
|
50
|
+
|
51
|
+
#endif // __PageManager__H_
|
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_
|
data/ext/rubymain.cpp
CHANGED
@@ -31,6 +31,8 @@ Statics
|
|
31
31
|
|
32
32
|
static VALUE EmModule;
|
33
33
|
static VALUE EmConnection;
|
34
|
+
static VALUE EmConnsHash;
|
35
|
+
static VALUE EmTimersHash;
|
34
36
|
|
35
37
|
static VALUE EM_eConnectionError;
|
36
38
|
static VALUE EM_eUnknownTimerFired;
|
@@ -51,89 +53,117 @@ static VALUE Intern_ssl_verify_peer;
|
|
51
53
|
static VALUE Intern_notify_readable;
|
52
54
|
static VALUE Intern_notify_writable;
|
53
55
|
static VALUE Intern_proxy_target_unbound;
|
56
|
+
static VALUE Intern_proxy_completed;
|
57
|
+
static VALUE Intern_connection_completed;
|
54
58
|
|
55
59
|
static VALUE rb_cProcStatus;
|
56
60
|
|
57
61
|
struct em_event {
|
58
|
-
unsigned long
|
59
|
-
int
|
60
|
-
const char *
|
61
|
-
unsigned long
|
62
|
+
unsigned long signature;
|
63
|
+
int event;
|
64
|
+
const char *data_str;
|
65
|
+
unsigned long data_num;
|
62
66
|
};
|
63
67
|
|
68
|
+
static inline VALUE ensure_conn(const unsigned long signature)
|
69
|
+
{
|
70
|
+
VALUE conn = rb_hash_aref (EmConnsHash, ULONG2NUM (signature));
|
71
|
+
if (conn == Qnil)
|
72
|
+
rb_raise (EM_eConnectionNotBound, "unknown connection: %lu", signature);
|
73
|
+
return conn;
|
74
|
+
}
|
75
|
+
|
76
|
+
|
64
77
|
/****************
|
65
78
|
t_event_callback
|
66
79
|
****************/
|
67
80
|
|
68
|
-
static void event_callback (struct em_event* e)
|
69
|
-
{
|
70
|
-
const unsigned long
|
71
|
-
int
|
72
|
-
const char *
|
73
|
-
const unsigned long
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
81
|
+
static inline void event_callback (struct em_event* e)
|
82
|
+
{
|
83
|
+
const unsigned long signature = e->signature;
|
84
|
+
int event = e->event;
|
85
|
+
const char *data_str = e->data_str;
|
86
|
+
const unsigned long data_num = e->data_num;
|
87
|
+
|
88
|
+
switch (event) {
|
89
|
+
case EM_CONNECTION_READ:
|
90
|
+
{
|
91
|
+
VALUE conn = rb_hash_aref (EmConnsHash, ULONG2NUM (signature));
|
92
|
+
if (conn == Qnil)
|
93
|
+
rb_raise (EM_eConnectionNotBound, "received %lu bytes of data for unknown signature: %lu", data_num, signature);
|
94
|
+
rb_funcall (conn, Intern_receive_data, 1, rb_str_new (data_str, data_num));
|
95
|
+
return;
|
96
|
+
}
|
97
|
+
case EM_CONNECTION_ACCEPTED:
|
98
|
+
case EM_CONNECTION_UNBOUND:
|
99
|
+
{
|
100
|
+
rb_funcall (EmModule, Intern_event_callback, 3, ULONG2NUM(signature), INT2FIX(event), data_str ? rb_str_new(data_str,data_num) : ULONG2NUM(data_num));
|
101
|
+
return;
|
102
|
+
}
|
103
|
+
case EM_CONNECTION_COMPLETED:
|
104
|
+
{
|
105
|
+
VALUE conn = ensure_conn(signature);
|
106
|
+
rb_funcall (conn, Intern_connection_completed, 0);
|
107
|
+
return;
|
108
|
+
}
|
109
|
+
case EM_CONNECTION_NOTIFY_READABLE:
|
110
|
+
{
|
111
|
+
VALUE conn = ensure_conn(signature);
|
112
|
+
rb_funcall (conn, Intern_notify_readable, 0);
|
113
|
+
return;
|
114
|
+
}
|
115
|
+
case EM_CONNECTION_NOTIFY_WRITABLE:
|
116
|
+
{
|
117
|
+
VALUE conn = ensure_conn(signature);
|
118
|
+
rb_funcall (conn, Intern_notify_writable, 0);
|
119
|
+
return;
|
120
|
+
}
|
121
|
+
case EM_LOOPBREAK_SIGNAL:
|
122
|
+
{
|
123
|
+
rb_funcall (EmModule, Intern_run_deferred_callbacks, 0);
|
124
|
+
return;
|
125
|
+
}
|
126
|
+
case EM_TIMER_FIRED:
|
127
|
+
{
|
128
|
+
VALUE timer = rb_funcall (EmTimersHash, Intern_delete, 1, ULONG2NUM (data_num));
|
129
|
+
if (timer == Qnil) {
|
130
|
+
rb_raise (EM_eUnknownTimerFired, "no such timer: %lu", data_num);
|
131
|
+
} else if (timer == Qfalse) {
|
132
|
+
/* Timer Canceled */
|
133
|
+
} else {
|
134
|
+
rb_funcall (timer, Intern_call, 0);
|
135
|
+
}
|
136
|
+
return;
|
137
|
+
}
|
138
|
+
#ifdef WITH_SSL
|
139
|
+
case EM_SSL_HANDSHAKE_COMPLETED:
|
140
|
+
{
|
141
|
+
VALUE conn = ensure_conn(signature);
|
142
|
+
rb_funcall (conn, Intern_ssl_handshake_completed, 0);
|
143
|
+
return;
|
144
|
+
}
|
145
|
+
case EM_SSL_VERIFY:
|
146
|
+
{
|
147
|
+
VALUE conn = ensure_conn(signature);
|
148
|
+
VALUE should_accept = rb_funcall (conn, Intern_ssl_verify_peer, 1, rb_str_new(data_str, data_num));
|
149
|
+
if (RTEST(should_accept))
|
150
|
+
evma_accept_ssl_peer (signature);
|
151
|
+
return;
|
152
|
+
}
|
153
|
+
#endif
|
154
|
+
case EM_PROXY_TARGET_UNBOUND:
|
155
|
+
{
|
156
|
+
VALUE conn = ensure_conn(signature);
|
157
|
+
rb_funcall (conn, Intern_proxy_target_unbound, 0);
|
158
|
+
return;
|
159
|
+
}
|
160
|
+
case EM_PROXY_COMPLETED:
|
161
|
+
{
|
162
|
+
VALUE conn = ensure_conn(signature);
|
163
|
+
rb_funcall (conn, Intern_proxy_completed, 0);
|
164
|
+
return;
|
108
165
|
}
|
109
166
|
}
|
110
|
-
#ifdef WITH_SSL
|
111
|
-
else if (a2 == EM_SSL_HANDSHAKE_COMPLETED) {
|
112
|
-
VALUE t = rb_ivar_get (EmModule, Intern_at_conns);
|
113
|
-
VALUE q = rb_hash_aref (t, ULONG2NUM (a1));
|
114
|
-
if (q == Qnil)
|
115
|
-
rb_raise (EM_eConnectionNotBound, "unknown connection: %lu", a1);
|
116
|
-
rb_funcall (q, Intern_ssl_handshake_completed, 0);
|
117
|
-
}
|
118
|
-
else if (a2 == EM_SSL_VERIFY) {
|
119
|
-
VALUE t = rb_ivar_get (EmModule, Intern_at_conns);
|
120
|
-
VALUE q = rb_hash_aref (t, ULONG2NUM (a1));
|
121
|
-
if (q == Qnil)
|
122
|
-
rb_raise (EM_eConnectionNotBound, "unknown connection: %lu", a1);
|
123
|
-
VALUE r = rb_funcall (q, Intern_ssl_verify_peer, 1, rb_str_new(a3, a4));
|
124
|
-
if (RTEST(r))
|
125
|
-
evma_accept_ssl_peer (a1);
|
126
|
-
}
|
127
|
-
#endif
|
128
|
-
else if (a2 == EM_PROXY_TARGET_UNBOUND) {
|
129
|
-
VALUE t = rb_ivar_get (EmModule, Intern_at_conns);
|
130
|
-
VALUE q = rb_hash_aref (t, ULONG2NUM (a1));
|
131
|
-
if (q == Qnil)
|
132
|
-
rb_raise (EM_eConnectionNotBound, "unknown connection: %lu", a1);
|
133
|
-
rb_funcall (q, Intern_proxy_target_unbound, 0);
|
134
|
-
}
|
135
|
-
else
|
136
|
-
rb_funcall (EmModule, Intern_event_callback, 3, ULONG2NUM(a1), INT2FIX(a2), a3 ? rb_str_new(a3,a4) : ULONG2NUM(a4));
|
137
167
|
}
|
138
168
|
|
139
169
|
/*******************
|
@@ -150,13 +180,13 @@ static void event_error_handler(VALUE unused, VALUE err)
|
|
150
180
|
event_callback_wrapper
|
151
181
|
**********************/
|
152
182
|
|
153
|
-
static void event_callback_wrapper (const unsigned long
|
183
|
+
static void event_callback_wrapper (const unsigned long signature, int event, const char *data_str, const unsigned long data_num)
|
154
184
|
{
|
155
185
|
struct em_event e;
|
156
|
-
e.
|
157
|
-
e.
|
158
|
-
e.
|
159
|
-
e.
|
186
|
+
e.signature = signature;
|
187
|
+
e.event = event;
|
188
|
+
e.data_str = data_str;
|
189
|
+
e.data_num = data_num;
|
160
190
|
|
161
191
|
if (!rb_ivar_defined(EmModule, Intern_at_error_handler))
|
162
192
|
event_callback(&e);
|
@@ -170,7 +200,11 @@ t_initialize_event_machine
|
|
170
200
|
|
171
201
|
static VALUE t_initialize_event_machine (VALUE self)
|
172
202
|
{
|
173
|
-
|
203
|
+
EmConnsHash = rb_ivar_get (EmModule, Intern_at_conns);
|
204
|
+
EmTimersHash = rb_ivar_get (EmModule, Intern_at_timers);
|
205
|
+
assert(EmConnsHash != Qnil);
|
206
|
+
assert(EmTimersHash != Qnil);
|
207
|
+
evma_initialize_library ((EMCallback)event_callback_wrapper);
|
174
208
|
return Qnil;
|
175
209
|
}
|
176
210
|
|
@@ -208,7 +242,7 @@ static VALUE t_start_server (VALUE self, VALUE server, VALUE port)
|
|
208
242
|
{
|
209
243
|
const unsigned long f = evma_create_tcp_server (StringValuePtr(server), FIX2INT(port));
|
210
244
|
if (!f)
|
211
|
-
rb_raise (rb_eRuntimeError, "no acceptor");
|
245
|
+
rb_raise (rb_eRuntimeError, "no acceptor (port is in use or requires root privileges)");
|
212
246
|
return ULONG2NUM (f);
|
213
247
|
}
|
214
248
|
|
@@ -467,6 +501,7 @@ static VALUE t_connect_server (VALUE self, VALUE server, VALUE port)
|
|
467
501
|
} catch (std::runtime_error e) {
|
468
502
|
rb_raise (EM_eConnectionError, e.what());
|
469
503
|
}
|
504
|
+
return Qnil;
|
470
505
|
}
|
471
506
|
|
472
507
|
/*********************
|
@@ -487,6 +522,7 @@ static VALUE t_bind_connect_server (VALUE self, VALUE bind_addr, VALUE bind_port
|
|
487
522
|
} catch (std::runtime_error e) {
|
488
523
|
rb_raise (EM_eConnectionError, e.what());
|
489
524
|
}
|
525
|
+
return Qnil;
|
490
526
|
}
|
491
527
|
|
492
528
|
/*********************
|
@@ -701,18 +737,6 @@ static VALUE t_setuid_string (VALUE self, VALUE username)
|
|
701
737
|
|
702
738
|
|
703
739
|
|
704
|
-
/*************
|
705
|
-
t__write_file
|
706
|
-
*************/
|
707
|
-
|
708
|
-
static VALUE t__write_file (VALUE self, VALUE filename)
|
709
|
-
{
|
710
|
-
const unsigned long f = evma__write_file (StringValuePtr (filename));
|
711
|
-
if (!f)
|
712
|
-
rb_raise (rb_eRuntimeError, "file not opened");
|
713
|
-
return ULONG2NUM (f);
|
714
|
-
}
|
715
|
-
|
716
740
|
/**************
|
717
741
|
t_invoke_popen
|
718
742
|
**************/
|
@@ -725,9 +749,9 @@ static VALUE t_invoke_popen (VALUE self, VALUE cmd)
|
|
725
749
|
#else
|
726
750
|
int len = RARRAY (cmd)->len;
|
727
751
|
#endif
|
728
|
-
if (len
|
752
|
+
if (len >= 2048)
|
729
753
|
rb_raise (rb_eRuntimeError, "too many arguments to popen");
|
730
|
-
char *strings [
|
754
|
+
char *strings [2048];
|
731
755
|
for (int i=0; i < len; i++) {
|
732
756
|
VALUE ix = INT2FIX (i);
|
733
757
|
VALUE s = rb_ary_aref (1, &ix, cmd);
|
@@ -769,8 +793,9 @@ static VALUE t_watch_filename (VALUE self, VALUE fname)
|
|
769
793
|
try {
|
770
794
|
return ULONG2NUM(evma_watch_filename(StringValuePtr(fname)));
|
771
795
|
} catch (std::runtime_error e) {
|
772
|
-
|
796
|
+
rb_raise (EM_eUnsupported, e.what());
|
773
797
|
}
|
798
|
+
return Qnil;
|
774
799
|
}
|
775
800
|
|
776
801
|
|
@@ -794,8 +819,9 @@ static VALUE t_watch_pid (VALUE self, VALUE pid)
|
|
794
819
|
try {
|
795
820
|
return ULONG2NUM(evma_watch_pid(NUM2INT(pid)));
|
796
821
|
} catch (std::runtime_error e) {
|
797
|
-
|
822
|
+
rb_raise (EM_eUnsupported, e.what());
|
798
823
|
}
|
824
|
+
return Qnil;
|
799
825
|
}
|
800
826
|
|
801
827
|
|
@@ -972,11 +998,12 @@ static VALUE t_get_loop_time (VALUE self)
|
|
972
998
|
static ID at = rb_intern("at");
|
973
999
|
#endif
|
974
1000
|
|
975
|
-
|
1001
|
+
uint64_t current_time = evma_get_current_loop_time();
|
1002
|
+
if (current_time != 0) {
|
976
1003
|
#ifndef HAVE_RB_TIME_NEW
|
977
|
-
return rb_funcall(cTime, at, 2, INT2NUM(
|
1004
|
+
return rb_funcall(cTime, at, 2, INT2NUM(current_time / 1000000), INT2NUM(current_time % 1000000));
|
978
1005
|
#else
|
979
|
-
return rb_time_new(
|
1006
|
+
return rb_time_new(current_time / 1000000, current_time % 1000000);
|
980
1007
|
#endif
|
981
1008
|
}
|
982
1009
|
return Qnil;
|
@@ -987,9 +1014,13 @@ static VALUE t_get_loop_time (VALUE self)
|
|
987
1014
|
t_start_proxy
|
988
1015
|
**************/
|
989
1016
|
|
990
|
-
static VALUE t_start_proxy (VALUE self, VALUE from, VALUE to, VALUE bufsize)
|
1017
|
+
static VALUE t_start_proxy (VALUE self, VALUE from, VALUE to, VALUE bufsize, VALUE length)
|
991
1018
|
{
|
992
|
-
|
1019
|
+
try {
|
1020
|
+
evma_start_proxy(NUM2ULONG (from), NUM2ULONG (to), NUM2ULONG(bufsize), NUM2ULONG(length));
|
1021
|
+
} catch (std::runtime_error e) {
|
1022
|
+
rb_raise (EM_eConnectionError, e.what());
|
1023
|
+
}
|
993
1024
|
return Qnil;
|
994
1025
|
}
|
995
1026
|
|
@@ -1000,7 +1031,11 @@ t_stop_proxy
|
|
1000
1031
|
|
1001
1032
|
static VALUE t_stop_proxy (VALUE self, VALUE from)
|
1002
1033
|
{
|
1003
|
-
|
1034
|
+
try{
|
1035
|
+
evma_stop_proxy(NUM2ULONG (from));
|
1036
|
+
} catch (std::runtime_error e) {
|
1037
|
+
rb_raise (EM_eConnectionError, e.what());
|
1038
|
+
}
|
1004
1039
|
return Qnil;
|
1005
1040
|
}
|
1006
1041
|
|
@@ -1054,6 +1089,8 @@ extern "C" void Init_rubyeventmachine()
|
|
1054
1089
|
Intern_notify_readable = rb_intern ("notify_readable");
|
1055
1090
|
Intern_notify_writable = rb_intern ("notify_writable");
|
1056
1091
|
Intern_proxy_target_unbound = rb_intern ("proxy_target_unbound");
|
1092
|
+
Intern_proxy_completed = rb_intern ("proxy_completed");
|
1093
|
+
Intern_connection_completed = rb_intern ("connection_completed");
|
1057
1094
|
|
1058
1095
|
// INCOMPLETE, we need to define class Connections inside module EventMachine
|
1059
1096
|
// run_machine and run_machine_without_threads are now identical.
|
@@ -1097,7 +1134,7 @@ extern "C" void Init_rubyeventmachine()
|
|
1097
1134
|
rb_define_module_function (EmModule, "resume_connection", (VALUE (*)(...))t_resume, 1);
|
1098
1135
|
rb_define_module_function (EmModule, "connection_paused?", (VALUE (*)(...))t_paused_p, 1);
|
1099
1136
|
|
1100
|
-
rb_define_module_function (EmModule, "start_proxy", (VALUE (*)(...))t_start_proxy,
|
1137
|
+
rb_define_module_function (EmModule, "start_proxy", (VALUE (*)(...))t_start_proxy, 4);
|
1101
1138
|
rb_define_module_function (EmModule, "stop_proxy", (VALUE (*)(...))t_stop_proxy, 1);
|
1102
1139
|
|
1103
1140
|
rb_define_module_function (EmModule, "watch_filename", (VALUE (*)(...))t_watch_filename, 1);
|
@@ -1123,9 +1160,6 @@ extern "C" void Init_rubyeventmachine()
|
|
1123
1160
|
rb_define_module_function (EmModule, "get_heartbeat_interval", (VALUE(*)(...))t_get_heartbeat_interval, 0);
|
1124
1161
|
rb_define_module_function (EmModule, "set_heartbeat_interval", (VALUE(*)(...))t_set_heartbeat_interval, 1);
|
1125
1162
|
|
1126
|
-
// Provisional:
|
1127
|
-
rb_define_module_function (EmModule, "_write_file", (VALUE(*)(...))t__write_file, 1);
|
1128
|
-
|
1129
1163
|
rb_define_module_function (EmModule, "get_peername", (VALUE(*)(...))t_get_peername, 1);
|
1130
1164
|
rb_define_module_function (EmModule, "get_sockname", (VALUE(*)(...))t_get_sockname, 1);
|
1131
1165
|
rb_define_module_function (EmModule, "get_subprocess_pid", (VALUE(*)(...))t_get_subprocess_pid, 1);
|