eventmachine 0.10.0 → 0.12.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (89) hide show
  1. data/DEFERRABLES +1 -1
  2. data/LIGHTWEIGHT_CONCURRENCY +1 -1
  3. data/PURE_RUBY +1 -1
  4. data/README +1 -1
  5. data/RELEASE_NOTES +1 -1
  6. data/SMTP +1 -1
  7. data/SPAWNED_PROCESSES +1 -1
  8. data/TODO +1 -1
  9. data/ext/binder.cpp +1 -1
  10. data/ext/binder.h +1 -1
  11. data/ext/cmain.cpp +29 -1
  12. data/ext/cplusplus.cpp +1 -1
  13. data/ext/ed.cpp +79 -1
  14. data/ext/ed.h +6 -1
  15. data/ext/em.cpp +343 -27
  16. data/ext/em.h +25 -1
  17. data/ext/emwin.cpp +1 -1
  18. data/ext/emwin.h +1 -1
  19. data/ext/epoll.cpp +1 -1
  20. data/ext/epoll.h +1 -1
  21. data/ext/eventmachine.h +3 -1
  22. data/ext/eventmachine_cpp.h +1 -1
  23. data/ext/extconf.rb +31 -1
  24. data/ext/files.cpp +1 -1
  25. data/ext/files.h +1 -1
  26. data/ext/kb.cpp +4 -1
  27. data/ext/page.cpp +1 -1
  28. data/ext/page.h +1 -1
  29. data/ext/pipe.cpp +4 -1
  30. data/ext/project.h +8 -2
  31. data/ext/rubymain.cpp +73 -2
  32. data/ext/sigs.cpp +1 -1
  33. data/ext/sigs.h +1 -1
  34. data/ext/ssl.cpp +4 -1
  35. data/ext/ssl.h +1 -1
  36. data/lib/em/deferrable.rb +1 -1
  37. data/lib/em/eventable.rb +1 -1
  38. data/lib/em/future.rb +1 -1
  39. data/lib/em/messages.rb +1 -1
  40. data/lib/em/processes.rb +68 -0
  41. data/lib/em/spawnable.rb +1 -1
  42. data/lib/em/streamer.rb +1 -1
  43. data/lib/eventmachine.rb +113 -66
  44. data/lib/eventmachine_version.rb +2 -2
  45. data/lib/evma.rb +1 -1
  46. data/lib/evma/callback.rb +1 -1
  47. data/lib/evma/container.rb +1 -1
  48. data/lib/evma/factory.rb +1 -1
  49. data/lib/evma/protocol.rb +1 -1
  50. data/lib/evma/reactor.rb +1 -1
  51. data/lib/jeventmachine.rb +1 -1
  52. data/lib/pr_eventmachine.rb +35 -8
  53. data/lib/protocols/header_and_content.rb +1 -1
  54. data/lib/protocols/httpcli2.rb +1 -1
  55. data/lib/protocols/httpclient.rb +1 -1
  56. data/lib/protocols/line_and_text.rb +1 -1
  57. data/lib/protocols/linetext2.rb +1 -1
  58. data/lib/protocols/saslauth.rb +59 -1
  59. data/lib/protocols/smtpclient.rb +4 -3
  60. data/lib/protocols/smtpserver.rb +3 -3
  61. data/lib/protocols/stomp.rb +1 -1
  62. data/lib/protocols/tcptest.rb +1 -1
  63. data/tests/test_basic.rb +2 -1
  64. data/tests/test_defer.rb +63 -0
  65. data/tests/test_epoll.rb +10 -5
  66. data/tests/test_errors.rb +13 -3
  67. data/tests/test_eventables.rb +1 -1
  68. data/tests/test_exc.rb +2 -1
  69. data/tests/test_futures.rb +2 -1
  70. data/tests/test_hc.rb +26 -2
  71. data/tests/test_httpclient.rb +2 -1
  72. data/tests/test_httpclient2.rb +2 -1
  73. data/tests/test_kb.rb +2 -1
  74. data/tests/test_ltp.rb +3 -1
  75. data/tests/test_ltp2.rb +2 -1
  76. data/tests/test_next_tick.rb +2 -1
  77. data/tests/test_processes.rb +56 -0
  78. data/tests/test_pure.rb +2 -1
  79. data/tests/test_running.rb +2 -1
  80. data/tests/test_sasl.rb +73 -0
  81. data/tests/test_send_file.rb +3 -1
  82. data/tests/test_servers.rb +4 -1
  83. data/tests/test_smtpclient.rb +2 -1
  84. data/tests/test_smtpserver.rb +3 -2
  85. data/tests/test_spawn.rb +2 -1
  86. data/tests/test_timers.rb +2 -2
  87. data/tests/test_ud.rb +2 -1
  88. data/tests/testem.rb +1 -1
  89. metadata +115 -104
