eventmachine 0.12.6-x86-mswin32-60 → 0.12.8-x86-mswin32-60

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 (116) hide show
  1. data/{docs/README → README} +21 -13
  2. data/Rakefile +14 -4
  3. data/docs/DEFERRABLES +0 -5
  4. data/docs/INSTALL +2 -4
  5. data/docs/LEGAL +1 -1
  6. data/docs/LIGHTWEIGHT_CONCURRENCY +0 -2
  7. data/docs/PURE_RUBY +0 -2
  8. data/docs/RELEASE_NOTES +0 -2
  9. data/docs/SMTP +0 -7
  10. data/docs/SPAWNED_PROCESSES +0 -4
  11. data/docs/TODO +0 -2
  12. data/eventmachine.gemspec +41 -32
  13. data/examples/ex_channel.rb +43 -0
  14. data/examples/ex_queue.rb +2 -0
  15. data/examples/helper.rb +2 -0
  16. data/ext/cmain.cpp +685 -586
  17. data/ext/cplusplus.cpp +15 -6
  18. data/ext/ed.cpp +1732 -1522
  19. data/ext/ed.h +407 -380
  20. data/ext/em.cpp +2263 -1937
  21. data/ext/em.h +223 -186
  22. data/ext/eventmachine.h +111 -98
  23. data/ext/eventmachine_cpp.h +1 -0
  24. data/ext/extconf.rb +4 -0
  25. data/ext/kb.cpp +81 -82
  26. data/ext/pipe.cpp +349 -351
  27. data/ext/project.h +21 -0
  28. data/ext/rubymain.cpp +1047 -847
  29. data/ext/ssl.cpp +38 -1
  30. data/ext/ssl.h +5 -1
  31. data/java/src/com/rubyeventmachine/Application.java +7 -3
  32. data/java/src/com/rubyeventmachine/EmReactor.java +16 -1
  33. data/java/src/com/rubyeventmachine/tests/ConnectTest.java +25 -3
  34. data/lib/{protocols → em}/buftok.rb +16 -5
  35. data/lib/em/callback.rb +26 -0
  36. data/lib/em/channel.rb +57 -0
  37. data/lib/em/connection.rb +505 -0
  38. data/lib/em/deferrable.rb +144 -165
  39. data/lib/em/file_watch.rb +54 -0
  40. data/lib/em/future.rb +24 -25
  41. data/lib/em/messages.rb +1 -1
  42. data/lib/em/process_watch.rb +44 -0
  43. data/lib/em/processes.rb +119 -113
  44. data/lib/em/protocols.rb +35 -0
  45. data/lib/em/protocols/header_and_content.rb +138 -0
  46. data/lib/em/protocols/httpclient.rb +263 -0
  47. data/lib/em/protocols/httpclient2.rb +582 -0
  48. data/lib/{protocols → em/protocols}/line_and_text.rb +2 -2
  49. data/lib/em/protocols/linetext2.rb +160 -0
  50. data/lib/{protocols → em/protocols}/memcache.rb +37 -7
  51. data/lib/em/protocols/object_protocol.rb +39 -0
  52. data/lib/em/protocols/postgres3.rb +247 -0
  53. data/lib/em/protocols/saslauth.rb +175 -0
  54. data/lib/em/protocols/smtpclient.rb +331 -0
  55. data/lib/em/protocols/smtpserver.rb +547 -0
  56. data/lib/em/protocols/stomp.rb +200 -0
  57. data/lib/{protocols → em/protocols}/tcptest.rb +21 -25
  58. data/lib/em/queue.rb +61 -0
  59. data/lib/em/spawnable.rb +53 -56
  60. data/lib/em/streamer.rb +92 -74
  61. data/lib/em/timers.rb +55 -0
  62. data/lib/em/version.rb +3 -0
  63. data/lib/eventmachine.rb +1636 -1926
  64. data/lib/evma.rb +1 -1
  65. data/lib/jeventmachine.rb +106 -101
  66. data/lib/pr_eventmachine.rb +47 -36
  67. data/tasks/project.rake +2 -1
  68. data/tests/client.crt +31 -0
  69. data/tests/client.key +51 -0
  70. data/tests/test_attach.rb +18 -0
  71. data/tests/test_basic.rb +285 -231
  72. data/tests/test_channel.rb +63 -0
  73. data/tests/test_connection_count.rb +2 -2
  74. data/tests/test_epoll.rb +162 -163
  75. data/tests/test_errors.rb +36 -36
  76. data/tests/test_exc.rb +22 -25
  77. data/tests/test_file_watch.rb +49 -0
  78. data/tests/test_futures.rb +77 -93
  79. data/tests/test_hc.rb +2 -2
  80. data/tests/test_httpclient.rb +55 -52
  81. data/tests/test_httpclient2.rb +153 -155
  82. data/tests/test_inactivity_timeout.rb +30 -0
  83. data/tests/test_kb.rb +8 -9
  84. data/tests/test_ltp2.rb +274 -277
  85. data/tests/test_next_tick.rb +135 -109
  86. data/tests/test_object_protocol.rb +37 -0
  87. data/tests/test_process_watch.rb +48 -0
  88. data/tests/test_processes.rb +128 -95
  89. data/tests/test_proxy_connection.rb +92 -0
  90. data/tests/test_pure.rb +1 -5
  91. data/tests/test_queue.rb +44 -0
  92. data/tests/test_running.rb +9 -14
  93. data/tests/test_sasl.rb +32 -34
  94. data/tests/test_send_file.rb +175 -176
  95. data/tests/test_servers.rb +37 -41
  96. data/tests/test_smtpserver.rb +47 -55
  97. data/tests/test_spawn.rb +284 -291
  98. data/tests/test_ssl_args.rb +1 -1
  99. data/tests/test_ssl_methods.rb +1 -1
  100. data/tests/test_ssl_verify.rb +82 -0
  101. data/tests/test_timers.rb +81 -88
  102. data/tests/test_ud.rb +0 -7
  103. data/tests/testem.rb +1 -1
  104. metadata +52 -36
  105. data/lib/em/eventable.rb +0 -39
  106. data/lib/eventmachine_version.rb +0 -31
  107. data/lib/protocols/header_and_content.rb +0 -129
  108. data/lib/protocols/httpcli2.rb +0 -803
  109. data/lib/protocols/httpclient.rb +0 -270
  110. data/lib/protocols/linetext2.rb +0 -161
  111. data/lib/protocols/postgres.rb +0 -261
  112. data/lib/protocols/saslauth.rb +0 -179
  113. data/lib/protocols/smtpclient.rb +0 -308
  114. data/lib/protocols/smtpserver.rb +0 -556
  115. data/lib/protocols/stomp.rb +0 -153
  116. data/tests/test_eventables.rb +0 -77
