libc-eventmachine 0.12.5.42
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 +195 -0
- data/docs/COPYING +60 -0
- data/docs/ChangeLog +211 -0
- data/docs/DEFERRABLES +138 -0
- data/docs/EPOLL +141 -0
- data/docs/GNU +281 -0
- data/docs/INSTALL +15 -0
- data/docs/KEYBOARD +38 -0
- data/docs/LEGAL +25 -0
- data/docs/LIGHTWEIGHT_CONCURRENCY +72 -0
- data/docs/PURE_RUBY +77 -0
- data/docs/README +74 -0
- data/docs/RELEASE_NOTES +96 -0
- data/docs/SMTP +9 -0
- data/docs/SPAWNED_PROCESSES +93 -0
- data/docs/TODO +10 -0
- data/ext/binder.cpp +126 -0
- data/ext/binder.h +48 -0
- data/ext/cmain.cpp +582 -0
- data/ext/cplusplus.cpp +177 -0
- data/ext/ed.cpp +1522 -0
- data/ext/ed.h +380 -0
- data/ext/em.cpp +1947 -0
- data/ext/em.h +186 -0
- data/ext/emwin.cpp +300 -0
- data/ext/emwin.h +94 -0
- data/ext/epoll.cpp +26 -0
- data/ext/epoll.h +25 -0
- data/ext/eventmachine.h +98 -0
- data/ext/eventmachine_cpp.h +96 -0
- data/ext/extconf.rb +129 -0
- data/ext/fastfilereader/extconf.rb +77 -0
- data/ext/fastfilereader/mapper.cpp +214 -0
- data/ext/fastfilereader/mapper.h +59 -0
- data/ext/fastfilereader/rubymain.cpp +127 -0
- data/ext/files.cpp +94 -0
- data/ext/files.h +65 -0
- data/ext/kb.cpp +82 -0
- data/ext/page.cpp +107 -0
- data/ext/page.h +51 -0
- data/ext/pipe.cpp +351 -0
- data/ext/project.h +119 -0
- data/ext/rubymain.cpp +858 -0
- data/ext/sigs.cpp +89 -0
- data/ext/sigs.h +32 -0
- data/ext/ssl.cpp +423 -0
- data/ext/ssl.h +90 -0
- data/java/src/com/rubyeventmachine/Application.java +196 -0
- data/java/src/com/rubyeventmachine/Connection.java +74 -0
- data/java/src/com/rubyeventmachine/ConnectionFactory.java +37 -0
- data/java/src/com/rubyeventmachine/DefaultConnectionFactory.java +46 -0
- data/java/src/com/rubyeventmachine/EmReactor.java +408 -0
- data/java/src/com/rubyeventmachine/EmReactorException.java +40 -0
- data/java/src/com/rubyeventmachine/EventableChannel.java +57 -0
- data/java/src/com/rubyeventmachine/EventableDatagramChannel.java +171 -0
- data/java/src/com/rubyeventmachine/EventableSocketChannel.java +244 -0
- data/java/src/com/rubyeventmachine/PeriodicTimer.java +38 -0
- data/java/src/com/rubyeventmachine/Timer.java +54 -0
- data/java/src/com/rubyeventmachine/tests/ApplicationTest.java +108 -0
- data/java/src/com/rubyeventmachine/tests/ConnectTest.java +124 -0
- data/java/src/com/rubyeventmachine/tests/EMTest.java +80 -0
- data/java/src/com/rubyeventmachine/tests/TestDatagrams.java +53 -0
- data/java/src/com/rubyeventmachine/tests/TestServers.java +74 -0
- data/java/src/com/rubyeventmachine/tests/TestTimers.java +89 -0
- data/lib/em/deferrable.rb +208 -0
- data/lib/em/eventable.rb +39 -0
- data/lib/em/future.rb +62 -0
- data/lib/em/messages.rb +66 -0
- data/lib/em/processes.rb +68 -0
- data/lib/em/spawnable.rb +88 -0
- data/lib/em/streamer.rb +112 -0
- data/lib/eventmachine.rb +1920 -0
- data/lib/eventmachine_version.rb +31 -0
- data/lib/evma/callback.rb +32 -0
- data/lib/evma/container.rb +75 -0
- data/lib/evma/factory.rb +77 -0
- data/lib/evma/protocol.rb +87 -0
- data/lib/evma/reactor.rb +48 -0
- data/lib/evma.rb +32 -0
- data/lib/jeventmachine.rb +140 -0
- data/lib/pr_eventmachine.rb +1017 -0
- data/lib/protocols/buftok.rb +127 -0
- data/lib/protocols/header_and_content.rb +129 -0
- data/lib/protocols/httpcli2.rb +803 -0
- data/lib/protocols/httpclient.rb +270 -0
- data/lib/protocols/line_and_text.rb +126 -0
- data/lib/protocols/linetext2.rb +161 -0
- data/lib/protocols/memcache.rb +293 -0
- data/lib/protocols/postgres.rb +261 -0
- data/lib/protocols/saslauth.rb +179 -0
- data/lib/protocols/smtpclient.rb +308 -0
- data/lib/protocols/smtpserver.rb +556 -0
- data/lib/protocols/stomp.rb +153 -0
- data/lib/protocols/tcptest.rb +57 -0
- data/tasks/cpp.rake +77 -0
- data/tasks/project.rake +78 -0
- data/tasks/tests.rake +193 -0
- data/tests/test_attach.rb +83 -0
- data/tests/test_basic.rb +231 -0
- data/tests/test_bind.rb +73 -0
- data/tests/test_connection_count.rb +35 -0
- data/tests/test_defer.rb +47 -0
- data/tests/test_epoll.rb +163 -0
- data/tests/test_error_handler.rb +32 -0
- data/tests/test_errors.rb +82 -0
- data/tests/test_eventables.rb +77 -0
- data/tests/test_exc.rb +58 -0
- data/tests/test_futures.rb +214 -0
- data/tests/test_handler_check.rb +37 -0
- data/tests/test_hc.rb +218 -0
- data/tests/test_httpclient.rb +215 -0
- data/tests/test_httpclient2.rb +155 -0
- data/tests/test_kb.rb +61 -0
- data/tests/test_ltp.rb +188 -0
- data/tests/test_ltp2.rb +320 -0
- data/tests/test_next_tick.rb +109 -0
- data/tests/test_processes.rb +56 -0
- data/tests/test_pure.rb +129 -0
- data/tests/test_running.rb +47 -0
- data/tests/test_sasl.rb +74 -0
- data/tests/test_send_file.rb +243 -0
- data/tests/test_servers.rb +80 -0
- data/tests/test_smtpclient.rb +83 -0
- data/tests/test_smtpserver.rb +93 -0
- data/tests/test_spawn.rb +329 -0
- data/tests/test_ssl_args.rb +68 -0
- data/tests/test_ssl_methods.rb +50 -0
- data/tests/test_timers.rb +148 -0
- data/tests/test_ud.rb +43 -0
- data/tests/testem.rb +31 -0
- metadata +230 -0
data/ext/eventmachine.h
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/*****************************************************************************
|
|
2
|
+
|
|
3
|
+
$Id$
|
|
4
|
+
|
|
5
|
+
File: eventmachine.h
|
|
6
|
+
Date: 15Apr06
|
|
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
|
+
#ifndef __EVMA_EventMachine__H_
|
|
21
|
+
#define __EVMA_EventMachine__H_
|
|
22
|
+
|
|
23
|
+
#if __cplusplus
|
|
24
|
+
extern "C" {
|
|
25
|
+
#endif
|
|
26
|
+
|
|
27
|
+
enum { // Event names
|
|
28
|
+
EM_TIMER_FIRED = 100,
|
|
29
|
+
EM_CONNECTION_READ = 101,
|
|
30
|
+
EM_CONNECTION_UNBOUND = 102,
|
|
31
|
+
EM_CONNECTION_ACCEPTED = 103,
|
|
32
|
+
EM_CONNECTION_COMPLETED = 104,
|
|
33
|
+
EM_LOOPBREAK_SIGNAL = 105,
|
|
34
|
+
EM_CONNECTION_NOTIFY_READABLE = 106,
|
|
35
|
+
EM_CONNECTION_NOTIFY_WRITABLE = 107,
|
|
36
|
+
EM_SSL_HANDSHAKE_COMPLETED = 108
|
|
37
|
+
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
void evma_initialize_library (void(*)(const char*, int, const char*, int));
|
|
41
|
+
void evma_run_machine();
|
|
42
|
+
void evma_release_library();
|
|
43
|
+
const char *evma_install_oneshot_timer (int seconds);
|
|
44
|
+
const char *evma_connect_to_server (const char *server, int port, const char * bind_host);
|
|
45
|
+
const char *evma_connect_to_unix_server (const char *server);
|
|
46
|
+
|
|
47
|
+
const char *evma_attach_fd (int file_descriptor, int read_mode, int write_mode);
|
|
48
|
+
int evma_detach_fd (const char *binding);
|
|
49
|
+
|
|
50
|
+
void evma_stop_tcp_server (const char *signature);
|
|
51
|
+
const char *evma_create_tcp_server (const char *address, int port);
|
|
52
|
+
const char *evma_create_unix_domain_server (const char *filename);
|
|
53
|
+
const char *evma_open_datagram_socket (const char *server, int port);
|
|
54
|
+
const char *evma_open_keyboard();
|
|
55
|
+
void evma_set_tls_parms (const char *binding, const char *privatekey_filename, const char *certchain_filenane);
|
|
56
|
+
void evma_start_tls (const char *binding);
|
|
57
|
+
|
|
58
|
+
#ifdef WITH_SSL
|
|
59
|
+
X509 *evma_get_peer_cert (const char *binding);
|
|
60
|
+
#endif
|
|
61
|
+
|
|
62
|
+
int evma_get_peername (const char *binding, struct sockaddr*);
|
|
63
|
+
int evma_get_sockname (const char *binding, struct sockaddr*);
|
|
64
|
+
int evma_get_subprocess_pid (const char *binding, pid_t*);
|
|
65
|
+
int evma_get_subprocess_status (const char *binding, int*);
|
|
66
|
+
int evma_get_connection_count();
|
|
67
|
+
int evma_send_data_to_connection (const char *binding, const char *data, int data_length);
|
|
68
|
+
int evma_send_datagram (const char *binding, const char *data, int data_length, const char *address, int port);
|
|
69
|
+
int evma_get_comm_inactivity_timeout (const char *binding, /*out*/int *value);
|
|
70
|
+
int evma_set_comm_inactivity_timeout (const char *binding, /*in,out*/int *value);
|
|
71
|
+
int evma_get_outbound_data_size (const char *binding);
|
|
72
|
+
int evma_send_file_data_to_connection (const char *binding, const char *filename);
|
|
73
|
+
|
|
74
|
+
void evma_close_connection (const char *binding, int after_writing);
|
|
75
|
+
int evma_report_connection_error_status (const char *binding);
|
|
76
|
+
void evma_signal_loopbreak();
|
|
77
|
+
void evma_set_timer_quantum (int);
|
|
78
|
+
int evma_get_max_timer_count();
|
|
79
|
+
void evma_set_max_timer_count (int);
|
|
80
|
+
void evma_setuid_string (const char *username);
|
|
81
|
+
void evma_stop_machine();
|
|
82
|
+
|
|
83
|
+
const char *evma__write_file (const char *filename);
|
|
84
|
+
const char *evma_popen (char * const*cmd_strings);
|
|
85
|
+
|
|
86
|
+
int evma_set_rlimit_nofile (int n_files);
|
|
87
|
+
|
|
88
|
+
// Temporary:
|
|
89
|
+
void evma__epoll();
|
|
90
|
+
void evma__kqueue();
|
|
91
|
+
|
|
92
|
+
#if __cplusplus
|
|
93
|
+
}
|
|
94
|
+
#endif
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
#endif // __EventMachine__H_
|
|
98
|
+
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/*****************************************************************************
|
|
2
|
+
|
|
3
|
+
$Id$
|
|
4
|
+
|
|
5
|
+
File: eventmachine_cpp.h
|
|
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
|
+
#ifndef __EVMA_EventmachineCpp__H_
|
|
22
|
+
#define __EVMA_EventmachineCpp__H_
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
// This material is only for directly integrating EM into C++ programs.
|
|
26
|
+
|
|
27
|
+
namespace EM {
|
|
28
|
+
|
|
29
|
+
void Callback (const char *sig, int event, const char *data, int length);
|
|
30
|
+
void Run (void(*)(void));
|
|
31
|
+
void AddTimer (int, void(*)());
|
|
32
|
+
void StopReactor();
|
|
33
|
+
|
|
34
|
+
/***************
|
|
35
|
+
class Eventable
|
|
36
|
+
***************/
|
|
37
|
+
|
|
38
|
+
class Eventable {
|
|
39
|
+
public:
|
|
40
|
+
Eventable() {}
|
|
41
|
+
virtual ~Eventable() {}
|
|
42
|
+
|
|
43
|
+
std::string Signature;
|
|
44
|
+
|
|
45
|
+
// Called by the framework
|
|
46
|
+
virtual void ReceiveData (const char *data, int length) {}
|
|
47
|
+
virtual void ConnectionCompleted() {}
|
|
48
|
+
virtual void Accept (const char*) {}
|
|
49
|
+
virtual void Unbind() {}
|
|
50
|
+
virtual void PostInit() {}
|
|
51
|
+
virtual void SslHandshakeCompleted() {}
|
|
52
|
+
|
|
53
|
+
void StopReactor() {EM::StopReactor();}
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
/****************
|
|
57
|
+
class Connection
|
|
58
|
+
****************/
|
|
59
|
+
|
|
60
|
+
class Connection: public Eventable {
|
|
61
|
+
public:
|
|
62
|
+
Connection() {}
|
|
63
|
+
virtual ~Connection() {}
|
|
64
|
+
|
|
65
|
+
virtual void Connect (const char* host, int port) { Connect(host, port, 0); }
|
|
66
|
+
virtual void Connect (const char*, int, const char * bind_host);
|
|
67
|
+
|
|
68
|
+
void SendData (const char *data);
|
|
69
|
+
void SendData (const char *data, int length);
|
|
70
|
+
void Close (bool afterWriting);
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
/**************
|
|
75
|
+
class Acceptor
|
|
76
|
+
**************/
|
|
77
|
+
|
|
78
|
+
class Acceptor: public Eventable {
|
|
79
|
+
public:
|
|
80
|
+
Acceptor() {PostInit();}
|
|
81
|
+
virtual ~Acceptor() {}
|
|
82
|
+
|
|
83
|
+
void Start (const char*, int);
|
|
84
|
+
void Accept (const char*);
|
|
85
|
+
|
|
86
|
+
virtual Connection *MakeConnection() {return new Connection();}
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
#endif // __EVMA_EventmachineCpp__H_
|
data/ext/extconf.rb
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
require 'mkmf'
|
|
2
|
+
|
|
3
|
+
def check_libs libs = [], fatal = false
|
|
4
|
+
libs.all? { |lib| have_library(lib) || (abort("could not find library: #{lib}") if fatal) }
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def check_heads heads = [], fatal = false
|
|
8
|
+
heads.all? { |head| have_header(head) || (abort("could not find header: #{head}") if fatal)}
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def add_define(name)
|
|
12
|
+
$defs.push("-D#{name}")
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
add_define 'BUILD_FOR_RUBY'
|
|
16
|
+
add_define 'HAVE_RBTRAP' if have_var('rb_trap_immediate', ['ruby.h', 'rubysig.h'])
|
|
17
|
+
add_define "HAVE_TBR" if have_func('rb_thread_blocking_region')# and have_macro('RUBY_UBF_IO', 'ruby.h')
|
|
18
|
+
|
|
19
|
+
# Minor platform details between *nix and Windows:
|
|
20
|
+
|
|
21
|
+
if RUBY_PLATFORM =~ /(mswin|mingw|bccwin)/
|
|
22
|
+
GNU_CHAIN = $1 == 'mingw'
|
|
23
|
+
OS_WIN32 = true
|
|
24
|
+
add_define "OS_WIN32"
|
|
25
|
+
else
|
|
26
|
+
GNU_CHAIN = true
|
|
27
|
+
OS_UNIX = true
|
|
28
|
+
add_define 'OS_UNIX'
|
|
29
|
+
|
|
30
|
+
add_define "HAVE_KQUEUE" if have_header("sys/event.h") and have_header("sys/queue.h")
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Main platform invariances:
|
|
34
|
+
|
|
35
|
+
case RUBY_PLATFORM
|
|
36
|
+
when /mswin32/, /mingw32/, /bccwin32/
|
|
37
|
+
check_heads(%w[windows.h winsock.h], true)
|
|
38
|
+
check_libs(%w[kernel32 rpcrt4 gdi32], true)
|
|
39
|
+
|
|
40
|
+
if GNU_CHAIN
|
|
41
|
+
CONFIG['LDSHARED'] = "$(CXX) -shared -lstdc++"
|
|
42
|
+
else
|
|
43
|
+
$defs.push "-EHs"
|
|
44
|
+
$defs.push "-GR"
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
when /solaris/
|
|
48
|
+
check_libs(%w[nsl socket], true)
|
|
49
|
+
|
|
50
|
+
add_define 'OS_SOLARIS8'
|
|
51
|
+
|
|
52
|
+
# Patch by Tim Pease, fixes SUNWspro compile problems.
|
|
53
|
+
if CONFIG['CC'] == 'cc'
|
|
54
|
+
# SUN CHAIN
|
|
55
|
+
$CFLAGS = CONFIG['CFLAGS'] = "-KPIC -G"
|
|
56
|
+
CONFIG['CCDLFLAGS'] = "-KPIC"
|
|
57
|
+
else
|
|
58
|
+
# GNU CHAIN
|
|
59
|
+
# on Unix we need a g++ link, not gcc.
|
|
60
|
+
CONFIG['LDSHARED'] = "$(CXX) -shared"
|
|
61
|
+
end
|
|
62
|
+
when /openbsd/
|
|
63
|
+
# OpenBSD branch contributed by Guillaume Sellier.
|
|
64
|
+
|
|
65
|
+
# on Unix we need a g++ link, not gcc. On OpenBSD, linking against libstdc++ have to be explicitly done for shared libs
|
|
66
|
+
CONFIG['LDSHARED'] = "$(CXX) -shared -lstdc++"
|
|
67
|
+
|
|
68
|
+
when /darwin/
|
|
69
|
+
|
|
70
|
+
# on Unix we need a g++ link, not gcc.
|
|
71
|
+
# Ff line contributed by Daniel Harple.
|
|
72
|
+
CONFIG['LDSHARED'] = "$(CXX) " + CONFIG['LDSHARED'].split[1..-1].join(' ')
|
|
73
|
+
|
|
74
|
+
when /linux/
|
|
75
|
+
|
|
76
|
+
# Original epoll test is inadequate because 2.4 kernels have the header
|
|
77
|
+
# but not the code.
|
|
78
|
+
# add_define 'HAVE_EPOLL' if have_header('sys/epoll.h')
|
|
79
|
+
if have_header('sys/epoll.h')
|
|
80
|
+
File.open("hasEpollTest.c", "w") {|f|
|
|
81
|
+
f.puts "#include <sys/epoll.h>"
|
|
82
|
+
f.puts "int main() { epoll_create(1024); return 0;}"
|
|
83
|
+
}
|
|
84
|
+
(e = system( "gcc hasEpollTest.c -o hasEpollTest " )) and (e = $?.to_i)
|
|
85
|
+
`rm -f hasEpollTest.c hasEpollTest`
|
|
86
|
+
add_define 'HAVE_EPOLL' if e == 0
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# on Unix we need a g++ link, not gcc.
|
|
90
|
+
CONFIG['LDSHARED'] = "$(CXX) -shared"
|
|
91
|
+
else
|
|
92
|
+
# on Unix we need a g++ link, not gcc.
|
|
93
|
+
CONFIG['LDSHARED'] = "$(CXX) -shared"
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# OpenSSL:
|
|
97
|
+
|
|
98
|
+
def manual_ssl_config
|
|
99
|
+
ssl_libs_heads_args = {
|
|
100
|
+
:unix => [%w[ssl crypto], %w[openssl/ssl.h openssl/err.h]],
|
|
101
|
+
:darwin => [%w[ssl crypto C], %w[openssl/ssl.h openssl/err.h]],
|
|
102
|
+
# openbsd and linux:
|
|
103
|
+
:crypto_hack => [%w[crypto ssl crypto], %w[openssl/ssl.h openssl/err.h]],
|
|
104
|
+
:mswin => [%w[ssleay32 libeay32], %w[openssl/ssl.h openssl/err.h]],
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
dc_flags = ['ssl']
|
|
108
|
+
dc_flags += ["#{ENV['OPENSSL']}/include", ENV['OPENSSL']] if /linux/ =~ RUBY_PLATFORM
|
|
109
|
+
|
|
110
|
+
libs, heads = case RUBY_PLATFORM
|
|
111
|
+
when /mswin/ ; ssl_libs_heads_args[:mswin]
|
|
112
|
+
when /mingw/ ; ssl_libs_heads_args[:unix]
|
|
113
|
+
when /darwin/ ; ssl_libs_heads_args[:darwin]
|
|
114
|
+
when /openbsd/ ; ssl_libs_heads_args[:crypto_hack]
|
|
115
|
+
when /linux/ ; ssl_libs_heads_args[:crypto_hack]
|
|
116
|
+
else ssl_libs_heads_args[:unix]
|
|
117
|
+
end
|
|
118
|
+
dir_config(*dc_flags)
|
|
119
|
+
check_libs(libs) and check_heads(heads)
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# Try to use pkg_config first, fixes #73
|
|
123
|
+
if pkg_config('openssl') || manual_ssl_config
|
|
124
|
+
add_define "WITH_SSL"
|
|
125
|
+
else
|
|
126
|
+
add_define "WITHOUT_SSL"
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
create_makefile "rubyeventmachine"
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
require 'mkmf'
|
|
2
|
+
|
|
3
|
+
def check_libs libs = [], fatal = false
|
|
4
|
+
libs.all? { |lib| have_library(lib) || (abort("could not find library: #{lib}") if fatal) }
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def check_heads heads = [], fatal = false
|
|
8
|
+
heads.all? { |head| have_header(head) || (abort("could not find header: #{head}") if fatal)}
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def add_define(name)
|
|
12
|
+
$defs.push("-D#{name}")
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
add_define 'BUILD_FOR_RUBY'
|
|
16
|
+
|
|
17
|
+
# Minor platform details between *nix and Windows:
|
|
18
|
+
|
|
19
|
+
if RUBY_PLATFORM =~ /(mswin|mingw|bccwin)/
|
|
20
|
+
GNU_CHAIN = $1 == 'mingw'
|
|
21
|
+
OS_WIN32 = true
|
|
22
|
+
add_define "OS_WIN32"
|
|
23
|
+
else
|
|
24
|
+
GNU_CHAIN = true
|
|
25
|
+
OS_UNIX = true
|
|
26
|
+
add_define 'OS_UNIX'
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
case RUBY_PLATFORM
|
|
32
|
+
when /mswin32/, /mingw32/, /bccwin32/
|
|
33
|
+
check_heads(%w[windows.h winsock.h], true)
|
|
34
|
+
check_libs(%w[kernel32 rpcrt4 gdi32], true)
|
|
35
|
+
|
|
36
|
+
if GNU_CHAIN
|
|
37
|
+
CONFIG['LDSHARED'] = "$(CXX) -shared -lstdc++"
|
|
38
|
+
else
|
|
39
|
+
$defs.push "-EHs"
|
|
40
|
+
$defs.push "-GR"
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
when /solaris/
|
|
44
|
+
check_libs(%w[nsl socket], true)
|
|
45
|
+
|
|
46
|
+
add_define 'OS_SOLARIS8'
|
|
47
|
+
|
|
48
|
+
# Patch by Tim Pease, fixes SUNWspro compile problems.
|
|
49
|
+
if CONFIG['CC'] == 'cc'
|
|
50
|
+
# SUN CHAIN
|
|
51
|
+
$CFLAGS = CONFIG['CFLAGS'] = "-KPIC -G"
|
|
52
|
+
CONFIG['CCDLFLAGS'] = "-KPIC"
|
|
53
|
+
else
|
|
54
|
+
# GNU CHAIN
|
|
55
|
+
# on Unix we need a g++ link, not gcc.
|
|
56
|
+
CONFIG['LDSHARED'] = "$(CXX) -shared"
|
|
57
|
+
end
|
|
58
|
+
when /openbsd/
|
|
59
|
+
# OpenBSD branch contributed by Guillaume Sellier.
|
|
60
|
+
|
|
61
|
+
# on Unix we need a g++ link, not gcc. On OpenBSD, linking against libstdc++ have to be explicitly done for shared libs
|
|
62
|
+
CONFIG['LDSHARED'] = "$(CXX) -shared -lstdc++"
|
|
63
|
+
when /darwin/
|
|
64
|
+
# on Unix we need a g++ link, not gcc.
|
|
65
|
+
# Ff line contributed by Daniel Harple.
|
|
66
|
+
CONFIG['LDSHARED'] = "$(CXX) " + CONFIG['LDSHARED'].split[1..-1].join(' ')
|
|
67
|
+
|
|
68
|
+
when /linux/
|
|
69
|
+
|
|
70
|
+
# on Unix we need a g++ link, not gcc.
|
|
71
|
+
CONFIG['LDSHARED'] = "$(CXX) -shared"
|
|
72
|
+
else
|
|
73
|
+
# on Unix we need a g++ link, not gcc.
|
|
74
|
+
CONFIG['LDSHARED'] = "$(CXX) -shared"
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
create_makefile "fastfilereaderext"
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
/*****************************************************************************
|
|
2
|
+
|
|
3
|
+
$Id: mapper.cpp 4527 2007-07-04 10:21:34Z francis $
|
|
4
|
+
|
|
5
|
+
File: mapper.cpp
|
|
6
|
+
Date: 02Jul07
|
|
7
|
+
|
|
8
|
+
Copyright (C) 2007 by Francis Cianfrocca. All Rights Reserved.
|
|
9
|
+
Gmail: garbagecat10
|
|
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
|
+
//////////////////////////////////////////////////////////////////////
|
|
22
|
+
// UNIX implementation
|
|
23
|
+
//////////////////////////////////////////////////////////////////////
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
#ifdef OS_UNIX
|
|
27
|
+
|
|
28
|
+
#include <sys/types.h>
|
|
29
|
+
#include <sys/stat.h>
|
|
30
|
+
#include <sys/mman.h>
|
|
31
|
+
#include <fcntl.h>
|
|
32
|
+
#include <errno.h>
|
|
33
|
+
|
|
34
|
+
#include <iostream>
|
|
35
|
+
#include "unistd.h"
|
|
36
|
+
#include <string>
|
|
37
|
+
#include <cstring>
|
|
38
|
+
#include <stdexcept>
|
|
39
|
+
using namespace std;
|
|
40
|
+
|
|
41
|
+
#include "mapper.h"
|
|
42
|
+
|
|
43
|
+
/******************
|
|
44
|
+
Mapper_t::Mapper_t
|
|
45
|
+
******************/
|
|
46
|
+
|
|
47
|
+
Mapper_t::Mapper_t (const string &filename)
|
|
48
|
+
{
|
|
49
|
+
/* We ASSUME we can open the file.
|
|
50
|
+
* (More precisely, we assume someone else checked before we got here.)
|
|
51
|
+
*/
|
|
52
|
+
|
|
53
|
+
Fd = open (filename.c_str(), O_RDONLY);
|
|
54
|
+
if (Fd < 0)
|
|
55
|
+
throw runtime_error (strerror (errno));
|
|
56
|
+
|
|
57
|
+
struct stat st;
|
|
58
|
+
if (fstat (Fd, &st))
|
|
59
|
+
throw runtime_error (strerror (errno));
|
|
60
|
+
FileSize = st.st_size;
|
|
61
|
+
|
|
62
|
+
#ifdef OS_WIN32
|
|
63
|
+
MapPoint = (char*) mmap (0, FileSize, PROT_READ, MAP_SHARED, Fd, 0);
|
|
64
|
+
#else
|
|
65
|
+
MapPoint = (const char*) mmap (0, FileSize, PROT_READ, MAP_SHARED, Fd, 0);
|
|
66
|
+
#endif
|
|
67
|
+
if (MapPoint == MAP_FAILED)
|
|
68
|
+
throw runtime_error (strerror (errno));
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
/*******************
|
|
73
|
+
Mapper_t::~Mapper_t
|
|
74
|
+
*******************/
|
|
75
|
+
|
|
76
|
+
Mapper_t::~Mapper_t()
|
|
77
|
+
{
|
|
78
|
+
Close();
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
/***************
|
|
83
|
+
Mapper_t::Close
|
|
84
|
+
***************/
|
|
85
|
+
|
|
86
|
+
void Mapper_t::Close()
|
|
87
|
+
{
|
|
88
|
+
// Can be called multiple times.
|
|
89
|
+
// Calls to GetChunk are invalid after a call to Close.
|
|
90
|
+
if (MapPoint) {
|
|
91
|
+
#ifdef OS_SOLARIS8
|
|
92
|
+
munmap ((char*)MapPoint, FileSize);
|
|
93
|
+
#else
|
|
94
|
+
munmap ((void*)MapPoint, FileSize);
|
|
95
|
+
#endif
|
|
96
|
+
MapPoint = NULL;
|
|
97
|
+
}
|
|
98
|
+
if (Fd >= 0) {
|
|
99
|
+
close (Fd);
|
|
100
|
+
Fd = -1;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/******************
|
|
105
|
+
Mapper_t::GetChunk
|
|
106
|
+
******************/
|
|
107
|
+
|
|
108
|
+
const char *Mapper_t::GetChunk (unsigned start)
|
|
109
|
+
{
|
|
110
|
+
return MapPoint + start;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
#endif // OS_UNIX
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
//////////////////////////////////////////////////////////////////////
|
|
119
|
+
// WINDOWS implementation
|
|
120
|
+
//////////////////////////////////////////////////////////////////////
|
|
121
|
+
|
|
122
|
+
#ifdef OS_WIN32
|
|
123
|
+
|
|
124
|
+
#include <windows.h>
|
|
125
|
+
|
|
126
|
+
#include <iostream>
|
|
127
|
+
#include <string>
|
|
128
|
+
#include <stdexcept>
|
|
129
|
+
using namespace std;
|
|
130
|
+
|
|
131
|
+
#include "mapper.h"
|
|
132
|
+
|
|
133
|
+
/******************
|
|
134
|
+
Mapper_t::Mapper_t
|
|
135
|
+
******************/
|
|
136
|
+
|
|
137
|
+
Mapper_t::Mapper_t (const string &filename)
|
|
138
|
+
{
|
|
139
|
+
/* We ASSUME we can open the file.
|
|
140
|
+
* (More precisely, we assume someone else checked before we got here.)
|
|
141
|
+
*/
|
|
142
|
+
|
|
143
|
+
hFile = INVALID_HANDLE_VALUE;
|
|
144
|
+
hMapping = NULL;
|
|
145
|
+
MapPoint = NULL;
|
|
146
|
+
FileSize = 0;
|
|
147
|
+
|
|
148
|
+
hFile = CreateFile (filename.c_str(), GENERIC_READ|GENERIC_WRITE, FILE_SHARE_DELETE|FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
|
149
|
+
|
|
150
|
+
if (hFile == INVALID_HANDLE_VALUE)
|
|
151
|
+
throw runtime_error ("File not found");
|
|
152
|
+
|
|
153
|
+
BY_HANDLE_FILE_INFORMATION i;
|
|
154
|
+
if (GetFileInformationByHandle (hFile, &i))
|
|
155
|
+
FileSize = i.nFileSizeLow;
|
|
156
|
+
|
|
157
|
+
hMapping = CreateFileMapping (hFile, NULL, PAGE_READWRITE, 0, 0, NULL);
|
|
158
|
+
if (!hMapping)
|
|
159
|
+
throw runtime_error ("File not mapped");
|
|
160
|
+
|
|
161
|
+
#ifdef OS_WIN32
|
|
162
|
+
MapPoint = (char*) MapViewOfFile (hMapping, FILE_MAP_WRITE, 0, 0, 0);
|
|
163
|
+
#else
|
|
164
|
+
MapPoint = (const char*) MapViewOfFile (hMapping, FILE_MAP_WRITE, 0, 0, 0);
|
|
165
|
+
#endif
|
|
166
|
+
if (!MapPoint)
|
|
167
|
+
throw runtime_error ("Mappoint not read");
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
/*******************
|
|
172
|
+
Mapper_t::~Mapper_t
|
|
173
|
+
*******************/
|
|
174
|
+
|
|
175
|
+
Mapper_t::~Mapper_t()
|
|
176
|
+
{
|
|
177
|
+
Close();
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/***************
|
|
181
|
+
Mapper_t::Close
|
|
182
|
+
***************/
|
|
183
|
+
|
|
184
|
+
void Mapper_t::Close()
|
|
185
|
+
{
|
|
186
|
+
// Can be called multiple times.
|
|
187
|
+
// Calls to GetChunk are invalid after a call to Close.
|
|
188
|
+
if (MapPoint) {
|
|
189
|
+
UnmapViewOfFile (MapPoint);
|
|
190
|
+
MapPoint = NULL;
|
|
191
|
+
}
|
|
192
|
+
if (hMapping != NULL) {
|
|
193
|
+
CloseHandle (hMapping);
|
|
194
|
+
hMapping = NULL;
|
|
195
|
+
}
|
|
196
|
+
if (hFile != INVALID_HANDLE_VALUE) {
|
|
197
|
+
CloseHandle (hFile);
|
|
198
|
+
hMapping = INVALID_HANDLE_VALUE;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
/******************
|
|
204
|
+
Mapper_t::GetChunk
|
|
205
|
+
******************/
|
|
206
|
+
|
|
207
|
+
const char *Mapper_t::GetChunk (unsigned start)
|
|
208
|
+
{
|
|
209
|
+
return MapPoint + start;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
#endif // OS_WINDOWS
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/*****************************************************************************
|
|
2
|
+
|
|
3
|
+
$Id: mapper.h 4529 2007-07-04 11:32:22Z francis $
|
|
4
|
+
|
|
5
|
+
File: mapper.h
|
|
6
|
+
Date: 02Jul07
|
|
7
|
+
|
|
8
|
+
Copyright (C) 2007 by Francis Cianfrocca. All Rights Reserved.
|
|
9
|
+
Gmail: garbagecat10
|
|
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 __Mapper__H_
|
|
22
|
+
#define __Mapper__H_
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
/**************
|
|
26
|
+
class Mapper_t
|
|
27
|
+
**************/
|
|
28
|
+
|
|
29
|
+
class Mapper_t
|
|
30
|
+
{
|
|
31
|
+
public:
|
|
32
|
+
Mapper_t (const string&);
|
|
33
|
+
virtual ~Mapper_t();
|
|
34
|
+
|
|
35
|
+
const char *GetChunk (unsigned);
|
|
36
|
+
void Close();
|
|
37
|
+
size_t GetFileSize() {return FileSize;}
|
|
38
|
+
|
|
39
|
+
private:
|
|
40
|
+
size_t FileSize;
|
|
41
|
+
|
|
42
|
+
#ifdef OS_UNIX
|
|
43
|
+
private:
|
|
44
|
+
int Fd;
|
|
45
|
+
const char *MapPoint;
|
|
46
|
+
#endif // OS_UNIX
|
|
47
|
+
|
|
48
|
+
#ifdef OS_WIN32
|
|
49
|
+
private:
|
|
50
|
+
HANDLE hFile;
|
|
51
|
+
HANDLE hMapping;
|
|
52
|
+
char *MapPoint;
|
|
53
|
+
#endif // OS_WIN32
|
|
54
|
+
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
#endif // __Mapper__H_
|
|
59
|
+
|