eventmachine 1.0.0.beta.1-java → 1.0.0.beta.2-java
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/Rakefile +7 -298
- data/eventmachine.gemspec +1 -1
- data/ext/cmain.cpp +0 -14
- data/ext/em.cpp +3 -36
- data/ext/em.h +2 -13
- data/ext/eventmachine.h +0 -1
- data/ext/extconf.rb +53 -46
- data/ext/project.h +0 -4
- data/ext/rubymain.cpp +0 -15
- data/lib/em/pure_ruby.rb +3 -2
- data/lib/em/version.rb +1 -1
- data/lib/eventmachine.rb +2 -0
- data/lib/jeventmachine.rb +1 -1
- data/tasks/doc.rake +30 -0
- data/tasks/package.rake +85 -0
- data/tasks/test.rake +6 -0
- metadata +184 -213
- 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/ext/cplusplus.cpp
DELETED
@@ -1,202 +0,0 @@
|
|
1
|
-
/*****************************************************************************
|
2
|
-
|
3
|
-
$Id$
|
4
|
-
|
5
|
-
File: cplusplus.cpp
|
6
|
-
Date: 27Jul07
|
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
|
-
#include "project.h"
|
22
|
-
|
23
|
-
|
24
|
-
namespace EM {
|
25
|
-
static map<unsigned long, Eventable*> Eventables;
|
26
|
-
static map<unsigned long, void(*)()> Timers;
|
27
|
-
}
|
28
|
-
|
29
|
-
|
30
|
-
/*******
|
31
|
-
EM::Run
|
32
|
-
*******/
|
33
|
-
|
34
|
-
void EM::Run (void (*start_func)())
|
35
|
-
{
|
36
|
-
evma_set_epoll (1);
|
37
|
-
evma_initialize_library ((EMCallback)EM::Callback);
|
38
|
-
if (start_func)
|
39
|
-
AddTimer (0, start_func);
|
40
|
-
evma_run_machine();
|
41
|
-
evma_release_library();
|
42
|
-
}
|
43
|
-
|
44
|
-
/************
|
45
|
-
EM::AddTimer
|
46
|
-
************/
|
47
|
-
|
48
|
-
void EM::AddTimer (int milliseconds, void (*func)())
|
49
|
-
{
|
50
|
-
if (func) {
|
51
|
-
const unsigned long sig = evma_install_oneshot_timer (milliseconds);
|
52
|
-
#ifndef HAVE_MAKE_PAIR
|
53
|
-
Timers.insert (map<unsigned long, void(*)()>::value_type (sig, func));
|
54
|
-
#else
|
55
|
-
Timers.insert (make_pair (sig, func));
|
56
|
-
#endif
|
57
|
-
}
|
58
|
-
}
|
59
|
-
|
60
|
-
|
61
|
-
/***************
|
62
|
-
EM::StopReactor
|
63
|
-
***************/
|
64
|
-
|
65
|
-
void EM::StopReactor()
|
66
|
-
{
|
67
|
-
evma_stop_machine();
|
68
|
-
}
|
69
|
-
|
70
|
-
|
71
|
-
/********************
|
72
|
-
EM::Acceptor::Accept
|
73
|
-
********************/
|
74
|
-
|
75
|
-
void EM::Acceptor::Accept (const unsigned long signature)
|
76
|
-
{
|
77
|
-
Connection *c = MakeConnection();
|
78
|
-
c->Signature = signature;
|
79
|
-
#ifndef HAVE_MAKE_PAIR
|
80
|
-
Eventables.insert (std::map<unsigned long,EM::Eventable*>::value_type (c->Signature, c));
|
81
|
-
#else
|
82
|
-
Eventables.insert (make_pair (c->Signature, c));
|
83
|
-
#endif
|
84
|
-
c->PostInit();
|
85
|
-
}
|
86
|
-
|
87
|
-
/************************
|
88
|
-
EM::Connection::SendData
|
89
|
-
************************/
|
90
|
-
|
91
|
-
void EM::Connection::SendData (const char *data)
|
92
|
-
{
|
93
|
-
if (data)
|
94
|
-
SendData (data, strlen (data));
|
95
|
-
}
|
96
|
-
|
97
|
-
|
98
|
-
/************************
|
99
|
-
EM::Connection::SendData
|
100
|
-
************************/
|
101
|
-
|
102
|
-
void EM::Connection::SendData (const char *data, int length)
|
103
|
-
{
|
104
|
-
evma_send_data_to_connection (Signature, data, length);
|
105
|
-
}
|
106
|
-
|
107
|
-
|
108
|
-
/*********************
|
109
|
-
EM::Connection::Close
|
110
|
-
*********************/
|
111
|
-
|
112
|
-
void EM::Connection::Close (bool afterWriting)
|
113
|
-
{
|
114
|
-
evma_close_connection (Signature, afterWriting);
|
115
|
-
}
|
116
|
-
|
117
|
-
|
118
|
-
/***************************
|
119
|
-
EM::Connection::BindConnect
|
120
|
-
***************************/
|
121
|
-
|
122
|
-
void EM::Connection::BindConnect (const char *bind_addr, int bind_port, const char *host, int port)
|
123
|
-
{
|
124
|
-
Signature = evma_connect_to_server (bind_addr, bind_port, host, port);
|
125
|
-
#ifndef HAVE_MAKE_PAIR
|
126
|
-
Eventables.insert (std::map<unsigned long,EM::Eventable*>::value_type (Signature, this));
|
127
|
-
#else
|
128
|
-
Eventables.insert (make_pair (Signature, this));
|
129
|
-
#endif
|
130
|
-
}
|
131
|
-
|
132
|
-
/***********************
|
133
|
-
EM::Connection::Connect
|
134
|
-
***********************/
|
135
|
-
|
136
|
-
void EM::Connection::Connect (const char *host, int port)
|
137
|
-
{
|
138
|
-
this->BindConnect(NULL, 0, host, port);
|
139
|
-
}
|
140
|
-
|
141
|
-
/*******************
|
142
|
-
EM::Acceptor::Start
|
143
|
-
*******************/
|
144
|
-
|
145
|
-
void EM::Acceptor::Start (const char *host, int port)
|
146
|
-
{
|
147
|
-
Signature = evma_create_tcp_server (host, port);
|
148
|
-
#ifndef HAVE_MAKE_PAIR
|
149
|
-
Eventables.insert (std::map<unsigned long,EM::Eventable*>::value_type (Signature, this));
|
150
|
-
#else
|
151
|
-
Eventables.insert (make_pair (Signature, this));
|
152
|
-
#endif
|
153
|
-
}
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
/************
|
158
|
-
EM::Callback
|
159
|
-
************/
|
160
|
-
|
161
|
-
void EM::Callback (const unsigned long sig, int ev, const char *data, const unsigned long length)
|
162
|
-
{
|
163
|
-
EM::Eventable *e;
|
164
|
-
void (*f)();
|
165
|
-
|
166
|
-
switch (ev) {
|
167
|
-
case EM_TIMER_FIRED:
|
168
|
-
f = Timers [length]; // actually a binding
|
169
|
-
if (f)
|
170
|
-
(*f)();
|
171
|
-
Timers.erase (length);
|
172
|
-
break;
|
173
|
-
|
174
|
-
case EM_CONNECTION_READ:
|
175
|
-
e = EM::Eventables [sig];
|
176
|
-
e->ReceiveData (data, length);
|
177
|
-
break;
|
178
|
-
|
179
|
-
case EM_CONNECTION_COMPLETED:
|
180
|
-
e = EM::Eventables [sig];
|
181
|
-
e->ConnectionCompleted();
|
182
|
-
break;
|
183
|
-
|
184
|
-
case EM_CONNECTION_ACCEPTED:
|
185
|
-
e = EM::Eventables [sig];
|
186
|
-
e->Accept (length); // actually a binding
|
187
|
-
break;
|
188
|
-
|
189
|
-
case EM_CONNECTION_UNBOUND:
|
190
|
-
e = EM::Eventables [sig];
|
191
|
-
e->Unbind();
|
192
|
-
EM::Eventables.erase (sig);
|
193
|
-
delete e;
|
194
|
-
break;
|
195
|
-
|
196
|
-
case EM_SSL_HANDSHAKE_COMPLETED:
|
197
|
-
e = EM::Eventables [sig];
|
198
|
-
e->SslHandshakeCompleted();
|
199
|
-
break;
|
200
|
-
}
|
201
|
-
}
|
202
|
-
|
data/ext/emwin.cpp
DELETED
@@ -1,300 +0,0 @@
|
|
1
|
-
/*****************************************************************************
|
2
|
-
|
3
|
-
$Id$
|
4
|
-
|
5
|
-
File: emwin.cpp
|
6
|
-
Date: 05May06
|
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
|
-
// THIS ENTIRE FILE IS FOR WINDOWS BUILDS ONLY
|
22
|
-
// INCOMPLETE AND DISABLED FOR NOW.
|
23
|
-
#ifdef xOS_WIN32
|
24
|
-
|
25
|
-
#include "project.h"
|
26
|
-
|
27
|
-
|
28
|
-
// Keep a global variable floating around
|
29
|
-
// with the current loop time as set by the Event Machine.
|
30
|
-
// This avoids the need for frequent expensive calls to time(NULL);
|
31
|
-
time_t gCurrentLoopTime;
|
32
|
-
|
33
|
-
|
34
|
-
/******************************
|
35
|
-
EventMachine_t::EventMachine_t
|
36
|
-
******************************/
|
37
|
-
|
38
|
-
EventMachine_t::EventMachine_t (void (*event_callback)(const char*, int, const char*, int)):
|
39
|
-
EventCallback (event_callback),
|
40
|
-
NextHeartbeatTime (0)
|
41
|
-
{
|
42
|
-
gTerminateSignalReceived = false;
|
43
|
-
Iocp = NULL;
|
44
|
-
}
|
45
|
-
|
46
|
-
|
47
|
-
/*******************************
|
48
|
-
EventMachine_t::~EventMachine_t
|
49
|
-
*******************************/
|
50
|
-
|
51
|
-
EventMachine_t::~EventMachine_t()
|
52
|
-
{
|
53
|
-
cerr << "EM __dt\n";
|
54
|
-
if (Iocp)
|
55
|
-
CloseHandle (Iocp);
|
56
|
-
}
|
57
|
-
|
58
|
-
|
59
|
-
/****************************
|
60
|
-
EventMachine_t::ScheduleHalt
|
61
|
-
****************************/
|
62
|
-
|
63
|
-
void EventMachine_t::ScheduleHalt()
|
64
|
-
{
|
65
|
-
/* This is how we stop the machine.
|
66
|
-
* This can be called by clients. Signal handlers will probably
|
67
|
-
* set the global flag.
|
68
|
-
* For now this means there can only be one EventMachine ever running at a time.
|
69
|
-
*/
|
70
|
-
gTerminateSignalReceived = true;
|
71
|
-
}
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
/*******************
|
76
|
-
EventMachine_t::Run
|
77
|
-
*******************/
|
78
|
-
|
79
|
-
void EventMachine_t::Run()
|
80
|
-
{
|
81
|
-
HookControlC (true);
|
82
|
-
|
83
|
-
Iocp = CreateIoCompletionPort (INVALID_HANDLE_VALUE, NULL, 0, 0);
|
84
|
-
if (Iocp == NULL)
|
85
|
-
throw std::runtime_error ("no completion port");
|
86
|
-
|
87
|
-
|
88
|
-
DWORD nBytes, nCompletionKey;
|
89
|
-
LPOVERLAPPED Overlapped;
|
90
|
-
|
91
|
-
do {
|
92
|
-
gCurrentLoopTime = time(NULL);
|
93
|
-
// Have some kind of strategy that will dequeue maybe up to 10 completions
|
94
|
-
// without running the timers as long as they are available immediately.
|
95
|
-
// Otherwise in a busy server we're calling them every time through the loop.
|
96
|
-
if (!_RunTimers())
|
97
|
-
break;
|
98
|
-
if (GetQueuedCompletionStatus (Iocp, &nBytes, &nCompletionKey, &Overlapped, 1000)) {
|
99
|
-
}
|
100
|
-
cerr << "+";
|
101
|
-
} while (!gTerminateSignalReceived);
|
102
|
-
|
103
|
-
|
104
|
-
/*
|
105
|
-
while (true) {
|
106
|
-
gCurrentLoopTime = time(NULL);
|
107
|
-
if (!_RunTimers())
|
108
|
-
break;
|
109
|
-
_AddNewDescriptors();
|
110
|
-
if (!_RunOnce())
|
111
|
-
break;
|
112
|
-
if (gTerminateSignalReceived)
|
113
|
-
break;
|
114
|
-
}
|
115
|
-
*/
|
116
|
-
|
117
|
-
HookControlC (false);
|
118
|
-
}
|
119
|
-
|
120
|
-
|
121
|
-
/**************************
|
122
|
-
EventMachine_t::_RunTimers
|
123
|
-
**************************/
|
124
|
-
|
125
|
-
bool EventMachine_t::_RunTimers()
|
126
|
-
{
|
127
|
-
// These are caller-defined timer handlers.
|
128
|
-
// Return T/F to indicate whether we should continue the main loop.
|
129
|
-
// We rely on the fact that multimaps sort by their keys to avoid
|
130
|
-
// inspecting the whole list every time we come here.
|
131
|
-
// Just keep inspecting and processing the list head until we hit
|
132
|
-
// one that hasn't expired yet.
|
133
|
-
|
134
|
-
while (true) {
|
135
|
-
multimap<time_t,Timer_t>::iterator i = Timers.begin();
|
136
|
-
if (i == Timers.end())
|
137
|
-
break;
|
138
|
-
if (i->first > gCurrentLoopTime)
|
139
|
-
break;
|
140
|
-
if (EventCallback)
|
141
|
-
(*EventCallback) (NULL, EM_TIMER_FIRED, NULL, i->second.GetBinding());
|
142
|
-
Timers.erase (i);
|
143
|
-
}
|
144
|
-
return true;
|
145
|
-
}
|
146
|
-
|
147
|
-
|
148
|
-
/***********************************
|
149
|
-
EventMachine_t::InstallOneshotTimer
|
150
|
-
***********************************/
|
151
|
-
|
152
|
-
const char *EventMachine_t::InstallOneshotTimer (int seconds)
|
153
|
-
{
|
154
|
-
if (Timers.size() > MaxOutstandingTimers)
|
155
|
-
return false;
|
156
|
-
// Don't use the global loop-time variable here, because we might
|
157
|
-
// get called before the main event machine is running.
|
158
|
-
|
159
|
-
Timer_t t;
|
160
|
-
Timers.insert (make_pair (time(NULL) + seconds, t));
|
161
|
-
return t.GetBinding();
|
162
|
-
}
|
163
|
-
|
164
|
-
|
165
|
-
/**********************************
|
166
|
-
EventMachine_t::OpenDatagramSocket
|
167
|
-
**********************************/
|
168
|
-
|
169
|
-
const char *EventMachine_t::OpenDatagramSocket (const char *address, int port)
|
170
|
-
{
|
171
|
-
cerr << "OPEN DATAGRAM SOCKET\n";
|
172
|
-
return "Unimplemented";
|
173
|
-
}
|
174
|
-
|
175
|
-
|
176
|
-
/*******************************
|
177
|
-
EventMachine_t::CreateTcpServer
|
178
|
-
*******************************/
|
179
|
-
|
180
|
-
const char *EventMachine_t::CreateTcpServer (const char *server, int port)
|
181
|
-
{
|
182
|
-
/* Create a TCP-acceptor (server) socket and add it to the event machine.
|
183
|
-
* Return the binding of the new acceptor to the caller.
|
184
|
-
* This binding will be referenced when the new acceptor sends events
|
185
|
-
* to indicate accepted connections.
|
186
|
-
*/
|
187
|
-
|
188
|
-
const char *output_binding = NULL;
|
189
|
-
|
190
|
-
struct sockaddr_in sin;
|
191
|
-
|
192
|
-
SOCKET sd_accept = socket (AF_INET, SOCK_STREAM, 0);
|
193
|
-
if (sd_accept == INVALID_SOCKET) {
|
194
|
-
goto fail;
|
195
|
-
}
|
196
|
-
|
197
|
-
memset (&sin, 0, sizeof(sin));
|
198
|
-
sin.sin_family = AF_INET;
|
199
|
-
sin.sin_addr.s_addr = INADDR_ANY;
|
200
|
-
sin.sin_port = htons (port);
|
201
|
-
|
202
|
-
if (server && *server) {
|
203
|
-
sin.sin_addr.s_addr = inet_addr (server);
|
204
|
-
if (sin.sin_addr.s_addr == INADDR_NONE) {
|
205
|
-
hostent *hp = gethostbyname (server);
|
206
|
-
if (hp == NULL) {
|
207
|
-
//__warning ("hostname not resolved: ", server);
|
208
|
-
goto fail;
|
209
|
-
}
|
210
|
-
sin.sin_addr.s_addr = ((in_addr*)(hp->h_addr))->s_addr;
|
211
|
-
}
|
212
|
-
}
|
213
|
-
|
214
|
-
|
215
|
-
// No need to set reuseaddr on Windows.
|
216
|
-
|
217
|
-
|
218
|
-
if (bind (sd_accept, (struct sockaddr*)&sin, sizeof(sin))) {
|
219
|
-
//__warning ("binding failed");
|
220
|
-
goto fail;
|
221
|
-
}
|
222
|
-
|
223
|
-
if (listen (sd_accept, 100)) {
|
224
|
-
//__warning ("listen failed");
|
225
|
-
goto fail;
|
226
|
-
}
|
227
|
-
|
228
|
-
{ // Looking good.
|
229
|
-
AcceptorDescriptor *ad = new AcceptorDescriptor (this, sd_accept);
|
230
|
-
if (!ad)
|
231
|
-
throw std::runtime_error ("unable to allocate acceptor");
|
232
|
-
Add (ad);
|
233
|
-
output_binding = ad->GetBinding();
|
234
|
-
|
235
|
-
CreateIoCompletionPort ((HANDLE)sd_accept, Iocp, NULL, 0);
|
236
|
-
SOCKET sd = socket (AF_INET, SOCK_STREAM, 0);
|
237
|
-
CreateIoCompletionPort ((HANDLE)sd, Iocp, NULL, 0);
|
238
|
-
AcceptEx (sd_accept, sd,
|
239
|
-
}
|
240
|
-
|
241
|
-
return output_binding;
|
242
|
-
|
243
|
-
fail:
|
244
|
-
if (sd_accept != INVALID_SOCKET)
|
245
|
-
closesocket (sd_accept);
|
246
|
-
return NULL;
|
247
|
-
}
|
248
|
-
|
249
|
-
|
250
|
-
/*******************************
|
251
|
-
EventMachine_t::ConnectToServer
|
252
|
-
*******************************/
|
253
|
-
|
254
|
-
const char *EventMachine_t::ConnectToServer (const char *server, int port)
|
255
|
-
{
|
256
|
-
if (!server || !*server || !port)
|
257
|
-
return NULL;
|
258
|
-
|
259
|
-
sockaddr_in pin;
|
260
|
-
unsigned long HostAddr;
|
261
|
-
|
262
|
-
HostAddr = inet_addr (server);
|
263
|
-
if (HostAddr == INADDR_NONE) {
|
264
|
-
hostent *hp = gethostbyname (server);
|
265
|
-
if (!hp)
|
266
|
-
return NULL;
|
267
|
-
HostAddr = ((in_addr*)(hp->h_addr))->s_addr;
|
268
|
-
}
|
269
|
-
|
270
|
-
memset (&pin, 0, sizeof(pin));
|
271
|
-
pin.sin_family = AF_INET;
|
272
|
-
pin.sin_addr.s_addr = HostAddr;
|
273
|
-
pin.sin_port = htons (port);
|
274
|
-
|
275
|
-
int sd = socket (AF_INET, SOCK_STREAM, 0);
|
276
|
-
if (sd == INVALID_SOCKET)
|
277
|
-
return NULL;
|
278
|
-
|
279
|
-
|
280
|
-
LPOVERLAPPED olap = (LPOVERLAPPED) calloc (1, sizeof (OVERLAPPED));
|
281
|
-
cerr << "I'm dying now\n";
|
282
|
-
throw runtime_error ("UNIMPLEMENTED!!!\n");
|
283
|
-
|
284
|
-
}
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
/*******************
|
289
|
-
EventMachine_t::Add
|
290
|
-
*******************/
|
291
|
-
|
292
|
-
void EventMachine_t::Add (EventableDescriptor *ed)
|
293
|
-
{
|
294
|
-
cerr << "ADD\n";
|
295
|
-
}
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
#endif // OS_WIN32
|
300
|
-
|