data/lib/em/deferrable.rb CHANGED
@@ -1,4 +1,4 @@
1
- # $Id$
1
+ #--
2
2
  #
3
3
  # Author:: Francis Cianfrocca (gmail: blackhedd)
4
4
  # Homepage:: http://rubyeventmachine.com
@@ -23,186 +23,165 @@
23
23
  #
24
24
  #
25
25
 
26
- require 'forwardable'
27
-
28
26
  module EventMachine
29
-
30
- module Deferrable
31
-
32
- # Specify a block to be executed if and when the Deferrable object receives
33
- # a status of :succeeded. See #set_deferred_status for more information.
34
- #
35
- # Calling this method on a Deferrable object whose status is not yet known
36
- # will cause the callback block to be stored on an internal list.
37
- # If you call this method on a Deferrable whose status is :succeeded, the
38
- # block will be executed immediately, receiving the parameters given to the
39
- # prior #set_deferred_status call.
40
- #
41
- #--
42
- # If there is no status, add a callback to an internal list.
43
- # If status is succeeded, execute the callback immediately.
44
- # If status is failed, do nothing.
45
- #
46
- def callback &block
47
- return unless block
48
- if @deferred_status == :succeeded
49
- block.call(*@deferred_args)
50
- elsif @deferred_status != :failed
51
- @callbacks ||= []
52
- @callbacks.unshift block # << block
27
+ module Deferrable
28
+
29
+ # Specify a block to be executed if and when the Deferrable object receives
30
+ # a status of :succeeded. See #set_deferred_status for more information.
31
+ #
32
+ # Calling this method on a Deferrable object whose status is not yet known
33
+ # will cause the callback block to be stored on an internal list.
34
+ # If you call this method on a Deferrable whose status is :succeeded, the
35
+ # block will be executed immediately, receiving the parameters given to the
36
+ # prior #set_deferred_status call.
37
+ #
38
+ #--
39
+ # If there is no status, add a callback to an internal list.
40
+ # If status is succeeded, execute the callback immediately.
41
+ # If status is failed, do nothing.
42
+ #
43
+ def callback &block
44
+ return unless block
45
+ if @deferred_status == :succeeded
46
+ block.call(*@deferred_args)
47
+ elsif @deferred_status != :failed
48
+ @callbacks ||= []
49
+ @callbacks.unshift block # << block
50
+ end
53
51
  end
