eventmachine-maglev- 0.12.10 → 1.0.0.beta.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (174) hide show
  1. data/.gitignore +7 -0
  2. data/.yardopts +7 -0
  3. data/Gemfile +3 -0
  4. data/README.md +109 -0
  5. data/Rakefile +14 -368
  6. data/docs/DocumentationGuidesIndex.md +27 -0
  7. data/docs/GettingStarted.md +521 -0
  8. data/docs/old/DEFERRABLES +246 -0
  9. data/docs/{KEYBOARD → old/KEYBOARD} +15 -11
  10. data/docs/old/LIGHTWEIGHT_CONCURRENCY +130 -0
  11. data/docs/old/SMTP +4 -0
  12. data/docs/old/SPAWNED_PROCESSES +148 -0
  13. data/eventmachine.gemspec +20 -26
  14. data/examples/guides/getting_started/01_eventmachine_echo_server.rb +18 -0
  15. data/examples/guides/getting_started/02_eventmachine_echo_server_that_recognizes_exit_command.rb +22 -0
  16. data/examples/guides/getting_started/03_simple_chat_server.rb +149 -0
  17. data/examples/guides/getting_started/04_simple_chat_server_step_one.rb +27 -0
  18. data/examples/guides/getting_started/05_simple_chat_server_step_two.rb +43 -0
  19. data/examples/guides/getting_started/06_simple_chat_server_step_three.rb +98 -0
  20. data/examples/guides/getting_started/07_simple_chat_server_step_four.rb +121 -0
  21. data/examples/guides/getting_started/08_simple_chat_server_step_five.rb +141 -0
  22. data/examples/{ex_channel.rb → old/ex_channel.rb} +3 -3
  23. data/examples/old/ex_tick_loop_array.rb +15 -0
  24. data/examples/old/ex_tick_loop_counter.rb +32 -0
  25. data/ext/binder.cpp +0 -1
  26. data/ext/cmain.cpp +40 -29
  27. data/ext/ed.cpp +189 -134
  28. data/ext/ed.h +34 -40
  29. data/ext/em.cpp +388 -340
  30. data/ext/em.h +29 -32
  31. data/ext/eventmachine.h +7 -6
  32. data/ext/extconf.rb +57 -48
  33. data/ext/fastfilereader/extconf.rb +5 -3
  34. data/ext/fastfilereader/mapper.cpp +1 -1
  35. data/ext/fastfilereader/rubymain.cpp +0 -1
  36. data/ext/kb.cpp +1 -3
  37. data/ext/pipe.cpp +9 -11
  38. data/ext/project.h +12 -8
  39. data/ext/rubymain.cpp +158 -112
  40. data/java/src/com/rubyeventmachine/EmReactor.java +3 -2
  41. data/lib/em/buftok.rb +35 -63
  42. data/lib/em/callback.rb +43 -11
  43. data/lib/em/channel.rb +22 -15
  44. data/lib/em/completion.rb +303 -0
  45. data/lib/em/connection.rb +341 -208
  46. data/lib/em/deferrable/pool.rb +2 -0
  47. data/lib/em/deferrable.rb +20 -2
  48. data/lib/em/file_watch.rb +37 -18
  49. data/lib/em/iterator.rb +270 -0
  50. data/lib/em/pool.rb +146 -0
  51. data/lib/em/process_watch.rb +5 -4
  52. data/lib/em/processes.rb +8 -4
  53. data/lib/em/protocols/httpclient.rb +27 -11
  54. data/lib/em/protocols/httpclient2.rb +15 -5
  55. data/lib/em/protocols/line_protocol.rb +29 -0
  56. data/lib/em/protocols/memcache.rb +17 -9
  57. data/lib/em/protocols/object_protocol.rb +2 -1
  58. data/lib/em/protocols/postgres3.rb +2 -1
  59. data/lib/em/protocols/smtpclient.rb +19 -11
  60. data/lib/em/protocols/smtpserver.rb +101 -8
  61. data/lib/em/protocols/stomp.rb +9 -7
  62. data/lib/em/protocols/tcptest.rb +3 -2
  63. data/lib/em/protocols.rb +1 -1
  64. data/lib/{pr_eventmachine.rb → em/pure_ruby.rb} +188 -205
  65. data/lib/em/queue.rb +23 -13
  66. data/lib/em/resolver.rb +192 -0
  67. data/lib/em/spawnable.rb +9 -10
  68. data/lib/em/streamer.rb +34 -46
  69. data/lib/em/threaded_resource.rb +90 -0
  70. data/lib/em/tick_loop.rb +85 -0
  71. data/lib/em/timers.rb +8 -3
  72. data/lib/em/version.rb +1 -1
  73. data/lib/eventmachine.rb +582 -686
  74. data/lib/jeventmachine.rb +25 -3
  75. data/tasks/package.rake +98 -0
  76. data/tasks/test.rake +8 -0
  77. data/tests/em_test_helper.rb +64 -0
  78. data/tests/test_attach.rb +56 -56
  79. data/tests/test_basic.rb +111 -168
  80. data/tests/test_channel.rb +5 -6
  81. data/tests/test_completion.rb +177 -0
  82. data/tests/test_connection_count.rb +1 -3
  83. data/tests/test_defer.rb +3 -32
  84. data/tests/test_deferrable.rb +35 -0
  85. data/tests/test_epoll.rb +27 -57
  86. data/tests/test_error_handler.rb +10 -7
  87. data/tests/test_exc.rb +6 -33
  88. data/tests/test_file_watch.rb +51 -35
  89. data/tests/test_futures.rb +10 -38
  90. data/tests/test_get_sock_opt.rb +27 -20
  91. data/tests/test_handler_check.rb +1 -3
  92. data/tests/test_hc.rb +49 -112
  93. data/tests/test_httpclient.rb +34 -62
  94. data/tests/test_httpclient2.rb +14 -39
  95. data/tests/test_inactivity_timeout.rb +44 -40
  96. data/tests/test_kb.rb +26 -52
  97. data/tests/test_ltp.rb +27 -71
  98. data/tests/test_ltp2.rb +1 -30
  99. data/tests/test_next_tick.rb +2 -31
  100. data/tests/test_object_protocol.rb +8 -9
  101. data/tests/test_pause.rb +45 -37
  102. data/tests/test_pending_connect_timeout.rb +42 -38
  103. data/tests/test_pool.rb +128 -0
  104. data/tests/test_process_watch.rb +37 -37
  105. data/tests/test_processes.rb +92 -110
  106. data/tests/test_proxy_connection.rb +137 -61
  107. data/tests/test_pure.rb +30 -67
  108. data/tests/test_queue.rb +10 -4
  109. data/tests/test_resolver.rb +55 -0
  110. data/tests/test_running.rb +1 -29
  111. data/tests/test_sasl.rb +8 -33
  112. data/tests/test_send_file.rb +163 -188
  113. data/tests/test_servers.rb +12 -55
  114. data/tests/test_shutdown_hooks.rb +23 -0
  115. data/tests/test_smtpclient.rb +1 -29
  116. data/tests/test_smtpserver.rb +1 -29
  117. data/tests/test_spawn.rb +2 -31
  118. data/tests/test_ssl_args.rb +9 -10
  119. data/tests/test_ssl_methods.rb +1 -3
  120. data/tests/test_ssl_verify.rb +63 -63
  121. data/tests/test_threaded_resource.rb +53 -0
  122. data/tests/test_tick_loop.rb +59 -0
  123. data/tests/test_timers.rb +52 -91
  124. data/tests/test_ud.rb +1 -29
  125. data/tests/test_unbind_reason.rb +31 -0
  126. metadata +113 -70
  127. data/README +0 -82
  128. data/docs/DEFERRABLES +0 -133
  129. data/docs/LIGHTWEIGHT_CONCURRENCY +0 -70
  130. data/docs/SMTP +0 -2
  131. data/docs/SPAWNED_PROCESSES +0 -89
  132. data/ext/cplusplus.cpp +0 -202
  133. data/ext/emwin.cpp +0 -300
  134. data/ext/emwin.h +0 -94
  135. data/ext/epoll.cpp +0 -26
  136. data/ext/epoll.h +0 -25
  137. data/ext/eventmachine_cpp.h +0 -96
  138. data/ext/files.cpp +0 -94
  139. data/ext/files.h +0 -65
  140. data/ext/sigs.cpp +0 -89
  141. data/ext/sigs.h +0 -32
  142. data/java/src/com/rubyeventmachine/application/Application.java +0 -194
  143. data/java/src/com/rubyeventmachine/application/Connection.java +0 -74
  144. data/java/src/com/rubyeventmachine/application/ConnectionFactory.java +0 -37
  145. data/java/src/com/rubyeventmachine/application/DefaultConnectionFactory.java +0 -46
  146. data/java/src/com/rubyeventmachine/application/PeriodicTimer.java +0 -38
  147. data/java/src/com/rubyeventmachine/application/Timer.java +0 -54
  148. data/java/src/com/rubyeventmachine/tests/ApplicationTest.java +0 -109
  149. data/java/src/com/rubyeventmachine/tests/ConnectTest.java +0 -148
  150. data/java/src/com/rubyeventmachine/tests/EMTest.java +0 -80
  151. data/java/src/com/rubyeventmachine/tests/TestDatagrams.java +0 -53
  152. data/java/src/com/rubyeventmachine/tests/TestServers.java +0 -75
  153. data/java/src/com/rubyeventmachine/tests/TestTimers.java +0 -90
  154. data/lib/evma/callback.rb +0 -32
  155. data/lib/evma/container.rb +0 -75
  156. data/lib/evma/factory.rb +0 -77
  157. data/lib/evma/protocol.rb +0 -87
  158. data/lib/evma/reactor.rb +0 -48
  159. data/lib/evma.rb +0 -32
  160. data/setup.rb +0 -1585
  161. data/tests/test_errors.rb +0 -82
  162. data/tests/testem.rb +0 -31
  163. data/web/whatis +0 -7
  164. /data/{docs/GNU → GNU} +0 -0
  165. /data/{docs/COPYING → LICENSE} +0 -0
  166. /data/docs/{ChangeLog → old/ChangeLog} +0 -0
  167. /data/docs/{EPOLL → old/EPOLL} +0 -0
  168. /data/docs/{INSTALL → old/INSTALL} +0 -0
  169. /data/docs/{LEGAL → old/LEGAL} +0 -0
  170. /data/docs/{PURE_RUBY → old/PURE_RUBY} +0 -0
  171. /data/docs/{RELEASE_NOTES → old/RELEASE_NOTES} +0 -0
  172. /data/docs/{TODO → old/TODO} +0 -0
  173. /data/examples/{ex_queue.rb → old/ex_queue.rb} +0 -0
  174. /data/examples/{helper.rb → old/helper.rb} +0 -0
