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.
Files changed (180) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +179 -0
  3. data/GNU +281 -0
  4. data/LICENSE +60 -0
  5. data/README.md +110 -0
  6. data/docs/DocumentationGuidesIndex.md +27 -0
  7. data/docs/GettingStarted.md +520 -0
  8. data/docs/old/ChangeLog +211 -0
  9. data/docs/old/DEFERRABLES +246 -0
  10. data/docs/old/EPOLL +141 -0
  11. data/docs/old/INSTALL +13 -0
  12. data/docs/old/KEYBOARD +42 -0
  13. data/docs/old/LEGAL +25 -0
  14. data/docs/old/LIGHTWEIGHT_CONCURRENCY +130 -0
  15. data/docs/old/PURE_RUBY +75 -0
  16. data/docs/old/RELEASE_NOTES +94 -0
  17. data/docs/old/SMTP +4 -0
  18. data/docs/old/SPAWNED_PROCESSES +148 -0
  19. data/docs/old/TODO +8 -0
  20. data/examples/guides/getting_started/01_eventmachine_echo_server.rb +18 -0
  21. data/examples/guides/getting_started/02_eventmachine_echo_server_that_recognizes_exit_command.rb +22 -0
  22. data/examples/guides/getting_started/03_simple_chat_server.rb +149 -0
  23. data/examples/guides/getting_started/04_simple_chat_server_step_one.rb +27 -0
  24. data/examples/guides/getting_started/05_simple_chat_server_step_two.rb +43 -0
  25. data/examples/guides/getting_started/06_simple_chat_server_step_three.rb +98 -0
  26. data/examples/guides/getting_started/07_simple_chat_server_step_four.rb +121 -0
  27. data/examples/guides/getting_started/08_simple_chat_server_step_five.rb +141 -0
  28. data/examples/old/ex_channel.rb +43 -0
  29. data/examples/old/ex_queue.rb +2 -0
  30. data/examples/old/ex_tick_loop_array.rb +15 -0
  31. data/examples/old/ex_tick_loop_counter.rb +32 -0
  32. data/examples/old/helper.rb +2 -0
  33. data/ext/binder.cpp +124 -0
  34. data/ext/binder.h +52 -0
  35. data/ext/cmain.cpp +1046 -0
  36. data/ext/ed.cpp +2238 -0
  37. data/ext/ed.h +460 -0
  38. data/ext/em.cpp +2378 -0
  39. data/ext/em.h +266 -0
  40. data/ext/eventmachine.h +152 -0
  41. data/ext/extconf.rb +285 -0
  42. data/ext/fastfilereader/extconf.rb +120 -0
  43. data/ext/fastfilereader/mapper.cpp +214 -0
  44. data/ext/fastfilereader/mapper.h +59 -0
  45. data/ext/fastfilereader/rubymain.cpp +126 -0
  46. data/ext/kb.cpp +79 -0
  47. data/ext/page.cpp +107 -0
  48. data/ext/page.h +51 -0
  49. data/ext/pipe.cpp +354 -0
  50. data/ext/project.h +174 -0
  51. data/ext/rubymain.cpp +1610 -0
  52. data/ext/ssl.cpp +627 -0
  53. data/ext/ssl.h +103 -0
  54. data/ext/wait_for_single_fd.h +36 -0
  55. data/java/.classpath +8 -0
  56. data/java/.project +17 -0
  57. data/java/src/com/rubyeventmachine/EmReactor.java +625 -0
  58. data/java/src/com/rubyeventmachine/EmReactorException.java +40 -0
  59. data/java/src/com/rubyeventmachine/EmReactorInterface.java +70 -0
  60. data/java/src/com/rubyeventmachine/EventableChannel.java +72 -0
  61. data/java/src/com/rubyeventmachine/EventableDatagramChannel.java +201 -0
  62. data/java/src/com/rubyeventmachine/EventableSocketChannel.java +415 -0
  63. data/java/src/com/rubyeventmachine/NullEmReactor.java +157 -0
  64. data/java/src/com/rubyeventmachine/NullEventableChannel.java +81 -0
  65. data/lib/em/buftok.rb +59 -0
  66. data/lib/em/callback.rb +58 -0
  67. data/lib/em/channel.rb +69 -0
  68. data/lib/em/completion.rb +307 -0
  69. data/lib/em/connection.rb +776 -0
  70. data/lib/em/deferrable.rb +210 -0
  71. data/lib/em/deferrable/pool.rb +2 -0
  72. data/lib/em/file_watch.rb +73 -0
  73. data/lib/em/future.rb +61 -0
  74. data/lib/em/io_streamer.rb +68 -0
  75. data/lib/em/iterator.rb +252 -0
  76. data/lib/em/messages.rb +66 -0
  77. data/lib/em/pool.rb +151 -0
  78. data/lib/em/process_watch.rb +45 -0
  79. data/lib/em/processes.rb +123 -0
  80. data/lib/em/protocols.rb +37 -0
  81. data/lib/em/protocols/header_and_content.rb +138 -0
  82. data/lib/em/protocols/httpclient.rb +303 -0
  83. data/lib/em/protocols/httpclient2.rb +602 -0
  84. data/lib/em/protocols/line_and_text.rb +125 -0
  85. data/lib/em/protocols/line_protocol.rb +33 -0
  86. data/lib/em/protocols/linetext2.rb +179 -0
  87. data/lib/em/protocols/memcache.rb +331 -0
  88. data/lib/em/protocols/object_protocol.rb +46 -0
  89. data/lib/em/protocols/postgres3.rb +246 -0
  90. data/lib/em/protocols/saslauth.rb +175 -0
  91. data/lib/em/protocols/smtpclient.rb +394 -0
  92. data/lib/em/protocols/smtpserver.rb +666 -0
  93. data/lib/em/protocols/socks4.rb +66 -0
  94. data/lib/em/protocols/stomp.rb +205 -0
  95. data/lib/em/protocols/tcptest.rb +54 -0
  96. data/lib/em/pure_ruby.rb +1299 -0
  97. data/lib/em/queue.rb +80 -0
  98. data/lib/em/resolver.rb +232 -0
  99. data/lib/em/spawnable.rb +84 -0
  100. data/lib/em/streamer.rb +118 -0
  101. data/lib/em/threaded_resource.rb +90 -0
  102. data/lib/em/tick_loop.rb +85 -0
  103. data/lib/em/timers.rb +61 -0
  104. data/lib/em/version.rb +3 -0
  105. data/lib/eventmachine.rb +1602 -0
  106. data/lib/jeventmachine.rb +318 -0
  107. data/rakelib/package.rake +120 -0
  108. data/rakelib/test.rake +6 -0
  109. data/rakelib/test_pure.rake +11 -0
  110. data/tests/client.crt +31 -0
  111. data/tests/client.key +51 -0
  112. data/tests/dhparam.pem +13 -0
  113. data/tests/em_ssl_handlers.rb +153 -0
  114. data/tests/em_test_helper.rb +198 -0
  115. data/tests/jruby/test_jeventmachine.rb +38 -0
  116. data/tests/test_attach.rb +199 -0
  117. data/tests/test_basic.rb +321 -0
  118. data/tests/test_channel.rb +75 -0
  119. data/tests/test_completion.rb +178 -0
  120. data/tests/test_connection_count.rb +83 -0
  121. data/tests/test_connection_write.rb +35 -0
  122. data/tests/test_defer.rb +35 -0
  123. data/tests/test_deferrable.rb +35 -0
  124. data/tests/test_epoll.rb +141 -0
  125. data/tests/test_error_handler.rb +38 -0
  126. data/tests/test_exc.rb +37 -0
  127. data/tests/test_file_watch.rb +86 -0
  128. data/tests/test_fork.rb +75 -0
  129. data/tests/test_futures.rb +170 -0
  130. data/tests/test_handler_check.rb +35 -0
  131. data/tests/test_hc.rb +155 -0
  132. data/tests/test_httpclient.rb +238 -0
  133. data/tests/test_httpclient2.rb +132 -0
  134. data/tests/test_idle_connection.rb +31 -0
  135. data/tests/test_inactivity_timeout.rb +102 -0
  136. data/tests/test_io_streamer.rb +47 -0
  137. data/tests/test_ipv4.rb +96 -0
  138. data/tests/test_ipv6.rb +107 -0
  139. data/tests/test_iterator.rb +122 -0
  140. data/tests/test_kb.rb +28 -0
  141. data/tests/test_keepalive.rb +113 -0
  142. data/tests/test_line_protocol.rb +33 -0
  143. data/tests/test_ltp.rb +155 -0
  144. data/tests/test_ltp2.rb +332 -0
  145. data/tests/test_many_fds.rb +21 -0
  146. data/tests/test_next_tick.rb +104 -0
  147. data/tests/test_object_protocol.rb +36 -0
  148. data/tests/test_pause.rb +109 -0
  149. data/tests/test_pending_connect_timeout.rb +52 -0
  150. data/tests/test_pool.rb +196 -0
  151. data/tests/test_process_watch.rb +50 -0
  152. data/tests/test_processes.rb +128 -0
  153. data/tests/test_proxy_connection.rb +180 -0
  154. data/tests/test_pure.rb +156 -0
  155. data/tests/test_queue.rb +64 -0
  156. data/tests/test_resolver.rb +129 -0
  157. data/tests/test_running.rb +14 -0
  158. data/tests/test_sasl.rb +46 -0
  159. data/tests/test_send_file.rb +217 -0
  160. data/tests/test_servers.rb +32 -0
  161. data/tests/test_shutdown_hooks.rb +23 -0
  162. data/tests/test_smtpclient.rb +75 -0
  163. data/tests/test_smtpserver.rb +90 -0
  164. data/tests/test_sock_opt.rb +53 -0
  165. data/tests/test_spawn.rb +290 -0
  166. data/tests/test_ssl_args.rb +41 -0
  167. data/tests/test_ssl_dhparam.rb +57 -0
  168. data/tests/test_ssl_ecdh_curve.rb +57 -0
  169. data/tests/test_ssl_extensions.rb +24 -0
  170. data/tests/test_ssl_methods.rb +31 -0
  171. data/tests/test_ssl_protocols.rb +190 -0
  172. data/tests/test_ssl_verify.rb +52 -0
  173. data/tests/test_stomp.rb +38 -0
  174. data/tests/test_system.rb +46 -0
  175. data/tests/test_threaded_resource.rb +68 -0
  176. data/tests/test_tick_loop.rb +58 -0
  177. data/tests/test_timers.rb +150 -0
  178. data/tests/test_ud.rb +8 -0
  179. data/tests/test_unbind_reason.rb +40 -0
  180. 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
+