54
- end
55
52
 
56
- # Specify a block to be executed if and when the Deferrable object receives
57
- # a status of :failed. See #set_deferred_status for more information.
58
- #--
59
- # If there is no status, add an errback to an internal list.
60
- # If status is failed, execute the errback immediately.
61
- # If status is succeeded, do nothing.
62
- #
63
- def errback &block
64
- return unless block
65
- if @deferred_status == :failed
66
- block.call(*@deferred_args)
67
- elsif @deferred_status != :succeeded
68
- @errbacks ||= []
69
- @errbacks.unshift block # << block
53
+ # Specify a block to be executed if and when the Deferrable object receives
54
+ # a status of :failed. See #set_deferred_status for more information.
55
+ #--
56
+ # If there is no status, add an errback to an internal list.
57
+ # If status is failed, execute the errback immediately.
58
+ # If status is succeeded, do nothing.
59
+ #
60
+ def errback &block
61
+ return unless block
62
+ if @deferred_status == :failed
63
+ block.call(*@deferred_args)
64
+ elsif @deferred_status != :succeeded
65
+ @errbacks ||= []
66
+ @errbacks.unshift block # << block
67
+ end
70
68
  end
71
- end
72
69
 
73
- # Sets the "disposition" (status) of the Deferrable object. See also the large set of
74
- # sugarings for this method.
75
- # Note that if you call this method without arguments,
76
- # no arguments will be passed to the callback/errback.
77
- # If the user has coded these with arguments, then the
78
- # user code will throw an argument exception.
79
- # Implementors of deferrable classes <b>must</b>
80
- # document the arguments they will supply to user callbacks.
81
- #
82
- # OBSERVE SOMETHING VERY SPECIAL here: you may call this method even
83
- # on the INSIDE of a callback. This is very useful when a previously-registered
84
- # callback wants to change the parameters that will be passed to subsequently-registered
85
- # ones.
86
- #
87
- # You may give either :succeeded or :failed as the status argument.
88
- #
89
- # If you pass :succeeded, then all of the blocks passed to the object using the #callback
90
- # method (if any) will be executed BEFORE the #set_deferred_status method returns. All of the blocks
91
- # passed to the object using #errback will be discarded.
92
- #
93
- # If you pass :failed, then all of the blocks passed to the object using the #errback
94
- # method (if any) will be executed BEFORE the #set_deferred_status method returns. All of the blocks
95
- # passed to the object using # callback will be discarded.
96
- #
97
- # If you pass any arguments to #set_deferred_status in addition to the status argument,
98
- # they will be passed as arguments to any callbacks or errbacks that are executed.
99
- # It's your responsibility to ensure that the argument lists specified in your callbacks and
100
- # errbacks match the arguments given in calls to #set_deferred_status, otherwise Ruby will raise
101
- # an ArgumentError.
102
- #
103
- # --
104
- # We're shifting callbacks off and discarding them as we execute them.
105
- # This is valid because by definition callbacks are executed no more than
106
- # once. It also has the magic effect of permitting recursive calls, which
107
- # means that a callback can call #set_deferred_status and change the parameters
108
- # that will be sent to subsequent callbacks down the chain.
109
- #
110
- # Changed @callbacks and @errbacks from push/shift to unshift/pop, per suggestion
111
- # by Kirk Haines, to work around the memory leak bug that still exists in many Ruby
112
- # versions.
113
- #
114
- # Changed 15Sep07: after processing callbacks or errbacks, CLEAR the other set of
115
- # handlers. This gets us a little closer to the behavior of Twisted's "deferred,"
116
- # which only allows status to be set once. Prior to making this change, it was possible
117
- # to "succeed" a Deferrable (triggering its callbacks), and then immediately "fail" it,
118
- # triggering its errbacks! That is clearly undesirable, but it's just as undesirable
119
- # to raise an exception is status is set more than once on a Deferrable. The latter
120
- # behavior would invalidate the idiom of resetting arguments by setting status from
121
- # within a callback or errback, but more seriously it would cause spurious errors
122
- # if a Deferrable was timed out and then an attempt was made to succeed it. See the
123
- # comments under the new method #timeout.
124
- #
125
- def set_deferred_status status, *args
126
- cancel_timeout
127
- @deferred_status = status
128
- @deferred_args = args
129
- case @deferred_status
130
- when :succeeded
131
- if @callbacks
132
- while cb = @callbacks.pop
133
- cb.call(*@deferred_args)
70
+ # Sets the "disposition" (status) of the Deferrable object. See also the large set of
71
+ # sugarings for this method.
72
+ # Note that if you call this method without arguments,
73
+ # no arguments will be passed to the callback/errback.
74
+ # If the user has coded these with arguments, then the
75
+ # user code will throw an argument exception.
76
+ # Implementors of deferrable classes <b>must</b>
77
+ # document the arguments they will supply to user callbacks.
78
+ #
79
+ # OBSERVE SOMETHING VERY SPECIAL here: you may call this method even
80
+ # on the INSIDE of a callback. This is very useful when a previously-registered
81
+ # callback wants to change the parameters that will be passed to subsequently-registered
82
+ # ones.
83
+ #
84
+ # You may give either :succeeded or :failed as the status argument.
85
+ #
86
+ # If you pass :succeeded, then all of the blocks passed to the object using the #callback
87
+ # method (if any) will be executed BEFORE the #set_deferred_status method returns. All of the blocks
88
+ # passed to the object using #errback will be discarded.
89
+ #
90
+ # If you pass :failed, then all of the blocks passed to the object using the #errback
91
+ # method (if any) will be executed BEFORE the #set_deferred_status method returns. All of the blocks
92
+ # passed to the object using # callback will be discarded.
93
+ #
94
+ # If you pass any arguments to #set_deferred_status in addition to the status argument,
95
+ # they will be passed as arguments to any callbacks or errbacks that are executed.
96
+ # It's your responsibility to ensure that the argument lists specified in your callbacks and
97
+ # errbacks match the arguments given in calls to #set_deferred_status, otherwise Ruby will raise
98
+ # an ArgumentError.
99
+ #
100
+ #--
101
+ # We're shifting callbacks off and discarding them as we execute them.
102
+ # This is valid because by definition callbacks are executed no more than
103
+ # once. It also has the magic effect of permitting recursive calls, which
104
+ # means that a callback can call #set_deferred_status and change the parameters
105
+ # that will be sent to subsequent callbacks down the chain.
106
+ #
107
+ # Changed @callbacks and @errbacks from push/shift to unshift/pop, per suggestion
108
+ # by Kirk Haines, to work around the memory leak bug that still exists in many Ruby
109
+ # versions.
110
+ #
111
+ # Changed 15Sep07: after processing callbacks or errbacks, CLEAR the other set of
112
+ # handlers. This gets us a little closer to the behavior of Twisted's "deferred,"
113
+ # which only allows status to be set once. Prior to making this change, it was possible
114
+ # to "succeed" a Deferrable (triggering its callbacks), and then immediately "fail" it,
115
+ # triggering its errbacks! That is clearly undesirable, but it's just as undesirable
116
+ # to raise an exception is status is set more than once on a Deferrable. The latter
117
+ # behavior would invalidate the idiom of resetting arguments by setting status from
118
+ # within a callback or errback, but more seriously it would cause spurious errors
119
+ # if a Deferrable was timed out and then an attempt was made to succeed it. See the
120
+ # comments under the new method #timeout.
121
+ #
122
+ def set_deferred_status status, *args
123
+ cancel_timeout
124
+ @deferred_status = status
125
+ @deferred_args = args
126
+ case @deferred_status
127
+ when :succeeded
128
+ if @callbacks
129
+ while cb = @callbacks.pop
130
+ cb.call(*@deferred_args)
131
+ end
134
132
  end