data/ext/em.h CHANGED
@@ -17,21 +17,11 @@ See the file COPYING for complete licensing information.
17
17
 
18
18
  *****************************************************************************/
19
19
 
20
-
21
-
22
- #ifdef OS_WIN32
23
- #include "emwin.h"
24
- #endif
25
-
26
-
27
- // THIS ENTIRE FILE WILL EVENTUALLY BE FOR UNIX BUILDS ONLY.
28
- //#ifdef OS_UNIX
29
-
30
20
  #ifndef __EventMachine__H_
31
21
  #define __EventMachine__H_
32
22
 
33
- #ifdef BUILD_FOR_RUBY
34
- #include <ruby.h>
23
+ #if defined(BUILD_FOR_RUBY)
24
+ #include <ruby.h>
35
25
  #endif
36
26
 
37
27
  #if defined(BUILD_FOR_RUBY) && !defined(BUILD_FOR_MAGLEV)
@@ -60,16 +50,6 @@ See the file COPYING for complete licensing information.
60
50
  #define EmSelect select
61
51
  #endif
62
52
 
63
-
64
- #ifdef OS_UNIX
65
- typedef long long Int64;
66
- #endif
67
- #ifdef OS_WIN32
68
- typedef __int64 Int64;
69
- #endif
70
-
71
- extern Int64 gCurrentLoopTime;
72
-
73
53
  class EventableDescriptor;
