eventmachine 1.2.0.dev.2-x64-mingw32
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 +105 -0
- data/GNU +281 -0
- data/LICENSE +60 -0
- data/README.md +108 -0
- data/docs/DocumentationGuidesIndex.md +27 -0
- data/docs/GettingStarted.md +521 -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 +46 -0
- data/ext/cmain.cpp +988 -0
- data/ext/ed.cpp +2111 -0
- data/ext/ed.h +442 -0
- data/ext/em.cpp +2379 -0
- data/ext/em.h +308 -0
- data/ext/eventmachine.h +143 -0
- data/ext/extconf.rb +270 -0
- data/ext/fastfilereader/extconf.rb +110 -0
- data/ext/fastfilereader/mapper.cpp +216 -0
- data/ext/fastfilereader/mapper.h +59 -0
- data/ext/fastfilereader/rubymain.cpp +127 -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 +176 -0
- data/ext/rubymain.cpp +1504 -0
- data/ext/ssl.cpp +615 -0
- data/ext/ssl.h +103 -0
- data/java/.classpath +8 -0
- data/java/.project +17 -0
- data/java/src/com/rubyeventmachine/EmReactor.java +591 -0
- data/java/src/com/rubyeventmachine/EmReactorException.java +40 -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/lib/2.0/fastfilereaderext.so +0 -0
- data/lib/2.0/rubyeventmachine.so +0 -0
- data/lib/2.1/fastfilereaderext.so +0 -0
- data/lib/2.1/rubyeventmachine.so +0 -0
- data/lib/2.2/fastfilereaderext.so +0 -0
- data/lib/2.2/rubyeventmachine.so +0 -0
- data/lib/2.3/fastfilereaderext.so +0 -0
- data/lib/2.3/rubyeventmachine.so +0 -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 +304 -0
- data/lib/em/connection.rb +770 -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/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 +299 -0
- data/lib/em/protocols/httpclient2.rb +600 -0
- data/lib/em/protocols/line_and_text.rb +125 -0
- data/lib/em/protocols/line_protocol.rb +29 -0
- data/lib/em/protocols/linetext2.rb +166 -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 +1022 -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 +1584 -0
- data/lib/fastfilereaderext.rb +2 -0
- data/lib/jeventmachine.rb +301 -0
- data/lib/rubyeventmachine.rb +2 -0
- data/rakelib/package.rake +120 -0
- data/rakelib/test.rake +8 -0
- data/tests/client.crt +31 -0
- data/tests/client.key +51 -0
- data/tests/dhparam.pem +13 -0
- data/tests/em_test_helper.rb +151 -0
- data/tests/test_attach.rb +151 -0
- data/tests/test_basic.rb +283 -0
- data/tests/test_channel.rb +75 -0
- data/tests/test_completion.rb +178 -0
- data/tests/test_connection_count.rb +54 -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 +142 -0
- data/tests/test_error_handler.rb +38 -0
- data/tests/test_exc.rb +28 -0
- data/tests/test_file_watch.rb +66 -0
- data/tests/test_fork.rb +75 -0
- data/tests/test_futures.rb +170 -0
- data/tests/test_get_sock_opt.rb +37 -0
- data/tests/test_handler_check.rb +35 -0
- data/tests/test_hc.rb +155 -0
- data/tests/test_httpclient.rb +233 -0
- data/tests/test_httpclient2.rb +128 -0
- data/tests/test_idle_connection.rb +25 -0
- data/tests/test_inactivity_timeout.rb +54 -0
- data/tests/test_ipv4.rb +125 -0
- data/tests/test_ipv6.rb +131 -0
- data/tests/test_iterator.rb +115 -0
- data/tests/test_kb.rb +28 -0
- data/tests/test_line_protocol.rb +33 -0
- data/tests/test_ltp.rb +138 -0
- data/tests/test_ltp2.rb +308 -0
- data/tests/test_many_fds.rb +22 -0
- data/tests/test_next_tick.rb +104 -0
- data/tests/test_object_protocol.rb +36 -0
- data/tests/test_pause.rb +107 -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 +88 -0
- data/tests/test_queue.rb +64 -0
- data/tests/test_resolver.rb +104 -0
- data/tests/test_running.rb +14 -0
- data/tests/test_sasl.rb +47 -0
- data/tests/test_send_file.rb +217 -0
- data/tests/test_servers.rb +33 -0
- data/tests/test_set_sock_opt.rb +39 -0
- data/tests/test_shutdown_hooks.rb +23 -0
- data/tests/test_smtpclient.rb +75 -0
- data/tests/test_smtpserver.rb +57 -0
- data/tests/test_spawn.rb +293 -0
- data/tests/test_ssl_args.rb +78 -0
- data/tests/test_ssl_dhparam.rb +83 -0
- data/tests/test_ssl_ecdh_curve.rb +79 -0
- data/tests/test_ssl_extensions.rb +49 -0
- data/tests/test_ssl_methods.rb +65 -0
- data/tests/test_ssl_protocols.rb +246 -0
- data/tests/test_ssl_verify.rb +126 -0
- data/tests/test_stomp.rb +37 -0
- data/tests/test_system.rb +46 -0
- data/tests/test_threaded_resource.rb +61 -0
- data/tests/test_tick_loop.rb +59 -0
- data/tests/test_timers.rb +123 -0
- data/tests/test_ud.rb +8 -0
- data/tests/test_unbind_reason.rb +52 -0
- metadata +381 -0
data/ext/extconf.rb
ADDED
@@ -0,0 +1,270 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'mkmf'
|
3
|
+
|
4
|
+
# Eager check devs tools
|
5
|
+
have_devel? if respond_to?(:have_devel?)
|
6
|
+
|
7
|
+
def check_libs libs = [], fatal = false
|
8
|
+
libs.all? { |lib| have_library(lib) || (abort("could not find library: #{lib}") if fatal) }
|
9
|
+
end
|
10
|
+
|
11
|
+
def check_heads heads = [], fatal = false
|
12
|
+
heads.all? { |head| have_header(head) || (abort("could not find header: #{head}") if fatal)}
|
13
|
+
end
|
14
|
+
|
15
|
+
def add_define(name)
|
16
|
+
$defs.push("-D#{name}")
|
17
|
+
end
|
18
|
+
|
19
|
+
##
|
20
|
+
# OpenSSL:
|
21
|
+
|
22
|
+
# override append_library, so it actually appends (instead of prepending)
|
23
|
+
# this fixes issues with linking ssl, since libcrypto depends on symbols in libssl
|
24
|
+
def append_library(libs, lib)
|
25
|
+
libs + " " + format(LIBARG, lib)
|
26
|
+
end
|
27
|
+
|
28
|
+
SSL_HEADS = %w(openssl/ssl.h openssl/err.h)
|
29
|
+
SSL_LIBS = case RUBY_PLATFORM
|
30
|
+
when /mswin|mingw|bccwin/ ; %w(ssleay32 libeay32)
|
31
|
+
else ; %w(crypto ssl)
|
32
|
+
end
|
33
|
+
|
34
|
+
def dir_config_wrapper(pretty_name, name, idefault=nil, ldefault=nil)
|
35
|
+
inc, lib = dir_config(name, idefault, ldefault)
|
36
|
+
if inc && lib
|
37
|
+
# TODO: Remove when 2.0.0 is the minimum supported version
|
38
|
+
# Ruby versions not incorporating the mkmf fix at
|
39
|
+
# https://bugs.ruby-lang.org/projects/ruby-trunk/repository/revisions/39717
|
40
|
+
# do not properly search for lib directories, and must be corrected
|
41
|
+
unless lib && lib[-3, 3] == 'lib'
|
42
|
+
@libdir_basename = 'lib'
|
43
|
+
inc, lib = dir_config(name, idefault, ldefault)
|
44
|
+
end
|
45
|
+
unless idefault && ldefault
|
46
|
+
abort "-----\nCannot find #{pretty_name} include path #{inc}\n-----" unless inc && inc.split(File::PATH_SEPARATOR).any? { |dir| File.directory?(dir) }
|
47
|
+
abort "-----\nCannot find #{pretty_name} library path #{lib}\n-----" unless lib && lib.split(File::PATH_SEPARATOR).any? { |dir| File.directory?(dir) }
|
48
|
+
warn "-----\nUsing #{pretty_name} in path #{File.dirname inc}\n-----"
|
49
|
+
end
|
50
|
+
true
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def dir_config_search(pretty_name, name, paths, &b)
|
55
|
+
paths.each do |p|
|
56
|
+
if dir_config_wrapper('OpenSSL', 'ssl', p + '/include', p + '/lib') && yield
|
57
|
+
warn "-----\nFound #{pretty_name} in path #{p}\n-----"
|
58
|
+
return true
|
59
|
+
end
|
60
|
+
end
|
61
|
+
false
|
62
|
+
end
|
63
|
+
|
64
|
+
def pkg_config_wrapper(pretty_name, name)
|
65
|
+
cflags, ldflags, libs = pkg_config(name)
|
66
|
+
unless [cflags, ldflags, libs].any?(&:nil?) || [cflags, ldflags, libs].any?(&:empty?)
|
67
|
+
warn "-----\nUsing #{pretty_name} from pkg-config #{cflags} && #{ldflags} && #{libs}\n-----"
|
68
|
+
true
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
if ENV['CROSS_COMPILING']
|
73
|
+
openssl_version = ENV.fetch("OPENSSL_VERSION", "1.0.2e")
|
74
|
+
openssl_dir = File.expand_path("~/.rake-compiler/builds/openssl-#{openssl_version}/")
|
75
|
+
if File.exist?(openssl_dir)
|
76
|
+
FileUtils.mkdir_p Dir.pwd+"/openssl/"
|
77
|
+
FileUtils.cp Dir[openssl_dir+"/include/openssl/*.h"], Dir.pwd+"/openssl/", :verbose => true
|
78
|
+
FileUtils.cp Dir[openssl_dir+"/lib*.a"], Dir.pwd, :verbose => true
|
79
|
+
$INCFLAGS << " -I#{Dir.pwd}" # for the openssl headers
|
80
|
+
add_define "WITH_SSL"
|
81
|
+
else
|
82
|
+
STDERR.puts
|
83
|
+
STDERR.puts "**************************************************************************************"
|
84
|
+
STDERR.puts "**** Cross-compiled OpenSSL not found"
|
85
|
+
STDERR.puts "**** Run: hg clone http://bitbucket.org/ged/ruby-pg && cd ruby-pg && rake openssl_libs"
|
86
|
+
STDERR.puts "**************************************************************************************"
|
87
|
+
STDERR.puts
|
88
|
+
end
|
89
|
+
elsif dir_config_wrapper('OpenSSL', 'ssl')
|
90
|
+
# If the user has provided a --with-ssl-dir argument, we must respect it or fail.
|
91
|
+
add_define 'WITH_SSL' if check_libs(SSL_LIBS) && check_heads(SSL_HEADS)
|
92
|
+
elsif pkg_config_wrapper('OpenSSL', 'openssl')
|
93
|
+
# If we can detect OpenSSL by pkg-config, use it as the next-best option
|
94
|
+
add_define 'WITH_SSL' if check_libs(SSL_LIBS) && check_heads(SSL_HEADS)
|
95
|
+
elsif check_libs(SSL_LIBS) && check_heads(SSL_HEADS)
|
96
|
+
# If we don't even need any options to find a usable OpenSSL, go with it
|
97
|
+
add_define 'WITH_SSL'
|
98
|
+
elsif dir_config_search('OpenSSL', 'ssl', ['/usr/local', '/opt/local', '/usr/local/opt/openssl']) do
|
99
|
+
check_libs(SSL_LIBS) && check_heads(SSL_HEADS)
|
100
|
+
end
|
101
|
+
# Finally, look for OpenSSL in alternate locations including MacPorts and HomeBrew
|
102
|
+
add_define 'WITH_SSL'
|
103
|
+
end
|
104
|
+
|
105
|
+
add_define 'BUILD_FOR_RUBY'
|
106
|
+
|
107
|
+
# Ruby features:
|
108
|
+
|
109
|
+
have_var('rb_trap_immediate', ['ruby.h', 'rubysig.h'])
|
110
|
+
have_func('rb_thread_blocking_region')
|
111
|
+
have_func('rb_thread_call_without_gvl', 'ruby/thread.h')
|
112
|
+
have_func('rb_thread_fd_select')
|
113
|
+
have_type('rb_fdset_t', 'ruby/intern.h')
|
114
|
+
have_func('rb_wait_for_single_fd')
|
115
|
+
have_func('rb_enable_interrupt')
|
116
|
+
have_func('rb_time_new')
|
117
|
+
|
118
|
+
# System features:
|
119
|
+
|
120
|
+
add_define('HAVE_INOTIFY') if inotify = have_func('inotify_init', 'sys/inotify.h')
|
121
|
+
add_define('HAVE_OLD_INOTIFY') if !inotify && have_macro('__NR_inotify_init', 'sys/syscall.h')
|
122
|
+
have_func('writev', 'sys/uio.h')
|
123
|
+
have_func('pipe2', 'unistd.h')
|
124
|
+
have_func('accept4', 'sys/socket.h')
|
125
|
+
have_const('SOCK_CLOEXEC', 'sys/socket.h')
|
126
|
+
|
127
|
+
# Minor platform details between *nix and Windows:
|
128
|
+
|
129
|
+
if RUBY_PLATFORM =~ /(mswin|mingw|bccwin)/
|
130
|
+
GNU_CHAIN = ENV['CROSS_COMPILING'] || $1 == 'mingw'
|
131
|
+
OS_WIN32 = true
|
132
|
+
add_define "OS_WIN32"
|
133
|
+
else
|
134
|
+
GNU_CHAIN = true
|
135
|
+
OS_UNIX = true
|
136
|
+
add_define 'OS_UNIX'
|
137
|
+
|
138
|
+
add_define "HAVE_KQUEUE" if have_header("sys/event.h") && have_header("sys/queue.h")
|
139
|
+
end
|
140
|
+
|
141
|
+
# Adjust number of file descriptors (FD) on Windows
|
142
|
+
|
143
|
+
if RbConfig::CONFIG["host_os"] =~ /mingw/
|
144
|
+
found = RbConfig::CONFIG.values_at("CFLAGS", "CPPFLAGS").
|
145
|
+
any? { |v| v.include?("FD_SETSIZE") }
|
146
|
+
|
147
|
+
add_define "FD_SETSIZE=32767" unless found
|
148
|
+
end
|
149
|
+
|
150
|
+
# Main platform invariances:
|
151
|
+
|
152
|
+
case RUBY_PLATFORM
|
153
|
+
when /mswin32/, /mingw32/, /bccwin32/
|
154
|
+
check_heads(%w[windows.h winsock.h], true)
|
155
|
+
check_libs(%w[kernel32 rpcrt4 gdi32], true)
|
156
|
+
|
157
|
+
if GNU_CHAIN
|
158
|
+
CONFIG['LDSHAREDXX'] = "$(CXX) -shared -static-libgcc -static-libstdc++"
|
159
|
+
else
|
160
|
+
$defs.push "-EHs"
|
161
|
+
$defs.push "-GR"
|
162
|
+
end
|
163
|
+
|
164
|
+
# Newer versions of Ruby already define _WIN32_WINNT, which is needed
|
165
|
+
# to get access to newer POSIX networking functions (e.g. getaddrinfo)
|
166
|
+
add_define '_WIN32_WINNT=0x0501' unless have_func('getaddrinfo')
|
167
|
+
|
168
|
+
when /solaris/
|
169
|
+
add_define 'OS_SOLARIS8'
|
170
|
+
check_libs(%w[nsl socket], true)
|
171
|
+
|
172
|
+
# If Ruby was compiled for 32-bits, then select() can only handle 1024 fds
|
173
|
+
# There is an alternate function, select_large_fdset, that supports more.
|
174
|
+
have_func('select_large_fdset', 'sys/select.h')
|
175
|
+
|
176
|
+
if CONFIG['CC'] == 'cc' && (
|
177
|
+
`cc -flags 2>&1` =~ /Sun/ || # detect SUNWspro compiler
|
178
|
+
`cc -V 2>&1` =~ /Sun/ # detect Solaris Studio compiler
|
179
|
+
)
|
180
|
+
# SUN CHAIN
|
181
|
+
add_define 'CC_SUNWspro'
|
182
|
+
$preload = ["\nCXX = CC"] # hack a CXX= line into the makefile
|
183
|
+
$CFLAGS = CONFIG['CFLAGS'] = "-KPIC"
|
184
|
+
CONFIG['CCDLFLAGS'] = "-KPIC"
|
185
|
+
CONFIG['LDSHARED'] = "$(CXX) -G -KPIC -lCstd"
|
186
|
+
CONFIG['LDSHAREDXX'] = "$(CXX) -G -KPIC -lCstd"
|
187
|
+
else
|
188
|
+
# GNU CHAIN
|
189
|
+
# on Unix we need a g++ link, not gcc.
|
190
|
+
CONFIG['LDSHARED'] = "$(CXX) -shared"
|
191
|
+
end
|
192
|
+
|
193
|
+
when /openbsd/
|
194
|
+
# OpenBSD branch contributed by Guillaume Sellier.
|
195
|
+
|
196
|
+
# on Unix we need a g++ link, not gcc. On OpenBSD, linking against libstdc++ have to be explicitly done for shared libs
|
197
|
+
CONFIG['LDSHARED'] = "$(CXX) -shared -lstdc++ -fPIC"
|
198
|
+
CONFIG['LDSHAREDXX'] = "$(CXX) -shared -lstdc++ -fPIC"
|
199
|
+
|
200
|
+
when /darwin/
|
201
|
+
add_define 'OS_DARWIN'
|
202
|
+
|
203
|
+
# on Unix we need a g++ link, not gcc.
|
204
|
+
# Ff line contributed by Daniel Harple.
|
205
|
+
CONFIG['LDSHARED'] = "$(CXX) " + CONFIG['LDSHARED'].split[1..-1].join(' ')
|
206
|
+
|
207
|
+
when /linux/
|
208
|
+
add_define 'HAVE_EPOLL' if have_func('epoll_create', 'sys/epoll.h')
|
209
|
+
|
210
|
+
# on Unix we need a g++ link, not gcc.
|
211
|
+
CONFIG['LDSHARED'] = "$(CXX) -shared"
|
212
|
+
|
213
|
+
when /aix/
|
214
|
+
CONFIG['LDSHARED'] = "$(CXX) -shared -Wl,-G -Wl,-brtl"
|
215
|
+
|
216
|
+
when /cygwin/
|
217
|
+
# For rubies built with Cygwin, CXX may be set to CC, which is just
|
218
|
+
# a wrapper for gcc.
|
219
|
+
# This will compile, but it will not link to the C++ std library.
|
220
|
+
# Explicitly set CXX to use g++.
|
221
|
+
CONFIG['CXX'] = "g++"
|
222
|
+
# on Unix we need a g++ link, not gcc.
|
223
|
+
CONFIG['LDSHARED'] = "$(CXX) -shared"
|
224
|
+
|
225
|
+
else
|
226
|
+
# on Unix we need a g++ link, not gcc.
|
227
|
+
CONFIG['LDSHARED'] = "$(CXX) -shared"
|
228
|
+
end
|
229
|
+
|
230
|
+
# Platform-specific time functions
|
231
|
+
if have_func('clock_gettime')
|
232
|
+
# clock_gettime is POSIX, but the monotonic clocks are not
|
233
|
+
have_const('CLOCK_MONOTONIC_RAW', 'time.h') # Linux
|
234
|
+
have_const('CLOCK_MONOTONIC', 'time.h') # Linux, Solaris, BSDs
|
235
|
+
else
|
236
|
+
have_func('gethrtime') # Older Solaris and HP-UX
|
237
|
+
end
|
238
|
+
|
239
|
+
# Hack so that try_link will test with a C++ compiler instead of a C compiler
|
240
|
+
TRY_LINK.sub!('$(CC)', '$(CXX)')
|
241
|
+
|
242
|
+
# This is our wishlist. We use whichever flags work on the host.
|
243
|
+
# In the future, add -Werror to make sure all warnings are resolved.
|
244
|
+
# deprecated-declarations are used in OS X OpenSSL
|
245
|
+
# ignored-qualifiers are used by the Bindings (would-be void *)
|
246
|
+
# unused-result because GCC 4.6 no longer silences (void) ignore_this(function)
|
247
|
+
# address because on Windows, rb_fd_select checks if &fds is non-NULL, which it cannot be
|
248
|
+
%w(
|
249
|
+
-Wall
|
250
|
+
-Wextra
|
251
|
+
-Wno-deprecated-declarations
|
252
|
+
-Wno-ignored-qualifiers
|
253
|
+
-Wno-unused-result
|
254
|
+
-Wno-address
|
255
|
+
).select do |flag|
|
256
|
+
try_link('int main() {return 0;}', flag)
|
257
|
+
end.each do |flag|
|
258
|
+
CONFIG['CXXFLAGS'] << ' ' << flag
|
259
|
+
end
|
260
|
+
puts "CXXFLAGS=#{CONFIG['CXXFLAGS']}"
|
261
|
+
|
262
|
+
# Solaris C++ compiler doesn't have make_pair()
|
263
|
+
add_define 'HAVE_MAKE_PAIR' if try_link(<<SRC, '-lstdc++')
|
264
|
+
#include <utility>
|
265
|
+
using namespace std;
|
266
|
+
int main(){ pair<const int,int> tuple = make_pair(1,2); }
|
267
|
+
SRC
|
268
|
+
TRY_LINK.sub!('$(CXX)', '$(CC)')
|
269
|
+
|
270
|
+
create_makefile "rubyeventmachine"
|
@@ -0,0 +1,110 @@
|
|
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
|
+
end
|
40
|
+
|
41
|
+
# Main platform invariances:
|
42
|
+
|
43
|
+
case RUBY_PLATFORM
|
44
|
+
when /mswin32/, /mingw32/, /bccwin32/
|
45
|
+
check_heads(%w[windows.h winsock.h], true)
|
46
|
+
check_libs(%w[kernel32 rpcrt4 gdi32], true)
|
47
|
+
|
48
|
+
if GNU_CHAIN
|
49
|
+
CONFIG['LDSHAREDXX'] = "$(CXX) -shared -static-libgcc -static-libstdc++"
|
50
|
+
else
|
51
|
+
$defs.push "-EHs"
|
52
|
+
$defs.push "-GR"
|
53
|
+
end
|
54
|
+
|
55
|
+
when /solaris/
|
56
|
+
add_define 'OS_SOLARIS8'
|
57
|
+
check_libs(%w[nsl socket], true)
|
58
|
+
|
59
|
+
if CONFIG['CC'] == 'cc' && (
|
60
|
+
`cc -flags 2>&1` =~ /Sun/ || # detect SUNWspro compiler
|
61
|
+
`cc -V 2>&1` =~ /Sun/ # detect Solaris Studio compiler
|
62
|
+
)
|
63
|
+
# SUN CHAIN
|
64
|
+
add_define 'CC_SUNWspro'
|
65
|
+
$preload = ["\nCXX = CC"] # hack a CXX= line into the makefile
|
66
|
+
$CFLAGS = CONFIG['CFLAGS'] = "-KPIC"
|
67
|
+
CONFIG['CCDLFLAGS'] = "-KPIC"
|
68
|
+
CONFIG['LDSHARED'] = "$(CXX) -G -KPIC -lCstd"
|
69
|
+
CONFIG['LDSHAREDXX'] = "$(CXX) -G -KPIC -lCstd"
|
70
|
+
else
|
71
|
+
# GNU CHAIN
|
72
|
+
# on Unix we need a g++ link, not gcc.
|
73
|
+
CONFIG['LDSHARED'] = "$(CXX) -shared"
|
74
|
+
end
|
75
|
+
|
76
|
+
when /openbsd/
|
77
|
+
# OpenBSD branch contributed by Guillaume Sellier.
|
78
|
+
|
79
|
+
# on Unix we need a g++ link, not gcc. On OpenBSD, linking against libstdc++ have to be explicitly done for shared libs
|
80
|
+
CONFIG['LDSHARED'] = "$(CXX) -shared -lstdc++ -fPIC"
|
81
|
+
CONFIG['LDSHAREDXX'] = "$(CXX) -shared -lstdc++ -fPIC"
|
82
|
+
|
83
|
+
when /darwin/
|
84
|
+
# on Unix we need a g++ link, not gcc.
|
85
|
+
# Ff line contributed by Daniel Harple.
|
86
|
+
CONFIG['LDSHARED'] = "$(CXX) " + CONFIG['LDSHARED'].split[1..-1].join(' ')
|
87
|
+
|
88
|
+
when /linux/
|
89
|
+
# on Unix we need a g++ link, not gcc.
|
90
|
+
CONFIG['LDSHARED'] = "$(CXX) -shared"
|
91
|
+
|
92
|
+
when /aix/
|
93
|
+
# on Unix we need a g++ link, not gcc.
|
94
|
+
CONFIG['LDSHARED'] = "$(CXX) -shared -Wl,-G"
|
95
|
+
|
96
|
+
when /cygwin/
|
97
|
+
# For rubies built with Cygwin, CXX may be set to CC, which is just
|
98
|
+
# a wrapper for gcc.
|
99
|
+
# This will compile, but it will not link to the C++ std library.
|
100
|
+
# Explicitly set CXX to use g++.
|
101
|
+
CONFIG['CXX'] = "g++"
|
102
|
+
# on Unix we need a g++ link, not gcc.
|
103
|
+
CONFIG['LDSHARED'] = "$(CXX) -shared"
|
104
|
+
|
105
|
+
else
|
106
|
+
# on Unix we need a g++ link, not gcc.
|
107
|
+
CONFIG['LDSHARED'] = "$(CXX) -shared"
|
108
|
+
end
|
109
|
+
|
110
|
+
create_makefile "fastfilereaderext"
|
@@ -0,0 +1,216 @@
|
|
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 CC_SUNWspro
|
92
|
+
// TODO: The void * cast works fine on Solaris 11, but
|
93
|
+
// I don't know at what point that changed from older Solaris.
|
94
|
+
munmap ((char*)MapPoint, FileSize);
|
95
|
+
#else
|
96
|
+
munmap ((void*)MapPoint, FileSize);
|
97
|
+
#endif
|
98
|
+
MapPoint = NULL;
|
99
|
+
}
|
100
|
+
if (Fd >= 0) {
|
101
|
+
close (Fd);
|
102
|
+
Fd = -1;
|
103
|
+
}
|
104
|
+
}
|
105
|
+
|
106
|
+
/******************
|
107
|
+
Mapper_t::GetChunk
|
108
|
+
******************/
|
109
|
+
|
110
|
+
const char *Mapper_t::GetChunk (unsigned start)
|
111
|
+
{
|
112
|
+
return MapPoint + start;
|
113
|
+
}
|
114
|
+
|
115
|
+
|
116
|
+
|
117
|
+
#endif // OS_UNIX
|
118
|
+
|
119
|
+
|
120
|
+
//////////////////////////////////////////////////////////////////////
|
121
|
+
// WINDOWS implementation
|
122
|
+
//////////////////////////////////////////////////////////////////////
|
123
|
+
|
124
|
+
#ifdef OS_WIN32
|
125
|
+
|
126
|
+
#include <windows.h>
|
127
|
+
|
128
|
+
#include <iostream>
|
129
|
+
#include <string>
|
130
|
+
#include <stdexcept>
|
131
|
+
using namespace std;
|
132
|
+
|
133
|
+
#include "mapper.h"
|
134
|
+
|
135
|
+
/******************
|
136
|
+
Mapper_t::Mapper_t
|
137
|
+
******************/
|
138
|
+
|
139
|
+
Mapper_t::Mapper_t (const string &filename)
|
140
|
+
{
|
141
|
+
/* We ASSUME we can open the file.
|
142
|
+
* (More precisely, we assume someone else checked before we got here.)
|
143
|
+
*/
|
144
|
+
|
145
|
+
hFile = INVALID_HANDLE_VALUE;
|
146
|
+
hMapping = NULL;
|
147
|
+
MapPoint = NULL;
|
148
|
+
FileSize = 0;
|
149
|
+
|
150
|
+
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);
|
151
|
+
|
152
|
+
if (hFile == INVALID_HANDLE_VALUE)
|
153
|
+
throw runtime_error ("File not found");
|
154
|
+
|
155
|
+
BY_HANDLE_FILE_INFORMATION i;
|
156
|
+
if (GetFileInformationByHandle (hFile, &i))
|
157
|
+
FileSize = i.nFileSizeLow;
|
158
|
+
|
159
|
+
hMapping = CreateFileMapping (hFile, NULL, PAGE_READWRITE, 0, 0, NULL);
|
160
|
+
if (!hMapping)
|
161
|
+
throw runtime_error ("File not mapped");
|
162
|
+
|
163
|
+
#ifdef OS_WIN32
|
164
|
+
MapPoint = (char*) MapViewOfFile (hMapping, FILE_MAP_WRITE, 0, 0, 0);
|
165
|
+
#else
|
166
|
+
MapPoint = (const char*) MapViewOfFile (hMapping, FILE_MAP_WRITE, 0, 0, 0);
|
167
|
+
#endif
|
168
|
+
if (!MapPoint)
|
169
|
+
throw runtime_error ("Mappoint not read");
|
170
|
+
}
|
171
|
+
|
172
|
+
|
173
|
+
/*******************
|
174
|
+
Mapper_t::~Mapper_t
|
175
|
+
*******************/
|
176
|
+
|
177
|
+
Mapper_t::~Mapper_t()
|
178
|
+
{
|
179
|
+
Close();
|
180
|
+
}
|
181
|
+
|
182
|
+
/***************
|
183
|
+
Mapper_t::Close
|
184
|
+
***************/
|
185
|
+
|
186
|
+
void Mapper_t::Close()
|
187
|
+
{
|
188
|
+
// Can be called multiple times.
|
189
|
+
// Calls to GetChunk are invalid after a call to Close.
|
190
|
+
if (MapPoint) {
|
191
|
+
UnmapViewOfFile (MapPoint);
|
192
|
+
MapPoint = NULL;
|
193
|
+
}
|
194
|
+
if (hMapping != NULL) {
|
195
|
+
CloseHandle (hMapping);
|
196
|
+
hMapping = NULL;
|
197
|
+
}
|
198
|
+
if (hFile != INVALID_HANDLE_VALUE) {
|
199
|
+
CloseHandle (hFile);
|
200
|
+
hFile = INVALID_HANDLE_VALUE;
|
201
|
+
}
|
202
|
+
}
|
203
|
+
|
204
|
+
|
205
|
+
/******************
|
206
|
+
Mapper_t::GetChunk
|
207
|
+
******************/
|
208
|
+
|
209
|
+
const char *Mapper_t::GetChunk (unsigned start)
|
210
|
+
{
|
211
|
+
return MapPoint + start;
|
212
|
+
}
|
213
|
+
|
214
|
+
|
215
|
+
|
216
|
+
#endif // OS_WINDOWS
|