wj_eventmachine 1.3.0.dev.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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +179 -0
- data/GNU +281 -0
- data/LICENSE +60 -0
- data/README.md +110 -0
- data/docs/DocumentationGuidesIndex.md +27 -0
- data/docs/GettingStarted.md +520 -0
- data/docs/old/ChangeLog +211 -0
- data/docs/old/DEFERRABLES +246 -0
- data/docs/old/EPOLL +141 -0
- data/docs/old/INSTALL +13 -0
- data/docs/old/KEYBOARD +42 -0
- data/docs/old/LEGAL +25 -0
- data/docs/old/LIGHTWEIGHT_CONCURRENCY +130 -0
- data/docs/old/PURE_RUBY +75 -0
- data/docs/old/RELEASE_NOTES +94 -0
- data/docs/old/SMTP +4 -0
- data/docs/old/SPAWNED_PROCESSES +148 -0
- data/docs/old/TODO +8 -0
- data/examples/guides/getting_started/01_eventmachine_echo_server.rb +18 -0
- data/examples/guides/getting_started/02_eventmachine_echo_server_that_recognizes_exit_command.rb +22 -0
- data/examples/guides/getting_started/03_simple_chat_server.rb +149 -0
- data/examples/guides/getting_started/04_simple_chat_server_step_one.rb +27 -0
- data/examples/guides/getting_started/05_simple_chat_server_step_two.rb +43 -0
- data/examples/guides/getting_started/06_simple_chat_server_step_three.rb +98 -0
- data/examples/guides/getting_started/07_simple_chat_server_step_four.rb +121 -0
- data/examples/guides/getting_started/08_simple_chat_server_step_five.rb +141 -0
- data/examples/old/ex_channel.rb +43 -0
- data/examples/old/ex_queue.rb +2 -0
- data/examples/old/ex_tick_loop_array.rb +15 -0
- data/examples/old/ex_tick_loop_counter.rb +32 -0
- data/examples/old/helper.rb +2 -0
- data/ext/binder.cpp +124 -0
- data/ext/binder.h +52 -0
- data/ext/cmain.cpp +1046 -0
- data/ext/ed.cpp +2238 -0
- data/ext/ed.h +460 -0
- data/ext/em.cpp +2378 -0
- data/ext/em.h +266 -0
- data/ext/eventmachine.h +152 -0
- data/ext/extconf.rb +285 -0
- data/ext/fastfilereader/extconf.rb +120 -0
- data/ext/fastfilereader/mapper.cpp +214 -0
- data/ext/fastfilereader/mapper.h +59 -0
- data/ext/fastfilereader/rubymain.cpp +126 -0
- data/ext/kb.cpp +79 -0
- data/ext/page.cpp +107 -0
- data/ext/page.h +51 -0
- data/ext/pipe.cpp +354 -0
- data/ext/project.h +174 -0
- data/ext/rubymain.cpp +1610 -0
- data/ext/ssl.cpp +627 -0
- data/ext/ssl.h +103 -0
- data/ext/wait_for_single_fd.h +36 -0
- data/java/.classpath +8 -0
- data/java/.project +17 -0
- data/java/src/com/rubyeventmachine/EmReactor.java +625 -0
- data/java/src/com/rubyeventmachine/EmReactorException.java +40 -0
- data/java/src/com/rubyeventmachine/EmReactorInterface.java +70 -0
- data/java/src/com/rubyeventmachine/EventableChannel.java +72 -0
- data/java/src/com/rubyeventmachine/EventableDatagramChannel.java +201 -0
- data/java/src/com/rubyeventmachine/EventableSocketChannel.java +415 -0
- data/java/src/com/rubyeventmachine/NullEmReactor.java +157 -0
- data/java/src/com/rubyeventmachine/NullEventableChannel.java +81 -0
- data/lib/em/buftok.rb +59 -0
- data/lib/em/callback.rb +58 -0
- data/lib/em/channel.rb +69 -0
- data/lib/em/completion.rb +307 -0
- data/lib/em/connection.rb +776 -0
- data/lib/em/deferrable.rb +210 -0
- data/lib/em/deferrable/pool.rb +2 -0
- data/lib/em/file_watch.rb +73 -0
- data/lib/em/future.rb +61 -0
- data/lib/em/io_streamer.rb +68 -0
- data/lib/em/iterator.rb +252 -0
- data/lib/em/messages.rb +66 -0
- data/lib/em/pool.rb +151 -0
- data/lib/em/process_watch.rb +45 -0
- data/lib/em/processes.rb +123 -0
- data/lib/em/protocols.rb +37 -0
- data/lib/em/protocols/header_and_content.rb +138 -0
- data/lib/em/protocols/httpclient.rb +303 -0
- data/lib/em/protocols/httpclient2.rb +602 -0
- data/lib/em/protocols/line_and_text.rb +125 -0
- data/lib/em/protocols/line_protocol.rb +33 -0
- data/lib/em/protocols/linetext2.rb +179 -0
- data/lib/em/protocols/memcache.rb +331 -0
- data/lib/em/protocols/object_protocol.rb +46 -0
- data/lib/em/protocols/postgres3.rb +246 -0
- data/lib/em/protocols/saslauth.rb +175 -0
- data/lib/em/protocols/smtpclient.rb +394 -0
- data/lib/em/protocols/smtpserver.rb +666 -0
- data/lib/em/protocols/socks4.rb +66 -0
- data/lib/em/protocols/stomp.rb +205 -0
- data/lib/em/protocols/tcptest.rb +54 -0
- data/lib/em/pure_ruby.rb +1299 -0
- data/lib/em/queue.rb +80 -0
- data/lib/em/resolver.rb +232 -0
- data/lib/em/spawnable.rb +84 -0
- data/lib/em/streamer.rb +118 -0
- data/lib/em/threaded_resource.rb +90 -0
- data/lib/em/tick_loop.rb +85 -0
- data/lib/em/timers.rb +61 -0
- data/lib/em/version.rb +3 -0
- data/lib/eventmachine.rb +1602 -0
- data/lib/jeventmachine.rb +318 -0
- data/rakelib/package.rake +120 -0
- data/rakelib/test.rake +6 -0
- data/rakelib/test_pure.rake +11 -0
- data/tests/client.crt +31 -0
- data/tests/client.key +51 -0
- data/tests/dhparam.pem +13 -0
- data/tests/em_ssl_handlers.rb +153 -0
- data/tests/em_test_helper.rb +198 -0
- data/tests/jruby/test_jeventmachine.rb +38 -0
- data/tests/test_attach.rb +199 -0
- data/tests/test_basic.rb +321 -0
- data/tests/test_channel.rb +75 -0
- data/tests/test_completion.rb +178 -0
- data/tests/test_connection_count.rb +83 -0
- data/tests/test_connection_write.rb +35 -0
- data/tests/test_defer.rb +35 -0
- data/tests/test_deferrable.rb +35 -0
- data/tests/test_epoll.rb +141 -0
- data/tests/test_error_handler.rb +38 -0
- data/tests/test_exc.rb +37 -0
- data/tests/test_file_watch.rb +86 -0
- data/tests/test_fork.rb +75 -0
- data/tests/test_futures.rb +170 -0
- data/tests/test_handler_check.rb +35 -0
- data/tests/test_hc.rb +155 -0
- data/tests/test_httpclient.rb +238 -0
- data/tests/test_httpclient2.rb +132 -0
- data/tests/test_idle_connection.rb +31 -0
- data/tests/test_inactivity_timeout.rb +102 -0
- data/tests/test_io_streamer.rb +47 -0
- data/tests/test_ipv4.rb +96 -0
- data/tests/test_ipv6.rb +107 -0
- data/tests/test_iterator.rb +122 -0
- data/tests/test_kb.rb +28 -0
- data/tests/test_keepalive.rb +113 -0
- data/tests/test_line_protocol.rb +33 -0
- data/tests/test_ltp.rb +155 -0
- data/tests/test_ltp2.rb +332 -0
- data/tests/test_many_fds.rb +21 -0
- data/tests/test_next_tick.rb +104 -0
- data/tests/test_object_protocol.rb +36 -0
- data/tests/test_pause.rb +109 -0
- data/tests/test_pending_connect_timeout.rb +52 -0
- data/tests/test_pool.rb +196 -0
- data/tests/test_process_watch.rb +50 -0
- data/tests/test_processes.rb +128 -0
- data/tests/test_proxy_connection.rb +180 -0
- data/tests/test_pure.rb +156 -0
- data/tests/test_queue.rb +64 -0
- data/tests/test_resolver.rb +129 -0
- data/tests/test_running.rb +14 -0
- data/tests/test_sasl.rb +46 -0
- data/tests/test_send_file.rb +217 -0
- data/tests/test_servers.rb +32 -0
- data/tests/test_shutdown_hooks.rb +23 -0
- data/tests/test_smtpclient.rb +75 -0
- data/tests/test_smtpserver.rb +90 -0
- data/tests/test_sock_opt.rb +53 -0
- data/tests/test_spawn.rb +290 -0
- data/tests/test_ssl_args.rb +41 -0
- data/tests/test_ssl_dhparam.rb +57 -0
- data/tests/test_ssl_ecdh_curve.rb +57 -0
- data/tests/test_ssl_extensions.rb +24 -0
- data/tests/test_ssl_methods.rb +31 -0
- data/tests/test_ssl_protocols.rb +190 -0
- data/tests/test_ssl_verify.rb +52 -0
- data/tests/test_stomp.rb +38 -0
- data/tests/test_system.rb +46 -0
- data/tests/test_threaded_resource.rb +68 -0
- data/tests/test_tick_loop.rb +58 -0
- data/tests/test_timers.rb +150 -0
- data/tests/test_ud.rb +8 -0
- data/tests/test_unbind_reason.rb +40 -0
- metadata +384 -0
|
@@ -0,0 +1,120 @@
|
|
|
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
|
+
# Eager check devs tools
|
|
16
|
+
have_devel? if respond_to?(:have_devel?)
|
|
17
|
+
|
|
18
|
+
add_define 'BUILD_FOR_RUBY'
|
|
19
|
+
|
|
20
|
+
# Minor platform details between *nix and Windows:
|
|
21
|
+
|
|
22
|
+
if RUBY_PLATFORM =~ /(mswin|mingw|bccwin)/
|
|
23
|
+
GNU_CHAIN = ENV['CROSS_COMPILING'] || $1 == 'mingw'
|
|
24
|
+
OS_WIN32 = true
|
|
25
|
+
add_define "OS_WIN32"
|
|
26
|
+
else
|
|
27
|
+
GNU_CHAIN = true
|
|
28
|
+
OS_UNIX = true
|
|
29
|
+
add_define 'OS_UNIX'
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Adjust number of file descriptors (FD) on Windows
|
|
33
|
+
|
|
34
|
+
if RbConfig::CONFIG["host_os"] =~ /mingw/
|
|
35
|
+
found = RbConfig::CONFIG.values_at("CFLAGS", "CPPFLAGS").
|
|
36
|
+
any? { |v| v.include?("FD_SETSIZE") }
|
|
37
|
+
|
|
38
|
+
add_define "FD_SETSIZE=32767" unless found
|
|
39
|
+
# needed for new versions of headers-git & crt-git
|
|
40
|
+
if RbConfig::CONFIG["ruby_version"] >= "2.4"
|
|
41
|
+
append_ldflags "-l:libssp.a -fstack-protector"
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Main platform invariances:
|
|
46
|
+
|
|
47
|
+
ldshared = CONFIG['LDSHARED']
|
|
48
|
+
|
|
49
|
+
case RUBY_PLATFORM
|
|
50
|
+
when /mswin32/, /mingw32/, /bccwin32/
|
|
51
|
+
check_heads(%w[windows.h winsock.h], true)
|
|
52
|
+
check_libs(%w[kernel32 rpcrt4 gdi32], true)
|
|
53
|
+
|
|
54
|
+
if GNU_CHAIN
|
|
55
|
+
CONFIG['LDSHAREDXX'] = "$(CXX) -shared -static-libgcc -static-libstdc++"
|
|
56
|
+
else
|
|
57
|
+
$defs.push "-EHs"
|
|
58
|
+
$defs.push "-GR"
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
when /solaris/
|
|
62
|
+
add_define 'OS_SOLARIS8'
|
|
63
|
+
check_libs(%w[nsl socket], true)
|
|
64
|
+
|
|
65
|
+
if CONFIG['CC'] == 'cc' && (
|
|
66
|
+
`cc -flags 2>&1` =~ /Sun/ || # detect SUNWspro compiler
|
|
67
|
+
`cc -V 2>&1` =~ /Sun/ # detect Solaris Studio compiler
|
|
68
|
+
)
|
|
69
|
+
# SUN CHAIN
|
|
70
|
+
add_define 'CC_SUNWspro'
|
|
71
|
+
$preload = ["\nCXX = CC"] # hack a CXX= line into the makefile
|
|
72
|
+
$CFLAGS = CONFIG['CFLAGS'] = "-KPIC"
|
|
73
|
+
CONFIG['CCDLFLAGS'] = "-KPIC"
|
|
74
|
+
CONFIG['LDSHARED'] = "$(CXX) -G -KPIC -lCstd"
|
|
75
|
+
CONFIG['LDSHAREDXX'] = "$(CXX) -G -KPIC -lCstd"
|
|
76
|
+
else
|
|
77
|
+
# GNU CHAIN
|
|
78
|
+
# on Unix we need a g++ link, not gcc.
|
|
79
|
+
CONFIG['LDSHARED'] = "$(CXX) -shared"
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
when /openbsd/
|
|
83
|
+
# OpenBSD branch contributed by Guillaume Sellier.
|
|
84
|
+
|
|
85
|
+
# on Unix we need a g++ link, not gcc. On OpenBSD, linking against libstdc++ have to be explicitly done for shared libs
|
|
86
|
+
CONFIG['LDSHARED'] = "$(CXX) -shared -lstdc++ -fPIC"
|
|
87
|
+
CONFIG['LDSHAREDXX'] = "$(CXX) -shared -lstdc++ -fPIC"
|
|
88
|
+
|
|
89
|
+
when /darwin/
|
|
90
|
+
# on Unix we need a g++ link, not gcc.
|
|
91
|
+
# Ff line contributed by Daniel Harple.
|
|
92
|
+
CONFIG['LDSHARED'] = "$(CXX) " + CONFIG['LDSHARED'].split[1..-1].join(' ')
|
|
93
|
+
|
|
94
|
+
when /linux/
|
|
95
|
+
# on Unix we need a g++ link, not gcc.
|
|
96
|
+
CONFIG['LDSHARED'] = "$(CXX) -shared"
|
|
97
|
+
|
|
98
|
+
when /aix/
|
|
99
|
+
CONFIG['LDSHARED'] = "$(CXX) -Wl,-bstatic -Wl,-bdynamic -Wl,-G -Wl,-brtl"
|
|
100
|
+
|
|
101
|
+
when /cygwin/
|
|
102
|
+
# For rubies built with Cygwin, CXX may be set to CC, which is just
|
|
103
|
+
# a wrapper for gcc.
|
|
104
|
+
# This will compile, but it will not link to the C++ std library.
|
|
105
|
+
# Explicitly set CXX to use g++.
|
|
106
|
+
CONFIG['CXX'] = "g++"
|
|
107
|
+
# on Unix we need a g++ link, not gcc.
|
|
108
|
+
CONFIG['LDSHARED'] = "$(CXX) -shared"
|
|
109
|
+
|
|
110
|
+
else
|
|
111
|
+
# on Unix we need a g++ link, not gcc.
|
|
112
|
+
CONFIG['LDSHARED'] = "$(CXX) -shared"
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
if RUBY_ENGINE == "truffleruby"
|
|
116
|
+
# Keep the original LDSHARED on TruffleRuby, as linking is done on bitcode
|
|
117
|
+
CONFIG['LDSHARED'] = ldshared
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
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
|
+
#include <unistd.h>
|
|
34
|
+
|
|
35
|
+
#include <iostream>
|
|
36
|
+
#include <string>
|
|
37
|
+
#include <cstring>
|
|
38
|
+
#include <stdexcept>
|
|
39
|
+
|
|
40
|
+
#include "mapper.h"
|
|
41
|
+
|
|
42
|
+
/******************
|
|
43
|
+
Mapper_t::Mapper_t
|
|
44
|
+
******************/
|
|
45
|
+
|
|
46
|
+
Mapper_t::Mapper_t (const std::string &filename)
|
|
47
|
+
{
|
|
48
|
+
/* We ASSUME we can open the file.
|
|
49
|
+
* (More precisely, we assume someone else checked before we got here.)
|
|
50
|
+
*/
|
|
51
|
+
|
|
52
|
+
Fd = open (filename.c_str(), O_RDONLY);
|
|
53
|
+
if (Fd < 0)
|
|
54
|
+
throw std::runtime_error (strerror (errno));
|
|
55
|
+
|
|
56
|
+
struct stat st;
|
|
57
|
+
if (fstat (Fd, &st))
|
|
58
|
+
throw std::runtime_error (strerror (errno));
|
|
59
|
+
FileSize = st.st_size;
|
|
60
|
+
|
|
61
|
+
#ifdef OS_WIN32
|
|
62
|
+
MapPoint = (char*) mmap (0, FileSize, PROT_READ, MAP_SHARED, Fd, 0);
|
|
63
|
+
#else
|
|
64
|
+
MapPoint = (const char*) mmap (0, FileSize, PROT_READ, MAP_SHARED, Fd, 0);
|
|
65
|
+
#endif
|
|
66
|
+
if (MapPoint == MAP_FAILED)
|
|
67
|
+
throw std::runtime_error (strerror (errno));
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
/*******************
|
|
72
|
+
Mapper_t::~Mapper_t
|
|
73
|
+
*******************/
|
|
74
|
+
|
|
75
|
+
Mapper_t::~Mapper_t()
|
|
76
|
+
{
|
|
77
|
+
Close();
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
/***************
|
|
82
|
+
Mapper_t::Close
|
|
83
|
+
***************/
|
|
84
|
+
|
|
85
|
+
void Mapper_t::Close()
|
|
86
|
+
{
|
|
87
|
+
// Can be called multiple times.
|
|
88
|
+
// Calls to GetChunk are invalid after a call to Close.
|
|
89
|
+
if (MapPoint) {
|
|
90
|
+
#ifdef CC_SUNWspro
|
|
91
|
+
// TODO: The void * cast works fine on Solaris 11, but
|
|
92
|
+
// I don't know at what point that changed from older Solaris.
|
|
93
|
+
munmap ((char*)MapPoint, FileSize);
|
|
94
|
+
#else
|
|
95
|
+
munmap ((void*)MapPoint, FileSize);
|
|
96
|
+
#endif
|
|
97
|
+
MapPoint = NULL;
|
|
98
|
+
}
|
|
99
|
+
if (Fd >= 0) {
|
|
100
|
+
close (Fd);
|
|
101
|
+
Fd = -1;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/******************
|
|
106
|
+
Mapper_t::GetChunk
|
|
107
|
+
******************/
|
|
108
|
+
|
|
109
|
+
const char *Mapper_t::GetChunk (unsigned start)
|
|
110
|
+
{
|
|
111
|
+
return MapPoint + start;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
#endif // OS_UNIX
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
//////////////////////////////////////////////////////////////////////
|
|
120
|
+
// WINDOWS implementation
|
|
121
|
+
//////////////////////////////////////////////////////////////////////
|
|
122
|
+
|
|
123
|
+
#ifdef OS_WIN32
|
|
124
|
+
|
|
125
|
+
#include <windows.h>
|
|
126
|
+
|
|
127
|
+
#include <iostream>
|
|
128
|
+
#include <string>
|
|
129
|
+
#include <stdexcept>
|
|
130
|
+
|
|
131
|
+
#include "mapper.h"
|
|
132
|
+
|
|
133
|
+
/******************
|
|
134
|
+
Mapper_t::Mapper_t
|
|
135
|
+
******************/
|
|
136
|
+
|
|
137
|
+
Mapper_t::Mapper_t (const std::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 std::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 std::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 std::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
|
+
hFile = 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 std::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
|
+
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/*****************************************************************************
|
|
2
|
+
|
|
3
|
+
$Id: rubymain.cpp 4529 2007-07-04 11:32:22Z francis $
|
|
4
|
+
|
|
5
|
+
File: rubymain.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
|
+
#include <iostream>
|
|
23
|
+
#include <stdexcept>
|
|
24
|
+
|
|
25
|
+
#include <ruby.h>
|
|
26
|
+
#include "mapper.h"
|
|
27
|
+
|
|
28
|
+
static VALUE EmModule;
|
|
29
|
+
static VALUE FastFileReader;
|
|
30
|
+
static VALUE Mapper;
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
/*********
|
|
35
|
+
mapper_dt
|
|
36
|
+
*********/
|
|
37
|
+
|
|
38
|
+
static void mapper_dt (void *ptr)
|
|
39
|
+
{
|
|
40
|
+
if (ptr)
|
|
41
|
+
delete (Mapper_t*) ptr;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**********
|
|
45
|
+
mapper_new
|
|
46
|
+
**********/
|
|
47
|
+
|
|
48
|
+
static VALUE mapper_new (VALUE self, VALUE filename)
|
|
49
|
+
{
|
|
50
|
+
Mapper_t *m = new Mapper_t (StringValueCStr (filename));
|
|
51
|
+
if (!m)
|
|
52
|
+
rb_raise (rb_eStandardError, "No Mapper Object");
|
|
53
|
+
VALUE v = Data_Wrap_Struct (Mapper, 0, mapper_dt, (void*)m);
|
|
54
|
+
return v;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
/****************
|
|
59
|
+
mapper_get_chunk
|
|
60
|
+
****************/
|
|
61
|
+
|
|
62
|
+
static VALUE mapper_get_chunk (VALUE self, VALUE start, VALUE length)
|
|
63
|
+
{
|
|
64
|
+
Mapper_t *m = NULL;
|
|
65
|
+
Data_Get_Struct (self, Mapper_t, m);
|
|
66
|
+
if (!m)
|
|
67
|
+
rb_raise (rb_eStandardError, "No Mapper Object");
|
|
68
|
+
|
|
69
|
+
// TODO, what if some moron sends us a negative start value?
|
|
70
|
+
unsigned _start = NUM2INT (start);
|
|
71
|
+
unsigned _length = NUM2INT (length);
|
|
72
|
+
if ((_start + _length) > m->GetFileSize())
|
|
73
|
+
rb_raise (rb_eStandardError, "Mapper Range Error");
|
|
74
|
+
|
|
75
|
+
const char *chunk = m->GetChunk (_start);
|
|
76
|
+
if (!chunk)
|
|
77
|
+
rb_raise (rb_eStandardError, "No Mapper Chunk");
|
|
78
|
+
return rb_str_new (chunk, _length);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/************
|
|
82
|
+
mapper_close
|
|
83
|
+
************/
|
|
84
|
+
|
|
85
|
+
static VALUE mapper_close (VALUE self)
|
|
86
|
+
{
|
|
87
|
+
Mapper_t *m = NULL;
|
|
88
|
+
Data_Get_Struct (self, Mapper_t, m);
|
|
89
|
+
if (!m)
|
|
90
|
+
rb_raise (rb_eStandardError, "No Mapper Object");
|
|
91
|
+
m->Close();
|
|
92
|
+
return Qnil;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/***********
|
|
96
|
+
mapper_size
|
|
97
|
+
***********/
|
|
98
|
+
|
|
99
|
+
static VALUE mapper_size (VALUE self)
|
|
100
|
+
{
|
|
101
|
+
Mapper_t *m = NULL;
|
|
102
|
+
Data_Get_Struct (self, Mapper_t, m);
|
|
103
|
+
if (!m)
|
|
104
|
+
rb_raise (rb_eStandardError, "No Mapper Object");
|
|
105
|
+
return INT2NUM (m->GetFileSize());
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
/**********************
|
|
110
|
+
Init_fastfilereaderext
|
|
111
|
+
**********************/
|
|
112
|
+
|
|
113
|
+
extern "C" void Init_fastfilereaderext()
|
|
114
|
+
{
|
|
115
|
+
EmModule = rb_define_module ("EventMachine");
|
|
116
|
+
FastFileReader = rb_define_class_under (EmModule, "FastFileReader", rb_cObject);
|
|
117
|
+
Mapper = rb_define_class_under (FastFileReader, "Mapper", rb_cObject);
|
|
118
|
+
|
|
119
|
+
rb_define_module_function (Mapper, "new", (VALUE(*)(...))mapper_new, 1);
|
|
120
|
+
rb_define_method (Mapper, "size", (VALUE(*)(...))mapper_size, 0);
|
|
121
|
+
rb_define_method (Mapper, "close", (VALUE(*)(...))mapper_close, 0);
|
|
122
|
+
rb_define_method (Mapper, "get_chunk", (VALUE(*)(...))mapper_get_chunk, 2);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
|