135
- end
136
- @errbacks.clear if @errbacks
137
- when :failed
138
- if @errbacks
139
- while eb = @errbacks.pop
140
- eb.call(*@deferred_args)
133
+ @errbacks.clear if @errbacks
134
+ when :failed
135
+ if @errbacks
136
+ while eb = @errbacks.pop
137
+ eb.call(*@deferred_args)
138
+ end
141
139
  end
140
+ @callbacks.clear if @callbacks
142
141
  end
143
- @callbacks.clear if @callbacks
144
142
  end
145
- end
146
143
 
147
144
 
148
- # Setting a timeout on a Deferrable causes it to go into the failed state after
149
- # the Timeout expires (passing no arguments to the object's errbacks).
150
- # Setting the status at any time prior to a call to the expiration of the timeout
151
- # will cause the timer to be cancelled.
152
- #--
153
- #
154
- #
155
- def timeout seconds
156
- cancel_timeout
157
- me = self
158
- @deferred_timeout = EventMachine::Timer.new(seconds) {me.fail}
159
- end
160
-
145
+ # Setting a timeout on a Deferrable causes it to go into the failed state after
146
+ # the Timeout expires (passing no arguments to the object's errbacks).
147
+ # Setting the status at any time prior to a call to the expiration of the timeout
148
+ # will cause the timer to be cancelled.
149
+ def timeout seconds
150
+ cancel_timeout
151
+ me = self
152
+ @deferred_timeout = EventMachine::Timer.new(seconds) {me.fail}
153
+ end
161
154
 