data/ext/ssl.cpp CHANGED
@@ -1,6 +1,6 @@
1
1
  /*****************************************************************************
2
2
 
3
- $Id: ssl.cpp 574 2007-11-19 23:36:04Z blackhedd $
3
+ $Id: ssl.cpp 673 2008-01-05 04:33:01Z blackhedd $
4
4
 
5
5
  File: ssl.cpp
6
6
  Date: 30Apr06
@@ -370,6 +370,9 @@ int SslBox_t::PutPlaintext (const char *buf, int bufsize)
370
370
 
371
371
  OutboundQ.Push (buf, bufsize);
372
372
 
373
+ if (!SSL_is_init_finished (pSSL))
374
+ return 0;
375
+
373
376
  bool fatal = false;
374
377
  bool did_work = false;
375
378
 
data/ext/ssl.h CHANGED
@@ -1,6 +1,6 @@
1
1
  /*****************************************************************************
2
2
 
3
- $Id: ssl.h 498 2007-08-15 14:03:32Z blackhedd $
3
+ $Id: ssl.h 668 2008-01-04 23:00:34Z blackhedd $
4
4
 
5
5
  File: ssl.h
6
6
  Date: 30Apr06
data/lib/em/deferrable.rb CHANGED
@@ -1,4 +1,4 @@
1
- # $Id: deferrable.rb 534 2007-09-15 23:06:15Z blackhedd $
1
+ # $Id: deferrable.rb 668 2008-01-04 23:00:34Z blackhedd $
2
2
  #
3
3
  # Author:: Francis Cianfrocca (gmail: blackhedd)
4
4
  # Homepage:: http://rubyeventmachine.com
data/lib/em/eventable.rb CHANGED
@@ -1,4 +1,4 @@
1
- # $Id: eventable.rb 320 2007-05-22 22:12:59Z blackhedd $
1
+ # $Id: eventable.rb 668 2008-01-04 23:00:34Z blackhedd $
2
2
  #
3
3
  # Author:: Francis Cianfrocca (gmail: blackhedd)
4
4
  # Homepage:: http://rubyeventmachine.com
data/lib/em/future.rb CHANGED
@@ -1,4 +1,4 @@
1
- # $Id: future.rb 320 2007-05-22 22:12:59Z blackhedd $
1
+ # $Id: future.rb 668 2008-01-04 23:00:34Z blackhedd $
2
2
  #
3
3
  # Author:: Francis Cianfrocca (gmail: blackhedd)
4
4
  # Homepage:: http://rubyeventmachine.com
data/lib/em/messages.rb CHANGED
@@ -1,4 +1,4 @@
1
- # $Id: messages.rb 349 2007-06-04 17:10:17Z blackhedd $
1
+ # $Id: messages.rb 668 2008-01-04 23:00:34Z blackhedd $
2
2
  #
3
3
  # Author:: Francis Cianfrocca (gmail: blackhedd)
4
4
  # Homepage:: http://rubyeventmachine.com
@@ -0,0 +1,68 @@
1
+ # $Id: processes.rb 668 2008-01-04 23:00:34Z blackhedd $
2
+ #
3
+ # Author:: Francis Cianfrocca (gmail: blackhedd)
4
+ # Homepage:: http://rubyeventmachine.com
5
+ # Date:: 13 Dec 07
6
+ #
7
+ # See EventMachine and EventMachine::Connection for documentation and
8
+ # usage examples.
9
+ #
10
+ #----------------------------------------------------------------------------
11
+ #
12
+ # Copyright (C) 2006-08 by Francis Cianfrocca. All Rights Reserved.
13
+ # Gmail: blackhedd
14
+ #
15
+ # This program is free software; you can redistribute it and/or modify
16
+ # it under the terms of either: 1) the GNU General Public License
17
+ # as published by the Free Software Foundation; either version 2 of the
18
+ # License, or (at your option) any later version; or 2) Ruby's License.
19
+ #
20
+ # See the file COPYING for complete licensing information.
21
+ #
22
+ #---------------------------------------------------------------------------
23
+ #
24
+ #
25
+
26
+
27
+ module EventMachine
28
+
29
+ # EM::DeferrableChildProcess is a sugaring of a common use-case
30
+ # involving EM::popen.
31
+ # Call the #open method on EM::DeferrableChildProcess, passing
32
+ # a command-string. #open immediately returns an EM::Deferrable
33
+ # object. It also schedules the forking of a child process, which
34
+ # will execute the command passed to #open.
35
+ # When the forked child terminates, the Deferrable will be signalled
36
+ # and execute its callbacks, passing the data that the child process
37
+ # wrote to stdout.
38
+ #
39
+ class DeferrableChildProcess < EventMachine::Connection
40
+ include EventMachine::Deferrable
41
+
42
+ # Sugars a common use-case involving forked child processes.
43
+ # #open takes a String argument containing an shell command
44
+ # string (including arguments if desired). #open immediately
45
+ # returns an EventMachine::Deferrable object, without blocking.
46
+ #
47
+ # It also invokes EventMachine#popen to run the passed-in
48
+ # command in a forked child process.
49
+ #
50
+ # When the forked child terminates, the Deferrable that
51
+ # #open calls its callbacks, passing the data returned
52
+ # from the child process.
53
+ #
54
+ def self.open cmd
55
+ EventMachine.popen( cmd, DeferrableChildProcess )
56
+ end
57
+
58
+ def receive_data data
59
+ (@data ||= []) << data
60
+ end
61
+
62
+ def unbind
63
+ succeed( @data.join )
64
+ end
65
+ end
66
+ end
67
+
68
+
data/lib/em/spawnable.rb CHANGED
@@ -1,4 +1,4 @@
1
- # $Id: spawnable.rb 530 2007-09-13 01:11:38Z blackhedd $
1
+ # $Id: spawnable.rb 668 2008-01-04 23:00:34Z blackhedd $
2
2
  #
3
3
  # Author:: Francis Cianfrocca (gmail: blackhedd)
4
4
  # Homepage:: http://rubyeventmachine.com
data/lib/em/streamer.rb CHANGED
@@ -1,4 +1,4 @@
1
- # $Id: streamer.rb 599 2007-12-05 14:24:11Z blackhedd $
1
+ # $Id: streamer.rb 668 2008-01-04 23:00:34Z blackhedd $
2
2
  #
3
3
  # Author:: Francis Cianfrocca (gmail: blackhedd)
4
4
  # Homepage:: http://rubyeventmachine.com
data/lib/eventmachine.rb CHANGED
@@ -1,4 +1,4 @@
1
- # $Id: eventmachine.rb 594 2007-12-05 11:41:39Z blackhedd $
1
+ # $Id: eventmachine.rb 688 2008-05-15 23:44:39Z francis $
2
2
  #
3
3
  # Author:: Francis Cianfrocca (gmail: blackhedd)
4
4
  # Homepage:: http://rubyeventmachine.com
@@ -173,60 +173,60 @@ require 'shellwords'
173
173
  module EventMachine
174
174
 
175
175
 
176
- # EventMachine::run initializes and runs an event loop.
177
- # This method only returns if user-callback code calls stop_event_loop.
178
- # Use the supplied block to define your clients and servers.
179
- # The block is called by EventMachine::run immediately after initializing
180
- # its internal event loop but <i>before</i> running the loop.
181
- # Therefore this block is the right place to call start_server if you
182
- # want to accept connections from remote clients.
183
- #
184
- # For programs that are structured as servers, it's usually appropriate
185
- # to start an event loop by calling EventMachine::run, and let it
186
- # run forever. It's also possible to use EventMachine::run to make a single
187
- # client-connection to a remote server, process the data flow from that
188
- # single connection, and then call stop_event_loop to force EventMachine::run
189
- # to return. Your program will then continue from the point immediately
190
- # following the call to EventMachine::run.
191
- #
192
- # You can of course do both client and servers simultaneously in the same program.
193
- # One of the strengths of the event-driven programming model is that the
194
- # handling of network events on many different connections will be interleaved,
195
- # and scheduled according to the actual events themselves. This maximizes
196
- # efficiency.
197
- #
198
- # === Server usage example
199
- #
200
- # See the text at the top of this file for an example of an echo server.
201
- #
202
- # === Client usage example
203
- #
204
- # See the description of stop_event_loop for an extremely simple client example.
205
- #
206
- #--
207
- # Obsoleted the use_threads mechanism.
208
- # 25Nov06: Added the begin/ensure block. We need to be sure that release_machine
209
- # gets called even if an exception gets thrown within any of the user code
210
- # that the event loop runs. The best way to see this is to run a unit
211
- # test with two functions, each of which calls EventMachine#run and each of
212
- # which throws something inside of #run. Without the ensure, the second test
213
- # will start without release_machine being called and will immediately throw
214
- # a C++ runtime error.
215
- #
216
- def EventMachine::run &block
217
- @conns = {}
218
- @acceptors = {}
219
- @timers = {}
220
- begin
221
- @reactor_running = true
222
- initialize_event_machine
223
- block and add_timer 0, block
224
- run_machine
225
- ensure
226
- release_machine
227
- @reactor_running = false
176
+ # EventMachine::run initializes and runs an event loop.
177
+ # This method only returns if user-callback code calls stop_event_loop.
178
+ # Use the supplied block to define your clients and servers.
179
+ # The block is called by EventMachine::run immediately after initializing
180
+ # its internal event loop but <i>before</i> running the loop.
181
+ # Therefore this block is the right place to call start_server if you
182
+ # want to accept connections from remote clients.
183
+ #
184
+ # For programs that are structured as servers, it's usually appropriate
185
+ # to start an event loop by calling EventMachine::run, and let it
186
+ # run forever. It's also possible to use EventMachine::run to make a single
187
+ # client-connection to a remote server, process the data flow from that
188
+ # single connection, and then call stop_event_loop to force EventMachine::run
189
+ # to return. Your program will then continue from the point immediately
190
+ # following the call to EventMachine::run.
191
+ #
192
+ # You can of course do both client and servers simultaneously in the same program.
193
+ # One of the strengths of the event-driven programming model is that the
194
+ # handling of network events on many different connections will be interleaved,
195
+ # and scheduled according to the actual events themselves. This maximizes
196
+ # efficiency.
197
+ #
198
+ # === Server usage example
199
+ #
200
+ # See the text at the top of this file for an example of an echo server.
201
+ #
202
+ # === Client usage example
203
+ #
204
+ # See the description of stop_event_loop for an extremely simple client example.
205
+ #
206
+ #--
207
+ # Obsoleted the use_threads mechanism.
208
+ # 25Nov06: Added the begin/ensure block. We need to be sure that release_machine
209
+ # gets called even if an exception gets thrown within any of the user code
210
+ # that the event loop runs. The best way to see this is to run a unit
211
+ # test with two functions, each of which calls EventMachine#run and each of
212
+ # which throws something inside of #run. Without the ensure, the second test
213
+ # will start without release_machine being called and will immediately throw
214
+ # a C++ runtime error.
215
+ #
216
+ def EventMachine::run &block
217
+ @conns = {}
218
+ @acceptors = {}
219
+ @timers = {}
220
+ begin
221
+ @reactor_running = true
222
+ initialize_event_machine
223
+ block and add_timer 0, block
224
+ run_machine
225
+ ensure
226
+ release_machine
227
+ @reactor_running = false
228
+ end
228
229
  end
229
- end
230
230
 
231
231
 
232
232
  # Sugars a common use case. Will pass the given block to #run, but will terminate
@@ -919,6 +919,7 @@ module EventMachine
919
919
  @threadqueue << [op,callback]
920
920
  end
921
921
 
922
+
922
923
  # Schedules a proc for execution immediately after the next "turn" through the reactor
923
924
  # core. An advanced technique, this can be useful for improving memory management and/or
924
925
  # application responsiveness, especially when scheduling large amounts of data for
@@ -1027,15 +1028,21 @@ module EventMachine
1027
1028
  # (Experimental)
1028
1029
  #
1029
1030
  #
1030
- def EventMachine::open_keyboard handler=nil
1031
+ def EventMachine::open_keyboard handler=nil, *args
1031
1032
  klass = if (handler and handler.is_a?(Class))
1032
1033
  handler
1033
1034
  else
1034
1035
  Class.new( Connection ) {handler and include handler}
1035
1036
  end
1036
1037
 
1038
+ arity = klass.instance_method(:initialize).arity
1039
+ expected = arity >= 0 ? arity : -(arity + 1)
1040
+ if (arity >= 0 and args.size != expected) or (arity < 0 and args.size < expected)
1041
+ raise ArgumentError, "wrong number of arguments for #{klass}#initialize (#{args.size} for #{expected})"
1042
+ end
1043
+
1037
1044
  s = read_keyboard
1038
- c = klass.new s
1045
+ c = klass.new s, *args
1039
1046
  @conns[s] = c
1040
1047
  block_given? and yield c
1041
1048
  c
@@ -1045,6 +1052,42 @@ module EventMachine
1045
1052
 
1046
1053
  private
1047
1054
  def EventMachine::event_callback conn_binding, opcode, data
1055
+ #
1056
+ # Changed 27Dec07: Eliminated the hookable error handling.
1057
+ # No one was using it, and it degraded performance significantly.
1058
+ # It's in original_event_callback, which is dead code.
1059
+ #
1060
+ if opcode == ConnectionData
1061
+ c = @conns[conn_binding] or raise ConnectionNotBound
1062
+ c.receive_data data
1063
+ elsif opcode == ConnectionUnbound
1064
+ if c = @conns.delete( conn_binding )
1065
+ c.unbind
1066
+ elsif c = @acceptors.delete( conn_binding )
1067
+ # no-op
1068
+ else
1069
+ raise ConnectionNotBound
1070
+ end
1071
+ elsif opcode == ConnectionAccepted
1072
+ accep,args,blk = @acceptors[conn_binding]
1073
+ raise NoHandlerForAcceptedConnection unless accep
1074
+ c = accep.new data, *args
1075
+ @conns[data] = c
1076
+ blk and blk.call(c)
1077
+ c # (needed?)
1078
+ elsif opcode == TimerFired
1079
+ t = @timers.delete( data ) or raise UnknownTimerFired
1080
+ t.call
1081
+ elsif opcode == ConnectionCompleted
1082
+ c = @conns[conn_binding] or raise ConnectionNotBound
1083
+ c.connection_completed
1084
+ elsif opcode == LoopbreakSignalled
1085
+ run_deferred_callbacks
1086
+ end
1087
+ end
1088
+
1089
+ private
1090
+ def EventMachine::original_event_callback conn_binding, opcode, data
1048
1091
  #
1049
1092
  # Added 03Oct07: Any code path that invokes user-written code must
1050
1093
  # wrap itself in a begin/rescue for RuntimeErrors, that calls the
@@ -1195,11 +1238,8 @@ class Connection
1195
1238
 
1196
1239
  # Store signature and run #post_init
1197
1240
  @signature = sig
1198
- begin
1199
- post_init
1200
- rescue
1201
- EventMachine::handle_runtime_error
1202
- end
1241
+ associate_callback_target sig
1242
+ post_init
1203
1243
 
1204
1244
  self
1205
1245
  end
@@ -1421,6 +1461,15 @@ class Connection
1421
1461
  EventMachine::get_peername @signature
1422
1462
  end
1423
1463
 
1464
+ # #get_sockname is used with stream-connections to obtain the identity
1465
+ # of the local side of the connection. If a local name is available, this method
1466
+ # returns a sockaddr structure. The method returns nil if no local name is available.
1467
+ # You can use Socket#unpack_sockaddr_in and its variants to obtain the
1468
+ # values contained in the local-name structure returned from #get_sockname.
1469
+ def get_sockname
1470
+ EventMachine::get_sockname @signature
1471
+ end
1472
+
1424
1473
  # Returns the PID (kernel process identifier) of a subprocess
1425
1474
  # associated with this Connection object. For use with EventMachine#popen
1426
1475
  # and similar methods. Returns nil when there is no meaningful subprocess.
@@ -1503,6 +1552,7 @@ class Connection
1503
1552
  #
1504
1553
  #
1505
1554
  class EventMachine::PeriodicTimer
1555
+ attr_accessor :interval
1506
1556
  def initialize *args, &block
1507
1557
  @interval = args.shift
1508
1558
  @code = args.shift || block
@@ -1512,11 +1562,7 @@ class Connection
1512
1562
  EventMachine::add_timer @interval, proc {self.fire}
1513
1563
  end
1514
1564
  def fire
1515
- begin
1516
- @code.call
1517
- rescue
1518
- EventMachine::handle_runtime_error
1519
- end
1565
+ @code.call
1520
1566
  schedule unless @cancelled
1521
1567
  end
1522
1568
  def cancel
@@ -1571,5 +1617,6 @@ require 'protocols/smtpclient'
1571
1617
  require 'protocols/smtpserver'
1572
1618
  require 'protocols/saslauth'
1573
1619
 
1620
+ require 'em/processes'
1574
1621
 
1575
1622
 
@@ -1,4 +1,4 @@
1
- # $Id: eventmachine_version.rb 608 2007-12-09 21:04:39Z blackhedd $
1
+ # $Id: eventmachine_version.rb 686 2008-05-14 21:21:10Z francis $
2
2
  #
3
3
  # Author:: Francis Cianfrocca (gmail: blackhedd)
4
4
  # Homepage:: http://rubyeventmachine.com
@@ -25,7 +25,7 @@
25
25
 
26
26
  module EventMachine
27
27
 
28
- VERSION = "0.10.0"
28
+ VERSION = "0.12.0"
29
29
 
30
30
  end
31
31
 
data/lib/evma.rb CHANGED
@@ -1,4 +1,4 @@
1
- # $Id: evma.rb 319 2007-05-22 22:11:18Z blackhedd $
1
+ # $Id: evma.rb 668 2008-01-04 23:00:34Z blackhedd $
2
2
  #
3
3
  # Author:: Francis Cianfrocca (gmail: blackhedd)
4
4
  # Homepage:: http://rubyeventmachine.com
data/lib/evma/callback.rb CHANGED
@@ -1,4 +1,4 @@
1
- # $Id: callback.rb 321 2007-05-22 22:15:04Z blackhedd $
1
+ # $Id: callback.rb 668 2008-01-04 23:00:34Z blackhedd $
2
2
  #
3
3
  # Author:: Francis Cianfrocca (gmail: blackhedd)
4
4
  # Homepage:: http://rubyeventmachine.com
@@ -1,4 +1,4 @@
1
- # $Id: container.rb 321 2007-05-22 22:15:04Z blackhedd $
1
+ # $Id: container.rb 668 2008-01-04 23:00:34Z blackhedd $
2
2
  #
3
3
  # Author:: Francis Cianfrocca (gmail: blackhedd)
4
4
  # Homepage:: http://rubyeventmachine.com
data/lib/evma/factory.rb CHANGED
@@ -1,4 +1,4 @@
1
- # $Id: factory.rb 321 2007-05-22 22:15:04Z blackhedd $
1
+ # $Id: factory.rb 668 2008-01-04 23:00:34Z blackhedd $
2
2
  #
3
3
  # Author:: Francis Cianfrocca (gmail: blackhedd)
4
4
  # Homepage:: http://rubyeventmachine.com
data/lib/evma/protocol.rb CHANGED
@@ -1,4 +1,4 @@
1
- # $Id: protocol.rb 321 2007-05-22 22:15:04Z blackhedd $
1
+ # $Id: protocol.rb 668 2008-01-04 23:00:34Z blackhedd $
2
2
  #
3
3
  # Author:: Francis Cianfrocca (gmail: blackhedd)
4
4
  # Homepage:: http://rubyeventmachine.com
data/lib/evma/reactor.rb CHANGED
@@ -1,4 +1,4 @@
1
- # $Id: reactor.rb 321 2007-05-22 22:15:04Z blackhedd $
1
+ # $Id: reactor.rb 668 2008-01-04 23:00:34Z blackhedd $
2
2
  #
3
3
  # Author:: Francis Cianfrocca (gmail: blackhedd)
4
4
  # Homepage:: http://rubyeventmachine.com