74
54
  class InotifyDescriptor;
75
55
 
@@ -85,7 +65,7 @@ class EventMachine_t
85
65
  static void SetMaxTimerCount (int);
86
66
 
87
67
  public:
88
- EventMachine_t (void(*event_callback)(const unsigned long, int, const char*, const unsigned long));
68
+ EventMachine_t (EMCallback);
89
69
  virtual ~EventMachine_t();
90
70
 
91
71
  void Run();
@@ -98,13 +78,13 @@ class EventMachine_t
98
78
  const unsigned long CreateTcpServer (const char *, int);
99
79
  const unsigned long OpenDatagramSocket (const char *, int);
100
80
  const unsigned long CreateUnixDomainServer (const char*);
101
- const unsigned long _OpenFileForWriting (const char*);
102
81
  const unsigned long OpenKeyboard();
103
82
  //const char *Popen (const char*, const char*);
104
83
  const unsigned long Socketpair (char* const*);
105
84
 
106
85
  void Add (EventableDescriptor*);
107
86
  void Modify (EventableDescriptor*);
87
+ void Closing (EventableDescriptor*);
108
88
 
109
89
  const unsigned long AttachFD (int, bool);
110
90
  int DetachFD (EventableDescriptor*);
@@ -140,6 +120,8 @@ class EventMachine_t
140
120
  void _HandleKqueuePidEvent (struct kevent*);