162
- # Cancels an outstanding timeout if any. Undoes the action of #timeout.
163
- #
164
- #
165
- def cancel_timeout
166
- if @deferred_timeout
167
- @deferred_timeout.cancel
168
- @deferred_timeout = nil
169
- end
170
- end
155
+ # Cancels an outstanding timeout if any. Undoes the action of #timeout.
156
+ #
157
+ def cancel_timeout
158
+ if @deferred_timeout
159
+ @deferred_timeout.cancel
160
+ @deferred_timeout = nil
161
+ end
162
+ end
171
163
 
172
164
 
173
- # Equivalent to set_deferred_status(:succeeded, ...)
174
- #
175
- def set_deferred_success *args
176
- set_deferred_status :succeeded, *args
177
- end
165
+ # Sugar for set_deferred_status(:succeeded, ...)
166
+ #
167
+ def succeed *args
168
+ set_deferred_status :succeeded, *args
169
+ end
170
+ alias set_deferred_success succeed
178
171
 
179
- # Equivalent to set_deferred_status(:failed, ...)
180
- #
181
- def set_deferred_failure *args
182
- set_deferred_status :failed, *args
172
+ # Sugar for set_deferred_status(:failed, ...)
173
+ #
174
+ def fail *args
175
+ set_deferred_status :failed, *args
176
+ end
177
+ alias set_deferred_failure fail
183
178
  end
184
179
 
185
- # And still more sugar
186
- #
187
- def succeed *args
188
- set_deferred_success(*args)
189
- end
190
180
 
191
- # Can't get enough sugar
192
- #
193
- def fail *args
194
- set_deferred_failure(*args)
181
+ # DefaultDeferrable is an otherwise empty class that includes Deferrable.
182
+ # This is very useful when you just need to return a Deferrable object
183
+ # as a way of communicating deferred status to some other part of a program.
184
+ class DefaultDeferrable
185
+ include Deferrable
195
186
  end
