eventmachine 0.8.0 → 0.8.1
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/README +9 -5
- data/ext/autoscan.log +0 -0
- data/ext/cmain.cpp +76 -1
- data/ext/cplusplus.cpp +175 -0
- data/ext/ed.cpp +27 -2
- data/ext/ed.h +4 -1
- data/ext/eventmachine.h +3 -1
- data/ext/eventmachine_cpp.h +94 -0
- data/ext/extconf.rb +7 -1
- data/ext/project.h +9 -3
- data/ext/rubymain.cpp +44 -1
- data/lib/em/deferrable.rb +30 -5
- data/lib/em/streamer.rb +114 -0
- data/lib/eventmachine.rb +50 -2
- data/lib/eventmachine_version.rb +2 -2
- data/lib/jeventmachine.rb +106 -0
- data/lib/protocols/linetext2.rb +145 -0
- data/lib/protocols/stomp.rb +127 -0
- data/tests/test_basic.rb +10 -8
- data/tests/test_epoll.rb +8 -5
- data/tests/test_ltp.rb +7 -1
- data/tests/test_ltp2.rb +260 -0
- data/tests/test_send_file.rb +236 -0
- data/tests/test_servers.rb +87 -0
- metadata +12 -2
data/ext/extconf.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# $Id: extconf.rb
|
1
|
+
# $Id: extconf.rb 404 2007-07-13 01:07:28Z blackhedd $
|
2
2
|
#
|
3
3
|
#----------------------------------------------------------------------------
|
4
4
|
#
|
@@ -71,6 +71,12 @@ when /solaris/
|
|
71
71
|
# on Unix we need a g++ link, not gcc.
|
72
72
|
CONFIG['LDSHARED'] = "$(CXX) -shared"
|
73
73
|
|
74
|
+
# Patch by Tim Pease, fixes SUNWspro compile problems.
|
75
|
+
if CONFIG['CC'] == 'cc'
|
76
|
+
$CFLAGS = CONFIG['CFLAGS'] = "-g -O2 -fPIC"
|
77
|
+
CONFIG['CCDLFLAGS'] = "-fPIC"
|
78
|
+
end
|
79
|
+
|
74
80
|
when /darwin/
|
75
81
|
flags << '-DOS_UNIX'
|
76
82
|
flags << '-DBUILD_FOR_RUBY'
|
data/ext/project.h
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
/*****************************************************************************
|
2
2
|
|
3
|
-
$Id: project.h
|
3
|
+
$Id: project.h 490 2007-07-30 12:51:33Z blackhedd $
|
4
4
|
|
5
5
|
File: project.h
|
6
6
|
Date: 06Apr06
|
@@ -39,7 +39,10 @@ See the file COPYING for complete licensing information.
|
|
39
39
|
#ifdef OS_UNIX
|
40
40
|
#include <signal.h>
|
41
41
|
#include <netdb.h>
|
42
|
+
#include <time.h>
|
43
|
+
#include <sys/time.h>
|
42
44
|
#include <sys/types.h>
|
45
|
+
#include <sys/stat.h>
|
43
46
|
#include <sys/socket.h>
|
44
47
|
#include <sys/un.h>
|
45
48
|
#include <sys/resource.h>
|
@@ -62,8 +65,10 @@ typedef int SOCKET;
|
|
62
65
|
#ifndef AF_LOCAL
|
63
66
|
#define AF_LOCAL AF_UNIX
|
64
67
|
#endif
|
65
|
-
//
|
66
|
-
|
68
|
+
// INADDR_NONE is undefined on Solaris < 8. Thanks to Brett Eisenberg and Tim Pease.
|
69
|
+
#ifndef INADDR_NONE
|
70
|
+
#define INADDR_NONE ((unsigned long)-1)
|
71
|
+
#endif
|
67
72
|
#endif
|
68
73
|
#endif
|
69
74
|
|
@@ -100,6 +105,7 @@ using namespace std;
|
|
100
105
|
#include "page.h"
|
101
106
|
#include "ssl.h"
|
102
107
|
#include "eventmachine.h"
|
108
|
+
#include "eventmachine_cpp.h"
|
103
109
|
|
104
110
|
|
105
111
|
|
data/ext/rubymain.cpp
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
/*****************************************************************************
|
2
2
|
|
3
|
-
$Id: rubymain.cpp
|
3
|
+
$Id: rubymain.cpp 476 2007-07-27 03:32:51Z blackhedd $
|
4
4
|
|
5
5
|
File: rubymain.cpp
|
6
6
|
Date: 06Apr06
|
@@ -92,6 +92,16 @@ static VALUE t_start_server (VALUE self, VALUE server, VALUE port)
|
|
92
92
|
return rb_str_new2 (f);
|
93
93
|
}
|
94
94
|
|
95
|
+
/*************
|
96
|
+
t_stop_server
|
97
|
+
*************/
|
98
|
+
|
99
|
+
static VALUE t_stop_server (VALUE self, VALUE signature)
|
100
|
+
{
|
101
|
+
evma_stop_tcp_server (StringValuePtr (signature));
|
102
|
+
return Qnil;
|
103
|
+
}
|
104
|
+
|
95
105
|
|
96
106
|
/*******************
|
97
107
|
t_start_unix_server
|
@@ -363,6 +373,37 @@ static VALUE t__epoll (VALUE self)
|
|
363
373
|
}
|
364
374
|
|
365
375
|
|
376
|
+
/****************
|
377
|
+
t_send_file_data
|
378
|
+
****************/
|
379
|
+
|
380
|
+
static VALUE t_send_file_data (VALUE self, VALUE signature, VALUE filename)
|
381
|
+
{
|
382
|
+
|
383
|
+
/* The current implementation of evma_send_file_data_to_connection enforces a strict
|
384
|
+
* upper limit on the file size it will transmit (currently 32K). The function returns
|
385
|
+
* zero on success, -1 if the requested file exceeds its size limit, and a positive
|
386
|
+
* number for other errors.
|
387
|
+
* TODO: Positive return values are actually errno's, which is probably the wrong way to
|
388
|
+
* do this. For one thing it's ugly. For another, we can't be sure zero is never a real errno.
|
389
|
+
*/
|
390
|
+
|
391
|
+
int b = evma_send_file_data_to_connection (StringValuePtr(signature), StringValuePtr(filename));
|
392
|
+
if (b == -1)
|
393
|
+
rb_raise(rb_eRuntimeError, "File too large. send_file_data() supports files under 32k.");
|
394
|
+
if (b > 0) {
|
395
|
+
char *err = strerror (b);
|
396
|
+
char buf[1024];
|
397
|
+
memset (buf, 0, sizeof(buf));
|
398
|
+
snprintf (buf, sizeof(buf)-1, ": %s %s", StringValuePtr(filename),(err?err:"???"));
|
399
|
+
|
400
|
+
rb_raise (rb_eIOError, buf);
|
401
|
+
}
|
402
|
+
|
403
|
+
return INT2NUM (0);
|
404
|
+
}
|
405
|
+
|
406
|
+
|
366
407
|
/*******************
|
367
408
|
t_set_rlimit_nofile
|
368
409
|
*******************/
|
@@ -409,6 +450,7 @@ extern "C" void Init_rubyeventmachine()
|
|
409
450
|
rb_define_module_function (EmModule, "run_machine_without_threads", (VALUE(*)(...))t_run_machine_without_threads, 0);
|
410
451
|
rb_define_module_function (EmModule, "add_oneshot_timer", (VALUE(*)(...))t_add_oneshot_timer, 1);
|
411
452
|
rb_define_module_function (EmModule, "start_tcp_server", (VALUE(*)(...))t_start_server, 2);
|
453
|
+
rb_define_module_function (EmModule, "stop_tcp_server", (VALUE(*)(...))t_stop_server, 1);
|
412
454
|
rb_define_module_function (EmModule, "start_unix_server", (VALUE(*)(...))t_start_unix_server, 1);
|
413
455
|
rb_define_module_function (EmModule, "start_tls", (VALUE(*)(...))t_start_tls, 1);
|
414
456
|
rb_define_module_function (EmModule, "send_data", (VALUE(*)(...))t_send_data, 3);
|
@@ -424,6 +466,7 @@ extern "C" void Init_rubyeventmachine()
|
|
424
466
|
rb_define_module_function (EmModule, "set_timer_quantum", (VALUE(*)(...))t_set_timer_quantum, 1);
|
425
467
|
rb_define_module_function (EmModule, "setuid_string", (VALUE(*)(...))t_setuid_string, 1);
|
426
468
|
rb_define_module_function (EmModule, "invoke_popen", (VALUE(*)(...))t_invoke_popen, 1);
|
469
|
+
rb_define_module_function (EmModule, "send_file_data", (VALUE(*)(...))t_send_file_data, 2);
|
427
470
|
|
428
471
|
// Provisional:
|
429
472
|
rb_define_module_function (EmModule, "_write_file", (VALUE(*)(...))t__write_file, 1);
|
data/lib/em/deferrable.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# $Id: deferrable.rb
|
1
|
+
# $Id: deferrable.rb 464 2007-07-22 12:56:27Z blackhedd $
|
2
2
|
#
|
3
3
|
# Author:: Francis Cianfrocca (gmail: blackhedd)
|
4
4
|
# Homepage:: http://rubyeventmachine.com
|
@@ -34,7 +34,7 @@ module Deferrable
|
|
34
34
|
block.call(*@deferred_args)
|
35
35
|
else
|
36
36
|
@callbacks ||= []
|
37
|
-
@callbacks << block
|
37
|
+
@callbacks.unshift block # << block
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
@@ -44,7 +44,7 @@ module Deferrable
|
|
44
44
|
block.call(*@deferred_args)
|
45
45
|
else
|
46
46
|
@errbacks ||= []
|
47
|
-
@errbacks << block
|
47
|
+
@errbacks.unshift block # << block
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
@@ -66,19 +66,23 @@ module Deferrable
|
|
66
66
|
# means that a callback can call #set_deferred_status and change the parameters
|
67
67
|
# that will be sent to subsequent callbacks down the chain.
|
68
68
|
#
|
69
|
+
# Changed @callbacks and @errbacks from push/shift to unshift/pop, per suggestion
|
70
|
+
# by Kirk Haines, to work around the memory leak bug that still exists in many Ruby
|
71
|
+
# versions.
|
72
|
+
#
|
69
73
|
def set_deferred_status arg, *args
|
70
74
|
@deferred_status = arg
|
71
75
|
@deferred_args = args
|
72
76
|
case @deferred_status
|
73
77
|
when :succeeded
|
74
78
|
if @callbacks
|
75
|
-
while cb = @callbacks.shift
|
79
|
+
while cb = @callbacks.pop #shift
|
76
80
|
cb.call(*@deferred_args)
|
77
81
|
end
|
78
82
|
end
|
79
83
|
when :failed
|
80
84
|
if @errbacks
|
81
|
-
while eb = @errbacks.shift
|
85
|
+
while eb = @errbacks.pop #shift
|
82
86
|
eb.call(*@deferred_args)
|
83
87
|
end
|
84
88
|
end
|
@@ -97,6 +101,27 @@ module Deferrable
|
|
97
101
|
set_deferred_status :failed, *args
|
98
102
|
end
|
99
103
|
|
104
|
+
# And still more sugar
|
105
|
+
#
|
106
|
+
def succeed *args
|
107
|
+
set_deferred_success *args
|
108
|
+
end
|
109
|
+
|
110
|
+
# Can't get enough sugar
|
111
|
+
#
|
112
|
+
def fail *args
|
113
|
+
set_deferred_failure *args
|
114
|
+
end
|
100
115
|
end
|
116
|
+
|
117
|
+
|
118
|
+
# DefaultDeferrable is an otherwise empty class that includes Deferrable.
|
119
|
+
# This is very useful when you just need to return a Deferrable object
|
120
|
+
# as a way of communicating deferred status to some other part of a program.
|
121
|
+
#
|
122
|
+
class DefaultDeferrable
|
123
|
+
include Deferrable
|
124
|
+
end
|
125
|
+
|
101
126
|
end
|
102
127
|
|
data/lib/em/streamer.rb
ADDED
@@ -0,0 +1,114 @@
|
|
1
|
+
# $Id: streamer.rb 476 2007-07-27 03:32:51Z blackhedd $
|
2
|
+
#
|
3
|
+
# Author:: Francis Cianfrocca (gmail: blackhedd)
|
4
|
+
# Homepage:: http://rubyeventmachine.com
|
5
|
+
# Date:: 16 Jul 2006
|
6
|
+
#
|
7
|
+
# See EventMachine and EventMachine::Connection for documentation and
|
8
|
+
# usage examples.
|
9
|
+
#
|
10
|
+
#----------------------------------------------------------------------------
|
11
|
+
#
|
12
|
+
# Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved.
|
13
|
+
# Gmail: blackhedd
|
14
|
+
#
|
15
|
+
# This program is free software; you can redistribute it and/or modify
|
16
|
+
# it under the terms of either: 1) the GNU General Public License
|
17
|
+
# as published by the Free Software Foundation; either version 2 of the
|
18
|
+
# License, or (at your option) any later version; or 2) Ruby's License.
|
19
|
+
#
|
20
|
+
# See the file COPYING for complete licensing information.
|
21
|
+
#
|
22
|
+
#---------------------------------------------------------------------------
|
23
|
+
#
|
24
|
+
#
|
25
|
+
|
26
|
+
|
27
|
+
module EventMachine
|
28
|
+
class FileStreamer
|
29
|
+
MappingThreshold = 16384
|
30
|
+
BackpressureLevel = 50000
|
31
|
+
ChunkSize = 16384
|
32
|
+
|
33
|
+
include Deferrable
|
34
|
+
def initialize connection, filename, args
|
35
|
+
@connection = connection
|
36
|
+
@http_chunks = args[:http_chunks]
|
37
|
+
|
38
|
+
if File.exist?(filename)
|
39
|
+
@size = File.size?(filename)
|
40
|
+
if @size <= MappingThreshold
|
41
|
+
stream_without_mapping filename
|
42
|
+
else
|
43
|
+
stream_with_mapping filename
|
44
|
+
end
|
45
|
+
else
|
46
|
+
fail "file not found"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def stream_without_mapping filename
|
51
|
+
if @http_chunks
|
52
|
+
#@connection.send_data "#{format("%x",@size)}\r\n"
|
53
|
+
@connection.send_data "#{@size.to_s(16)}\r\n"
|
54
|
+
@connection.send_file_data filename
|
55
|
+
@connection.send_data "\r\n0\r\n\r\n"
|
56
|
+
else
|
57
|
+
@connection.send_file_data filename
|
58
|
+
end
|
59
|
+
succeed
|
60
|
+
end
|
61
|
+
private :stream_without_mapping
|
62
|
+
|
63
|
+
def stream_with_mapping filename
|
64
|
+
ensure_mapping_extension_is_present
|
65
|
+
|
66
|
+
@position = 0
|
67
|
+
@mapping = EventMachine::FastFileReader::Mapper.new filename
|
68
|
+
stream_one_chunk
|
69
|
+
end
|
70
|
+
private :stream_with_mapping
|
71
|
+
|
72
|
+
def stream_one_chunk
|
73
|
+
loop {
|
74
|
+
if @position < @size
|
75
|
+
if @connection.get_outbound_data_size > BackpressureLevel
|
76
|
+
EventMachine::next_tick {stream_one_chunk}
|
77
|
+
break
|
78
|
+
else
|
79
|
+
len = @size - @position
|
80
|
+
len = ChunkSize if (len > ChunkSize)
|
81
|
+
|
82
|
+
#@connection.send_data( "#{format("%x",len)}\r\n" ) if @http_chunks
|
83
|
+
@connection.send_data( "#{len.to_s(16)}\r\n" ) if @http_chunks
|
84
|
+
@connection.send_data( @mapping.get_chunk( @position, len ))
|
85
|
+
@connection.send_data("\r\n") if @http_chunks
|
86
|
+
|
87
|
+
@position += len
|
88
|
+
end
|
89
|
+
else
|
90
|
+
@connection.send_data "0\r\n\r\n" if @http_chunks
|
91
|
+
@mapping.close
|
92
|
+
succeed
|
93
|
+
break
|
94
|
+
end
|
95
|
+
}
|
96
|
+
end
|
97
|
+
|
98
|
+
#--
|
99
|
+
# We use an outboard extension class to get memory-mapped files.
|
100
|
+
# It's outboard to avoid polluting the core distro, but that means
|
101
|
+
# there's a "hidden" dependency on it. The first time we get here in
|
102
|
+
# any run, try to load up the dependency extension. User code will see
|
103
|
+
# a LoadError if it's not available, but code that doesn't require
|
104
|
+
# mapped files will work fine without it. This is a somewhat difficult
|
105
|
+
# compromise between usability and proper modularization.
|
106
|
+
#
|
107
|
+
def ensure_mapping_extension_is_present
|
108
|
+
@@fastfilereader ||= (require 'fastfilereaderext')
|
109
|
+
end
|
110
|
+
private :ensure_mapping_extension_is_present
|
111
|
+
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
data/lib/eventmachine.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# $Id: eventmachine.rb
|
1
|
+
# $Id: eventmachine.rb 489 2007-07-30 05:10:15Z blackhedd $
|
2
2
|
#
|
3
3
|
# Author:: Francis Cianfrocca (gmail: blackhedd)
|
4
4
|
# Homepage:: http://rubyeventmachine.com
|
@@ -50,7 +50,14 @@ else
|
|
50
50
|
end
|
51
51
|
end
|
52
52
|
=end
|
53
|
-
|
53
|
+
|
54
|
+
|
55
|
+
if RUBY_PLATFORM =~ /java/
|
56
|
+
require 'java'
|
57
|
+
require 'jeventmachine'
|
58
|
+
else
|
59
|
+
require 'rubyeventmachine'
|
60
|
+
end
|
54
61
|
|
55
62
|
|
56
63
|
require "eventmachine_version"
|
@@ -58,6 +65,7 @@ require 'em/deferrable'
|
|
58
65
|
require 'em/future'
|
59
66
|
require 'em/eventable'
|
60
67
|
require 'em/messages'
|
68
|
+
require 'em/streamer'
|
61
69
|
|
62
70
|
require 'shellwords'
|
63
71
|
|
@@ -467,9 +475,19 @@ module EventMachine
|
|
467
475
|
|
468
476
|
s = start_tcp_server server, port
|
469
477
|
@acceptors[s] = [klass,block]
|
478
|
+
s
|
470
479
|
end
|
471
480
|
|
472
481
|
|
482
|
+
# Stop a TCP server socket that was started with EventMachine#start_server.
|
483
|
+
#--
|
484
|
+
# Requested by Kirk Haines. TODO, this isn't OOP enough. We ought somehow
|
485
|
+
# to have #start_server return an object that has a close or a stop method on it.
|
486
|
+
#
|
487
|
+
def EventMachine::stop_server signature
|
488
|
+
EventMachine::stop_tcp_server signature
|
489
|
+
end
|
490
|
+
|
473
491
|
def EventMachine::start_unix_domain_server filename, handler=nil, &block
|
474
492
|
klass = if (handler and handler.is_a?(Class))
|
475
493
|
handler
|
@@ -1226,6 +1244,34 @@ class Connection
|
|
1226
1244
|
end
|
1227
1245
|
|
1228
1246
|
|
1247
|
+
# Like EventMachine::Connection#send_data, this sends data to the remote end of
|
1248
|
+
# the network connection. EventMachine::Connection@send_file_data takes a
|
1249
|
+
# filename as an argument, though, and sends the contents of the file, in one
|
1250
|
+
# chunk. Contributed by Kirk Haines.
|
1251
|
+
#
|
1252
|
+
def send_file_data filename
|
1253
|
+
EventMachine::send_file_data @signature, filename
|
1254
|
+
end
|
1255
|
+
|
1256
|
+
# Open a file on the filesystem and send it to the remote peer. This returns an
|
1257
|
+
# object of type EventMachine::Deferrable. The object's callbacks will be executed
|
1258
|
+
# on the reactor main thread when the file has been completely scheduled for
|
1259
|
+
# transmission to the remote peer. Its errbacks will be called in case of an error
|
1260
|
+
# (such as file-not-found). #stream_file_data employs various strategems to achieve
|
1261
|
+
# the fastest possible performance, balanced against minimum consumption of memory.
|
1262
|
+
#
|
1263
|
+
# You can control the behavior of #stream_file_data with the optional arguments parameter.
|
1264
|
+
# Currently-supported arguments are:
|
1265
|
+
# :http_chunks, a boolean flag which defaults false. If true, this flag streams the
|
1266
|
+
# file data in a format compatible with the HTTP chunked-transfer encoding.
|
1267
|
+
#
|
1268
|
+
# Warning: this feature has an implicit dependency on an outboard extension,
|
1269
|
+
# evma_fastfilereader. You must install this extension in order to use #stream_file_data
|
1270
|
+
# with files larger than a certain size (currently 8192 bytes).
|
1271
|
+
#
|
1272
|
+
def stream_file_data filename, args={}
|
1273
|
+
EventMachine::FileStreamer.new( self, filename, args )
|
1274
|
+
end
|
1229
1275
|
|
1230
1276
|
|
1231
1277
|
# TODO, document this
|
@@ -1284,4 +1330,6 @@ require 'protocols/tcptest'
|
|
1284
1330
|
require 'protocols/httpclient'
|
1285
1331
|
require 'protocols/line_and_text'
|
1286
1332
|
require 'protocols/header_and_content'
|
1333
|
+
require 'protocols/linetext2'
|
1334
|
+
require 'protocols/stomp'
|
1287
1335
|
|
data/lib/eventmachine_version.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# $Id: eventmachine_version.rb
|
1
|
+
# $Id: eventmachine_version.rb 482 2007-07-28 19:11:03Z blackhedd $
|
2
2
|
#
|
3
3
|
# Author:: Francis Cianfrocca (gmail: blackhedd)
|
4
4
|
# Homepage:: http://rubyeventmachine.com
|
@@ -25,7 +25,7 @@
|
|
25
25
|
|
26
26
|
module EventMachine
|
27
27
|
|
28
|
-
VERSION = "0.8.
|
28
|
+
VERSION = "0.8.1"
|
29
29
|
|
30
30
|
end
|
31
31
|
|
@@ -0,0 +1,106 @@
|
|
1
|
+
# $Id: jeventmachine.rb 451 2007-07-21 13:34:28Z blackhedd $
|
2
|
+
#
|
3
|
+
# Author:: Francis Cianfrocca (gmail: blackhedd)
|
4
|
+
# Homepage:: http://rubyeventmachine.com
|
5
|
+
# Date:: 8 Apr 2006
|
6
|
+
#
|
7
|
+
# See EventMachine and EventMachine::Connection for documentation and
|
8
|
+
# usage examples.
|
9
|
+
#
|
10
|
+
#----------------------------------------------------------------------------
|
11
|
+
#
|
12
|
+
# Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved.
|
13
|
+
# Gmail: blackhedd
|
14
|
+
#
|
15
|
+
# This program is free software; you can redistribute it and/or modify
|
16
|
+
# it under the terms of either: 1) the GNU General Public License
|
17
|
+
# as published by the Free Software Foundation; either version 2 of the
|
18
|
+
# License, or (at your option) any later version; or 2) Ruby's License.
|
19
|
+
#
|
20
|
+
# See the file COPYING for complete licensing information.
|
21
|
+
#
|
22
|
+
#---------------------------------------------------------------------------
|
23
|
+
#
|
24
|
+
#
|
25
|
+
|
26
|
+
|
27
|
+
# This module provides "glue" for the Java version of the EventMachine reactor core.
|
28
|
+
# For C++ EventMachines, the analogous functionality is found in ext/rubymain.cpp,
|
29
|
+
# which is a garden-variety Ruby-extension glue module.
|
30
|
+
|
31
|
+
|
32
|
+
require 'em_reactor'
|
33
|
+
|
34
|
+
module EventMachine
|
35
|
+
# TODO: These event numbers are defined in way too many places.
|
36
|
+
# DRY them up.
|
37
|
+
TimerFired = 100
|
38
|
+
ConnectionData = 101
|
39
|
+
ConnectionUnbound = 102
|
40
|
+
ConnectionAccepted = 103
|
41
|
+
ConnectionCompleted = 104
|
42
|
+
LoopbreakSignalled = 105
|
43
|
+
|
44
|
+
class EM < com.rubyeventmachine.EmReactor
|
45
|
+
def eventCallback a1, a2, a3
|
46
|
+
s = String.from_java_bytes(a3.array[a3.position...a3.limit])
|
47
|
+
EventMachine::event_callback a1, a2, s
|
48
|
+
end
|
49
|
+
end
|
50
|
+
def self.initialize_event_machine
|
51
|
+
@em = EM.new
|
52
|
+
end
|
53
|
+
def self.release_machine
|
54
|
+
@em = nil
|
55
|
+
end
|
56
|
+
def self.add_oneshot_timer interval
|
57
|
+
@em.installOneshotTimer interval
|
58
|
+
end
|
59
|
+
def self.run_machine
|
60
|
+
@em.run
|
61
|
+
end
|
62
|
+
def self.stop
|
63
|
+
@em.stop
|
64
|
+
end
|
65
|
+
def self.start_tcp_server server, port
|
66
|
+
@em.startTcpServer server, port
|
67
|
+
end
|
68
|
+
def self.stop_tcp_server sig
|
69
|
+
@em.stopTcpServer sig
|
70
|
+
end
|
71
|
+
def self.send_data sig, data, length
|
72
|
+
@em.sendData sig, data, length
|
73
|
+
end
|
74
|
+
def self.send_datagram sig, data, length, address, port
|
75
|
+
@em.sendDatagram sig, data, length, address, port
|
76
|
+
end
|
77
|
+
def self.connect_server server, port
|
78
|
+
@em.connectTcpServer server, port
|
79
|
+
end
|
80
|
+
def self.close_connection sig, after_writing
|
81
|
+
@em.closeConnection sig, after_writing
|
82
|
+
end
|
83
|
+
def self.start_tls sig
|
84
|
+
@em.startTls sig
|
85
|
+
end
|
86
|
+
def self.signal_loopbreak
|
87
|
+
@em.signalLoopbreak
|
88
|
+
end
|
89
|
+
def self.set_timer_quantum q
|
90
|
+
@em.setTimerQuantum q
|
91
|
+
end
|
92
|
+
def self.epoll
|
93
|
+
# Epoll is a no-op for Java.
|
94
|
+
# The latest Java versions run epoll when possible in NIO.
|
95
|
+
end
|
96
|
+
def self.set_rlimit_nofile n_descriptors
|
97
|
+
# Currently a no-op for Java.
|
98
|
+
end
|
99
|
+
def self.open_udp_socket server, port
|
100
|
+
@em.openUdpSocket server, port
|
101
|
+
end
|
102
|
+
def self.library_type
|
103
|
+
:java
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|