141
121
  #endif
142
122
 
123
+ uint64_t GetCurrentLoopTime() { return MyCurrentLoopTime; }
124
+
143
125
  // Temporary:
144
126
  void _UseEpoll();
145
127
  void _UseKqueue();
@@ -147,19 +129,28 @@ class EventMachine_t
147
129
  bool UsingKqueue() { return bKqueue; }
148
130
  bool UsingEpoll() { return bEpoll; }
149
131
 
132
+ void QueueHeartbeat(EventableDescriptor*);
133
+ void ClearHeartbeat(uint64_t, EventableDescriptor*);
134
+
135
+ uint64_t GetRealTime();
136
+
150
137
  private:
151
138
  bool _RunOnce();
152
- bool _RunTimers();
139
+ void _RunTimers();
153
140
  void _UpdateTime();
154
141
  void _AddNewDescriptors();
155
142
  void _ModifyDescriptors();
156
143
  void _InitializeLoopBreaker();
144
+ void _CleanupSockets();
157
145
 
158
146
  bool _RunSelectOnce();
159
147
  bool _RunEpollOnce();
160
148
  bool _RunKqueueOnce();
161
149
 
162
150
  void _ModifyEpollEvent (EventableDescriptor*);
151
+ void _DispatchHeartbeats();
152
+ timeval _TimeTilNextEvent();
153
+ void _CleanBadDescriptors();
163
154
 
164
155
  public:
165
156
  void _ReadLoopBreaker();
@@ -171,19 +162,20 @@ class EventMachine_t
171
162
  MaxEvents = 4096
172
163
  };
173
164
  int HeartbeatInterval;
174
- void (*EventCallback)(const unsigned long, int, const char*, const unsigned long);
165
+ EMCallback EventCallback;
175
166
 
176
167
  class Timer_t: public Bindable_t {
177
168
  };
178
169
 
179
- multimap<Int64, Timer_t> Timers;
170
+ multimap<uint64_t, Timer_t> Timers;
171
+ multimap<uint64_t, EventableDescriptor*> Heartbeats;
180
172
  map<int, Bindable_t*> Files;
181
173
  map<int, Bindable_t*> Pids;
182
174
  vector<EventableDescriptor*> Descriptors;
183
175
  vector<EventableDescriptor*> NewDescriptors;
184
176
  set<EventableDescriptor*> ModifiedDescriptors;
185
177
 
186
- Int64 NextHeartbeatTime;
178
+ uint64_t NextHeartbeatTime;
187
179
 
188
180
  int LoopBreakerReader;
189
181
  int LoopBreakerWriter;
@@ -193,7 +185,16 @@ class EventMachine_t
193
185
 
194
186
  timeval Quantum;
195
187
 
188
+ uint64_t MyCurrentLoopTime;
189
+
190
+ #ifdef OS_WIN32
191
+ unsigned TickCountTickover;
192
+ unsigned LastTickCount;
193
+ #endif
194
+
196
195
  private:
196
+ bool bTerminateSignalReceived;
197
+
197
198
  bool bEpoll;
198
199
  int epfd; // Epoll file-descriptor
199
200
  #ifdef HAVE_EPOLL
@@ -228,8 +229,4 @@ struct SelectData_t
228
229
  int nSockets;
229
230
  };
230
231
 
231
-
232
-
233
232
  #endif // __EventMachine__H_
234
-
235
- //#endif // OS_UNIX
data/ext/eventmachine.h CHANGED
@@ -35,11 +35,12 @@ extern "C" {
35
35
  EM_CONNECTION_NOTIFY_WRITABLE = 107,
36
36
  EM_SSL_HANDSHAKE_COMPLETED = 108,
37
37
  EM_SSL_VERIFY = 109,
38
- EM_PROXY_TARGET_UNBOUND = 110
38
+ EM_PROXY_TARGET_UNBOUND = 110,
39
+ EM_PROXY_COMPLETED = 111
39
40
 
40
41
  };
41
42
 
42
- void evma_initialize_library (void(*)(const unsigned long, int, const char*, const unsigned long));
43
+ void evma_initialize_library (EMCallback);
43
44
  void evma_run_machine();
44
45
  void evma_release_library();
45
46
  const unsigned long evma_install_oneshot_timer (int seconds);
