eventmachine-mkroman 1.3.0.dev.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (182) 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 +2243 -0
  37. data/ext/ed.h +463 -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 +291 -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 +1643 -0
  52. data/ext/ssl.cpp +701 -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 +802 -0
  70. data/lib/em/deferrable/pool.rb +2 -0
  71. data/lib/em/deferrable.rb +210 -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/header_and_content.rb +138 -0
  81. data/lib/em/protocols/httpclient.rb +303 -0
  82. data/lib/em/protocols/httpclient2.rb +602 -0
  83. data/lib/em/protocols/line_and_text.rb +125 -0
  84. data/lib/em/protocols/line_protocol.rb +33 -0
  85. data/lib/em/protocols/linetext2.rb +179 -0
  86. data/lib/em/protocols/memcache.rb +331 -0
  87. data/lib/em/protocols/object_protocol.rb +46 -0
  88. data/lib/em/protocols/postgres3.rb +246 -0
  89. data/lib/em/protocols/saslauth.rb +175 -0
  90. data/lib/em/protocols/smtpclient.rb +394 -0
  91. data/lib/em/protocols/smtpserver.rb +666 -0
  92. data/lib/em/protocols/socks4.rb +66 -0
  93. data/lib/em/protocols/stomp.rb +205 -0
  94. data/lib/em/protocols/tcptest.rb +54 -0
  95. data/lib/em/protocols.rb +37 -0
  96. data/lib/em/pure_ruby.rb +1300 -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 +319 -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 +165 -0
  114. data/tests/em_test_helper.rb +198 -0
  115. data/tests/encoded_client.key +54 -0
  116. data/tests/jruby/test_jeventmachine.rb +38 -0
  117. data/tests/test_attach.rb +199 -0
  118. data/tests/test_basic.rb +321 -0
  119. data/tests/test_channel.rb +75 -0
  120. data/tests/test_completion.rb +178 -0
  121. data/tests/test_connection_count.rb +83 -0
  122. data/tests/test_connection_write.rb +35 -0
  123. data/tests/test_defer.rb +35 -0
  124. data/tests/test_deferrable.rb +35 -0
  125. data/tests/test_epoll.rb +141 -0
  126. data/tests/test_error_handler.rb +38 -0
  127. data/tests/test_exc.rb +37 -0
  128. data/tests/test_file_watch.rb +86 -0
  129. data/tests/test_fork.rb +75 -0
  130. data/tests/test_futures.rb +170 -0
  131. data/tests/test_handler_check.rb +35 -0
  132. data/tests/test_hc.rb +155 -0
  133. data/tests/test_httpclient.rb +238 -0
  134. data/tests/test_httpclient2.rb +132 -0
  135. data/tests/test_idle_connection.rb +31 -0
  136. data/tests/test_inactivity_timeout.rb +102 -0
  137. data/tests/test_io_streamer.rb +48 -0
  138. data/tests/test_ipv4.rb +96 -0
  139. data/tests/test_ipv6.rb +107 -0
  140. data/tests/test_iterator.rb +122 -0
  141. data/tests/test_kb.rb +28 -0
  142. data/tests/test_keepalive.rb +113 -0
  143. data/tests/test_line_protocol.rb +33 -0
  144. data/tests/test_ltp.rb +155 -0
  145. data/tests/test_ltp2.rb +332 -0
  146. data/tests/test_many_fds.rb +21 -0
  147. data/tests/test_next_tick.rb +104 -0
  148. data/tests/test_object_protocol.rb +36 -0
  149. data/tests/test_pause.rb +109 -0
  150. data/tests/test_pending_connect_timeout.rb +52 -0
  151. data/tests/test_pool.rb +196 -0
  152. data/tests/test_process_watch.rb +50 -0
  153. data/tests/test_processes.rb +147 -0
  154. data/tests/test_proxy_connection.rb +180 -0
  155. data/tests/test_pure.rb +156 -0
  156. data/tests/test_queue.rb +64 -0
  157. data/tests/test_resolver.rb +129 -0
  158. data/tests/test_running.rb +14 -0
  159. data/tests/test_sasl.rb +46 -0
  160. data/tests/test_send_file.rb +217 -0
  161. data/tests/test_servers.rb +32 -0
  162. data/tests/test_shutdown_hooks.rb +23 -0
  163. data/tests/test_smtpclient.rb +75 -0
  164. data/tests/test_smtpserver.rb +90 -0
  165. data/tests/test_sock_opt.rb +53 -0
  166. data/tests/test_spawn.rb +290 -0
  167. data/tests/test_ssl_args.rb +70 -0
  168. data/tests/test_ssl_dhparam.rb +57 -0
  169. data/tests/test_ssl_ecdh_curve.rb +57 -0
  170. data/tests/test_ssl_extensions.rb +24 -0
  171. data/tests/test_ssl_inline_cert.rb +222 -0
  172. data/tests/test_ssl_methods.rb +31 -0
  173. data/tests/test_ssl_protocols.rb +190 -0
  174. data/tests/test_ssl_verify.rb +108 -0
  175. data/tests/test_stomp.rb +38 -0
  176. data/tests/test_system.rb +46 -0
  177. data/tests/test_threaded_resource.rb +68 -0
  178. data/tests/test_tick_loop.rb +58 -0
  179. data/tests/test_timers.rb +150 -0
  180. data/tests/test_ud.rb +8 -0
  181. data/tests/test_unbind_reason.rb +40 -0
  182. metadata +389 -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