196
- end
197
-
198
-
199
- # DefaultDeferrable is an otherwise empty class that includes Deferrable.
200
- # This is very useful when you just need to return a Deferrable object
201
- # as a way of communicating deferred status to some other part of a program.
202
- #
203
- class DefaultDeferrable
204
- include Deferrable
205
- end
206
-
207
- end
208
-
187
+ end
@@ -0,0 +1,54 @@
1
+ module EventMachine
2
+
3
+ # This is subclassed from EventMachine::Connection for use with the file monitoring API. Read the
4
+ # documentation on the instance methods of this class, and for a full explanation see EventMachine.watch_file.
5
+ class FileWatch < Connection
6
+ # :stopdoc:
7
+ Cmodified = 'modified'.freeze
8
+ Cdeleted = 'deleted'.freeze
9
+ Cmoved = 'moved'.freeze
10
+ # :startdoc:
11
+
12
+ def receive_data(data) #:nodoc:
13
+ case data
14
+ when Cmodified
15
+ file_modified
16
+ when Cdeleted
17
+ file_deleted
18
+ when Cmoved
19
+ file_moved
20
+ end
21
+ end
22
+
23
+ # Returns the path that EventMachine::watch_file was originally called with. The current implementation
24
+ # does not pick up on the new filename after a rename occurs.
25
+ def path
26
+ @path
27
+ end
28
+
29
+ # Should be redefined with the user's custom callback that will be fired when the file is modified.
30
+ def file_modified
31
+ end
32
+
33
+ # Should be redefined with the user's custom callback that will be fired when the file is deleted.
34
+ # When the file is deleted, stop_watching will be called after this to make sure everything is
35
+ # cleaned up correctly.
36
+ #
37
+ # Note that on linux (with inotify), file_deleted will not be called until all open file descriptors to
38
+ # the file have been closed.
39
+ def file_deleted
40
+ end
41
+
42
+ # Should be redefined with the user's custom callback that will be fired when the file is moved or renamed.
43
+ def file_moved
44
+ end
45
+
46
+ # Discontinue monitoring of the file.
47
+ # This involves cleaning up the underlying monitoring details with kqueue/inotify, and in turn firing unbind.
48
+ # This will be called automatically when a file is deleted. User code may call it as well.
49
+ def stop_watching
50
+ EventMachine::unwatch_filename(@signature)
51
+ end
52
+ end
53
+
54
+ end
data/lib/em/future.rb CHANGED
@@ -1,4 +1,4 @@
1
- # $Id$
1
+ #--
2
2
  #
3
3
  # Author:: Francis Cianfrocca (gmail: blackhedd)
4
4
  # Homepage:: http://rubyeventmachine.com
@@ -23,39 +23,38 @@
23
23
  #
24
24
  #
25
25
 
26
+ #--
26
27
  # This defines EventMachine::Deferrable#future, which requires
27
28
  # that the rest of EventMachine::Deferrable has already been seen.
28
29
  # (It's in deferrable.rb.)
29
- #
30
- # A future is a sugaring of a typical deferrable usage.
31
30
 
32
31
  module EventMachine
33
32
  module Deferrable
34
33
 
35
- class << self
36
- # Evaluate arg (which may be an expression or a block).
37
- # What's the class of arg?
38
- # If arg is an ordinary expression, then return it.
39
- # If arg is deferrable (responds to :set_deferred_status),
40
- # then look at the arguments. If either callback or errback
41
- # are defined, then use them. If neither are defined, then
42
- # use the supplied block (if any) as the callback.
43
- # Then return arg.
44
- def future arg, cb=nil, eb=nil, &blk
45
- arg = arg.call if arg.respond_to?(:call)
34
+ # A future is a sugaring of a typical deferrable usage.
35
+ #--
36
+ # Evaluate arg (which may be an expression or a block).
37
+ # What's the class of arg?
38
+ # If arg is an ordinary expression, then return it.
39
+ # If arg is deferrable (responds to :set_deferred_status),
40
+ # then look at the arguments. If either callback or errback
41
+ # are defined, then use them. If neither are defined, then
42
+ # use the supplied block (if any) as the callback.
43
+ # Then return arg.
44
+ def self.future arg, cb=nil, eb=nil, &blk
45
+ arg = arg.call if arg.respond_to?(:call)
46
46
 
47
- if arg.respond_to?(:set_deferred_status)
48
- if cb || eb
49
- arg.callback(&cb) if cb
50
- arg.errback(&eb) if eb
51
- else
52
- arg.callback(&blk) if blk
53
- end
54
- end
47
+ if arg.respond_to?(:set_deferred_status)
48
+ if cb || eb
49
+ arg.callback(&cb) if cb
50
+ arg.errback(&eb) if eb
51
+ else
52
+ arg.callback(&blk) if blk
53
+ end
54
+ end
55
55
 
56
- arg
57
- end
58
- end
56
+ arg
57
+ end
59
58
 
60
59
  end
61
60
  end