@@ -71,8 +72,8 @@ extern "C" {
71
72
  void evma_accept_ssl_peer (const unsigned long binding);
72
73
  #endif
73
74
 
74
- int evma_get_peername (const unsigned long binding, struct sockaddr*);
75
- int evma_get_sockname (const unsigned long binding, struct sockaddr*);
75
+ int evma_get_peername (const unsigned long binding, struct sockaddr*, socklen_t*);
76
+ int evma_get_sockname (const unsigned long binding, struct sockaddr*, socklen_t*);
76
77
  int evma_get_subprocess_pid (const unsigned long binding, pid_t*);
77
78
  int evma_get_subprocess_status (const unsigned long binding, int*);
78
79
  int evma_get_connection_count();
@@ -96,7 +97,6 @@ extern "C" {
96
97
  float evma_get_heartbeat_interval();
97
98
  int evma_set_heartbeat_interval(float);
98
99
 
99
- const unsigned long evma__write_file (const char *filename);
100
100
  const unsigned long evma_popen (char * const*cmd_strings);
101
101
 
102
102
  const unsigned long evma_watch_filename (const char *fname);
@@ -105,7 +105,7 @@ extern "C" {
105
105
  const unsigned long evma_watch_pid (int);
106
106
  void evma_unwatch_pid (const unsigned long);
107
107
 
108
- void evma_start_proxy(const unsigned long, const unsigned long, const unsigned long);
108
+ void evma_start_proxy(const unsigned long, const unsigned long, const unsigned long, const unsigned long);
109
109
  void evma_stop_proxy(const unsigned long);
110
110
 
111
111
  int evma_set_rlimit_nofile (int n_files);
@@ -113,6 +113,7 @@ extern "C" {
113
113
  void evma_set_epoll (int use);
114
114
  void evma_set_kqueue (int use);
115
115
 
116
+ uint64_t evma_get_current_loop_time();
116
117
  #if __cplusplus
117
118
  }
118
119
  #endif
data/ext/extconf.rb CHANGED
@@ -1,3 +1,4 @@
1
+ require 'fileutils'
1
2
  require 'mkmf'
2
3
 
3
4
  def check_libs libs = [], fatal = false
@@ -12,12 +13,63 @@ def add_define(name)
12
13
  $defs.push("-D#{name}")
13
14
  end
14
15
 
16
+ ##
17
+ # OpenSSL:
18
+
19
+ # override append_library, so it actually appends (instead of prepending)
20
+ # this fixes issues with linking ssl, since libcrypto depends on symbols in libssl
21
+ def append_library(libs, lib)
22
+ libs + " " + format(LIBARG, lib)
23
+ end
24
+
25
+ def manual_ssl_config
26
+ ssl_libs_heads_args = {
27
+ :unix => [%w[ssl crypto], %w[openssl/ssl.h openssl/err.h]],
28
+ :mswin => [%w[ssleay32 libeay32], %w[openssl/ssl.h openssl/err.h]],
29
+ }
30
+
31
+ dc_flags = ['ssl']
32
+ dc_flags += ["#{ENV['OPENSSL']}/include", ENV['OPENSSL']] if /linux/ =~ RUBY_PLATFORM and ENV['OPENSSL']
33
+
34
+ libs, heads = case RUBY_PLATFORM
35
+ when /mswin/ ; ssl_libs_heads_args[:mswin]
36
+ else ssl_libs_heads_args[:unix]
37
+ end
38
+ dir_config(*dc_flags)
39
+ check_libs(libs) and check_heads(heads)
40
+ end
41
+
42
+ if ENV['CROSS_COMPILING']
43
+ openssl_dir = File.expand_path("~/.rake-compiler/builds/openssl-1.0.0a/")
44
+ if File.exists?(openssl_dir)
45
+ FileUtils.mkdir_p Dir.pwd+"/openssl/"
46
+ FileUtils.cp Dir[openssl_dir+"/include/openssl/*.h"], Dir.pwd+"/openssl/", :verbose => true
47
+ FileUtils.cp Dir[openssl_dir+"/lib*.a"], Dir.pwd, :verbose => true
48
+ $INCFLAGS << " -I#{Dir.pwd}" # for the openssl headers
49
+ else
50
+ STDERR.puts
51
+ STDERR.puts "**************************************************************************************"
52
+ STDERR.puts "**** Cross-compiled OpenSSL not found"
53
+ STDERR.puts "**** Run: hg clone http://bitbucket.org/ged/ruby-pg && cd ruby-pg && rake openssl_libs"
54
+ STDERR.puts "**************************************************************************************"
55
+ STDERR.puts
56
+ end
57
+ end
58
+
59
+ # Try to use pkg_config first, fixes #73
60
+ if pkg_config('openssl') || manual_ssl_config
61
+ add_define "WITH_SSL"
62
+ else
63
+ add_define "WITHOUT_SSL"
64
+ end
65
+
15
66
  add_define 'BUILD_FOR_RUBY'
16
67
  add_define 'HAVE_RBTRAP' if have_var('rb_trap_immediate', ['ruby.h', 'rubysig.h'])
17
68
  add_define "HAVE_TBR" if have_func('rb_thread_blocking_region')# and have_macro('RUBY_UBF_IO', 'ruby.h')
18
69
  add_define "HAVE_INOTIFY" if inotify = have_func('inotify_init', 'sys/inotify.h')
19
70
  add_define "HAVE_OLD_INOTIFY" if !inotify && have_macro('__NR_inotify_init', 'sys/syscall.h')
20
71
  add_define 'HAVE_WRITEV' if have_func('writev', 'sys/uio.h')
72
+
21
73
  have_func('rb_thread_check_ints')
22
74
  have_func('rb_time_new')
23
75
 
@@ -57,11 +109,13 @@ when /solaris/
57
109
  add_define 'OS_SOLARIS8'
58
110
  check_libs(%w[nsl socket], true)
59
111
 
60
- # Patch by Tim Pease, fixes SUNWspro compile problems.
61
- if CONFIG['CC'] == 'cc'
112
+ if CONFIG['CC'] == 'cc' and `cc -flags 2>&1` =~ /Sun/ # detect SUNWspro compiler
62
113
  # SUN CHAIN
63
- $CFLAGS = CONFIG['CFLAGS'] = "-KPIC -G"
114
+ add_define 'CC_SUNWspro'
115
+ $preload = ["\nCXX = CC"] # hack a CXX= line into the makefile
116
+ $CFLAGS = CONFIG['CFLAGS'] = "-KPIC"
64
117
  CONFIG['CCDLFLAGS'] = "-KPIC"
118
+ CONFIG['LDSHARED'] = "$(CXX) -G -KPIC -lCstd"
65
119
  else
66
120
  # GNU CHAIN
67
121
  # on Unix we need a g++ link, not gcc.
@@ -83,19 +137,6 @@ when /darwin/
83
137
  when /linux/
84
138
  add_define 'HAVE_EPOLL' if have_func('epoll_create', 'sys/epoll.h')
85
139
 
86
- # Original epoll test is inadequate because 2.4 kernels have the header
87
- # but not the code.
88
- # add_define 'HAVE_EPOLL' if have_header('sys/epoll.h')
89
- # if have_header('sys/epoll.h')
90
- # File.open("hasEpollTest.c", "w") {|f|
91
- # f.puts "#include <sys/epoll.h>"
92
- # f.puts "int main() { epoll_create(1024); return 0;}"
93
- # }
94
- # (e = system( "gcc hasEpollTest.c -o hasEpollTest " )) and (e = $?.to_i)
95
- # `rm -f hasEpollTest.c hasEpollTest`
96
- # add_define 'HAVE_EPOLL' if e == 0
97
- # end
98
-
99
140
  # on Unix we need a g++ link, not gcc.
100
141
  CONFIG['LDSHARED'] = "$(CXX) -shared"
101
142
 
@@ -107,38 +148,6 @@ else
107
148
  CONFIG['LDSHARED'] = "$(CXX) -shared"
108
149
  end
109
150
 
110
- # OpenSSL:
111
-
112
- def manual_ssl_config
113
- ssl_libs_heads_args = {
114
- :unix => [%w[ssl crypto], %w[openssl/ssl.h openssl/err.h]],
115
- :darwin => [%w[ssl crypto C], %w[openssl/ssl.h openssl/err.h]],
116
- # openbsd and linux:
117
- :crypto_hack => [%w[crypto ssl crypto], %w[openssl/ssl.h openssl/err.h]],
118
- :mswin => [%w[ssleay32 libeay32], %w[openssl/ssl.h openssl/err.h]],
119
- }
120
-
121
- dc_flags = ['ssl']
122
- dc_flags += ["#{ENV['OPENSSL']}/include", ENV['OPENSSL']] if /linux/ =~ RUBY_PLATFORM
123
-
124
- libs, heads = case RUBY_PLATFORM
125
- when /mswin/ ; ssl_libs_heads_args[:mswin]
126
- when /mingw/ ; ssl_libs_heads_args[:unix]
127
- when /darwin/ ; ssl_libs_heads_args[:darwin]
128
- when /openbsd/ ; ssl_libs_heads_args[:crypto_hack]
129
- when /linux/ ; ssl_libs_heads_args[:crypto_hack]
130
- else ssl_libs_heads_args[:unix]
131
- end
132
- dir_config(*dc_flags)
133
- check_libs(libs) and check_heads(heads)
134
- end
135
-
136
- # Try to use pkg_config first, fixes #73
137
- if pkg_config('openssl') || manual_ssl_config
138
- add_define "WITH_SSL"
139
- else
140
- add_define "WITHOUT_SSL"
141
- end
142
151
 
143
152
  # solaris c++ compiler doesn't have make_pair()
144
153
  TRY_LINK.sub!('$(CC)', '$(CXX)')
@@ -44,11 +44,13 @@ when /solaris/
44
44
  add_define 'OS_SOLARIS8'
45
45
  check_libs(%w[nsl socket], true)
46
46
 
47
- # Patch by Tim Pease, fixes SUNWspro compile problems.
48
- if CONFIG['CC'] == 'cc'
47
+ if CONFIG['CC'] == 'cc' and `cc -flags 2>&1` =~ /Sun/ # detect SUNWspro compiler
49
48
  # SUN CHAIN
50
- $CFLAGS = CONFIG['CFLAGS'] = "-KPIC -G"
49
+ add_define 'CC_SUNWspro'
50
+ $preload = ["\nCXX = CC"] # hack a CXX= line into the makefile
51
+ $CFLAGS = CONFIG['CFLAGS'] = "-KPIC"
51
52
  CONFIG['CCDLFLAGS'] = "-KPIC"
53
+ CONFIG['LDSHARED'] = "$(CXX) -G -KPIC -lCstd"
52
54
  else
53
55
  # GNU CHAIN
54
56
  # on Unix we need a g++ link, not gcc.
@@ -88,7 +88,7 @@ void Mapper_t::Close()
88
88
  // Can be called multiple times.
89
89
  // Calls to GetChunk are invalid after a call to Close.
90
90
  if (MapPoint) {
91
- #ifdef OS_SOLARIS8
91
+ #ifdef CC_SUNWspro
92
92
  munmap ((char*)MapPoint, FileSize);
93
93
  #else
94
94
  munmap ((void*)MapPoint, FileSize);
@@ -118,7 +118,6 @@ extern "C" void Init_fastfilereaderext()
118
118
  Mapper = rb_define_class_under (FastFileReader, "Mapper", rb_cObject);
119
119
 
120
120
  rb_define_singleton_method (Mapper, "new", (VALUE(*)(...))mapper_new, 1);
121
- rb_define_method (Mapper, "new", (VALUE(*)(...))mapper_new, 1);
122
121
  rb_define_method (Mapper, "size", (VALUE(*)(...))mapper_size, 0);
123
122
  rb_define_method (Mapper, "close", (VALUE(*)(...))mapper_close, 0);
124
123
  rb_define_method (Mapper, "get_chunk", (VALUE(*)(...))mapper_get_chunk, 2);
data/ext/kb.cpp CHANGED
@@ -26,9 +26,7 @@ KeyboardDescriptor::KeyboardDescriptor
26
26
 
27
27
  KeyboardDescriptor::KeyboardDescriptor (EventMachine_t *parent_em):
28
28
  EventableDescriptor (0, parent_em),
29
- bReadAttemptedAfterClose (false),
30
- LastIo (gCurrentLoopTime),
31
- InactivityTimeout (0)
29
+ bReadAttemptedAfterClose (false)
32
30
  {
33
31
  #ifdef HAVE_EPOLL
34
32
  EpollEvent.events = EPOLLIN;
data/ext/pipe.cpp CHANGED
@@ -30,8 +30,6 @@ PipeDescriptor::PipeDescriptor
30
30
  PipeDescriptor::PipeDescriptor (int fd, pid_t subpid, EventMachine_t *parent_em):
31
31
  EventableDescriptor (fd, parent_em),
32
32
  bReadAttemptedAfterClose (false),
33
- LastIo (gCurrentLoopTime),
34
- InactivityTimeout (0),
35
33
  OutboundDataSize (0),
36
34
  SubprocessPid (subpid)
37
35
  {
@@ -104,22 +102,22 @@ PipeDescriptor::~PipeDescriptor()
104
102
  struct timespec req = {0, 50000000}; // 0.05s
105
103
  int n;
106
104
 
107
- // wait 0.25s for the process to die
108
- for (n=0; n<5; n++) {
105
+ // wait 0.5s for the process to die
106
+ for (n=0; n<10; n++) {
109
107
  if (waitpid (SubprocessPid, &(MyEventMachine->SubprocessExitStatus), WNOHANG) != 0) return;
110
108
  nanosleep (&req, NULL);
111
109
  }
112
110
 
113
- // send SIGTERM and wait another 0.5s
111
+ // send SIGTERM and wait another 1s
114
112
  kill (SubprocessPid, SIGTERM);
115
- for (n=0; n<10; n++) {
113
+ for (n=0; n<20; n++) {
116
114
  nanosleep (&req, NULL);
117
115
  if (waitpid (SubprocessPid, &(MyEventMachine->SubprocessExitStatus), WNOHANG) != 0) return;
118
116
  }
119
117
 
120
- // send SIGKILL and wait another 1s
118
+ // send SIGKILL and wait another 5s
121
119
  kill (SubprocessPid, SIGKILL);
122
- for (n=0; n<20; n++) {
120
+ for (n=0; n<100; n++) {
123
121
  nanosleep (&req, NULL);
124
122
  if (waitpid (SubprocessPid, &(MyEventMachine->SubprocessExitStatus), WNOHANG) != 0) return;
125
123
  }
@@ -143,7 +141,7 @@ void PipeDescriptor::Read()
143
141
  return;
144
142
  }
145
143
 
146
- LastIo = gCurrentLoopTime;
144
+ LastActivity = MyEventMachine->GetCurrentLoopTime();
147
145
 
148
146
  int total_bytes_read = 0;
149
147
  char readbuffer [16 * 1024];
@@ -203,7 +201,7 @@ void PipeDescriptor::Write()
203
201
  int sd = GetSocket();
204
202
  assert (sd != INVALID_SOCKET);
205
203
 
206
- LastIo = gCurrentLoopTime;
204
+ LastActivity = MyEventMachine->GetCurrentLoopTime();
207
205
  char output_buffer [16 * 1024];
208
206
  size_t nbytes = 0;
209
207
 
@@ -268,7 +266,7 @@ PipeDescriptor::Heartbeat
268
266
  void PipeDescriptor::Heartbeat()
269
267
  {
270
268
  // If an inactivity timeout is defined, then check for it.
271
- if (InactivityTimeout && ((gCurrentLoopTime - LastIo) >= InactivityTimeout))
269
+ if (InactivityTimeout && ((MyEventMachine->GetCurrentLoopTime() - LastActivity) >= InactivityTimeout))
272
270
  ScheduleClose (false);
273
271
  //bCloseNow = true;
274
272
  }
data/ext/project.h CHANGED
@@ -55,8 +55,8 @@ See the file COPYING for complete licensing information.
55
55
  #include <netinet/tcp.h>
56
56
  #include <arpa/inet.h>
57
57
  #include <pwd.h>
58
+ #include <string.h>
58
59
  typedef int SOCKET;
59
- #define closesocket close
60
60
  #define INVALID_SOCKET -1
61
61
  #define SOCKET_ERROR -1
62
62
  #ifdef OS_SOLARIS8
@@ -96,6 +96,9 @@ typedef int socklen_t;
96
96
  typedef int pid_t;
97
97
  #endif
98
98
 
99
+ #if !defined(_MSC_VER) || _MSC_VER > 1400
100
+ #include <stdint.h>
101
+ #endif
99
102
 
100
103
  using namespace std;
101
104
 
@@ -134,18 +137,19 @@ static inline int inotify_rm_watch (int fd, __u32 wd) { return syscall (__NR_ino
134
137
  #include <sys/uio.h>
135
138
  #endif
136
139
 
140
+ #if __cplusplus
141
+ extern "C" {
142
+ #endif
143
+ typedef void (*EMCallback)(const unsigned long, int, const char*, const unsigned long);
144
+ #if __cplusplus
145
+ }
146
+ #endif
147
+
137
148
  #include "binder.h"
138
149
  #include "em.h"
139
- #include "epoll.h"
140
- #include "sigs.h"
141
150
  #include "ed.h"
142
- #include "files.h"
143
151
  #include "page.h"
144
152
  #include "ssl.h"
145
153
  #include "eventmachine.h"
146
- #include "eventmachine_cpp.h"
147
-
148
-
149
-
150
154
 
151
155
  #endif // __Project__H_