+
data/ext/kb.cpp ADDED
@@ -0,0 +1,79 @@
1
+ /*****************************************************************************
2
+
3
+ $Id$
4
+
5
+ File: kb.cpp
6
+ Date: 24Aug07
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
+ #include "project.h"
21
+
22
+
23
+ /**************************************
24
+ KeyboardDescriptor::KeyboardDescriptor
25
+ **************************************/
26
+
27
+ KeyboardDescriptor::KeyboardDescriptor (EventMachine_t *parent_em):
28
+ EventableDescriptor (0, parent_em),
29
+ bReadAttemptedAfterClose (false)
30
+ {
31
+ #ifdef HAVE_EPOLL
32
+ EpollEvent.events = EPOLLIN;
33
+ #endif
34
+ #ifdef HAVE_KQUEUE
35
+ MyEventMachine->ArmKqueueReader (this);
36
+ #endif
37
+ }
38
+
39
+
40
+ /***************************************
41
+ KeyboardDescriptor::~KeyboardDescriptor
42
+ ***************************************/
43
+
44
+ KeyboardDescriptor::~KeyboardDescriptor()
45
+ {
46
+ }
47
+
48
+
49
+ /*************************
50
+ KeyboardDescriptor::Write
51
+ *************************/
52
+
53
+ void KeyboardDescriptor::Write()
54
+ {
55
+ // Why are we here?
56
+ throw std::runtime_error ("bad code path in keyboard handler");
57
+ }
58
+
59
+
60
+ /*****************************
61
+ KeyboardDescriptor::Heartbeat
62
+ *****************************/
63
+
64
+ void KeyboardDescriptor::Heartbeat()
65
+ {
66
+ // no-op
67
+ }
68
+
69
+
70
+ /************************
71
+ KeyboardDescriptor::Read
72
+ ************************/
73
+
74
+ void KeyboardDescriptor::Read()
75
+ {
76
+ char c;
77
+ (void)read (GetSocket(), &c, 1);
78
+ _GenericInboundDispatch(&c, 1);
79
+ }
data/ext/page.cpp ADDED
@@ -0,0 +1,107 @@
1
+ /*****************************************************************************
2
+
3
+ $Id$
4
+
5
+ File: page.cpp
6
+ Date: 30Apr06
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
+ #include "project.h"
22
+
23
+
24
+ /******************
25
+ PageList::PageList
26
+ ******************/
27
+
28
+ PageList::PageList()
29
+ {
30
+ }
31
+
32
+
33
+ /*******************
34
+ PageList::~PageList
35
+ *******************/
36
+
37
+ PageList::~PageList()
38
+ {
39
+ while (HasPages())
40
+ PopFront();
41
+ }
42
+
43
+
44
+ /***************
45
+ PageList::Front
46
+ ***************/
47
+
48
+ void PageList::Front (const char **page, int *length)
49
+ {
50
+ assert (page && length);
51
+
52
+ if (HasPages()) {
53
+ Page p = Pages.front();
54
+ *page = p.Buffer;
55
+ *length = p.Size;
56
+ }
57
+ else {
58
+ *page = NULL;
59
+ *length = 0;
60
+ }
61
+ }
62
+
63
+
64
+ /******************
65
+ PageList::PopFront
66
+ ******************/
67
+
68
+ void PageList::PopFront()
69
+ {
70
+ if (HasPages()) {
71
+ Page p = Pages.front();
72
+ Pages.pop_front();
73
+ if (p.Buffer)
74
+ free ((void*)p.Buffer);
75
+ }
76
+ }
77
+
78
+
79
+ /******************
80
+ PageList::HasPages
81
+ ******************/
82
+
83
+ bool PageList::HasPages()
84
+ {
85
+ return (Pages.size() > 0) ? true : false;
86
+ }
87
+
88
+
89
+ /**************
90
+ PageList::Push
91
+ **************/
92
+
93
+ void PageList::Push (const char *buf, int size)
94
+ {
95
+ if (buf && (size > 0)) {
96
+ char *copy = (char*) malloc (size);
97
+ if (!copy)
98
+ throw std::runtime_error ("no memory in pagelist");
99
+ memcpy (copy, buf, size);
100
+ Pages.push_back (Page (copy, size));
101
+ }
102
+ }
103
+
104
+
105
+
106
+
107
+