slave 1.2.2 → 1.3.0

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.
@@ -38,6 +38,9 @@ URIS
38
38
  http://codeforpeople.com/lib/ruby/slave
39
39
 
40
40
  HISTORY
41
+ 1.3.0:
42
+ - fixes for 1.9.2 (undef object_id)
43
+ - fixes for osx (too long socket names)
41
44
 
42
45
  1.2.1:
43
46
  - jruby/ThreadSafe patches from skaar and ez. using slave.rb with jruby,
@@ -105,4 +108,4 @@ HISTORY
105
108
 
106
109
  SAMPLES
107
110
 
108
- @samples
111
+ <%= @samples %>
@@ -1,11 +1,11 @@
1
1
  require 'slave'
2
- #
2
+
3
3
  # simple usage is simply to stand up a server object as a slave. you do not
4
4
  # need to wait for the server, join it, etc. it will die when the parent
5
5
  # process dies - even under 'kill -9' conditions
6
6
  #
7
7
  class Server
8
- def add_two n
8
+ def add_two(n)
9
9
  n + 2
10
10
  end
11
11
  end
@@ -0,0 +1,42 @@
1
+ ## slave.gemspec
2
+ #
3
+
4
+ Gem::Specification::new do |spec|
5
+ spec.name = "slave"
6
+ spec.version = "1.3.0"
7
+ spec.platform = Gem::Platform::RUBY
8
+ spec.summary = "slave"
9
+ spec.description = "description: slave kicks the ass"
10
+
11
+ spec.files =
12
+ ["README",
13
+ "Rakefile",
14
+ "lib",
15
+ "lib/slave-1.2.1.rb",
16
+ "lib/slave.rb",
17
+ "readme.erb",
18
+ "samples",
19
+ "samples/a.rb",
20
+ "samples/b.rb",
21
+ "samples/c.rb",
22
+ "samples/d.rb",
23
+ "samples/e.rb",
24
+ "samples/f.rb",
25
+ "samples/g.rb",
26
+ "slave.gemspec"]
27
+
28
+ spec.executables = []
29
+
30
+ spec.require_path = "lib"
31
+
32
+ spec.test_files = nil
33
+
34
+
35
+
36
+ spec.extensions.push(*[])
37
+
38
+ spec.rubyforge_project = "codeforpeople"
39
+ spec.author = "Ara T. Howard"
40
+ spec.email = "ara.t.howard@gmail.com"
41
+ spec.homepage = "https://github.com/ahoward/slave"
42
+ end
metadata CHANGED
@@ -5,9 +5,9 @@ version: !ruby/object:Gem::Version
5
5
  prerelease:
6
6
  segments:
7
7
  - 1
8
- - 2
9
- - 2
10
- version: 1.2.2
8
+ - 3
9
+ - 0
10
+ version: 1.3.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Ara T. Howard
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-10-06 00:00:00 Z
18
+ date: 2011-10-10 00:00:00 Z
19
19
  dependencies: []
20
20
 
21
21
  description: "description: slave kicks the ass"
@@ -28,31 +28,10 @@ extra_rdoc_files: []
28
28
 
29
29
  files:
30
30
  - README
31
- - README.tmpl
32
31
  - Rakefile
33
- - doc/classes/Slave.html
34
- - doc/classes/Slave/LifeLine.html
35
- - doc/classes/Slave/ThreadSafe.html
36
- - doc/classes/Slave/ThreadSafeHash.html
37
- - doc/classes/o.html
38
- - doc/created.rid
39
- - doc/dot/f_0.dot
40
- - doc/dot/f_0.jpg
41
- - doc/dot/f_1.dot
42
- - doc/dot/f_1.jpg
43
- - doc/files/README.html
44
- - doc/files/lib/slave_rb.html
45
- - doc/fr_class_index.html
46
- - doc/fr_file_index.html
47
- - doc/fr_method_index.html
48
- - doc/index.html
49
- - doc/rdoc-style.css
50
- - gemspec.rb
51
- - gen_readme.rb
52
- - install.rb
53
32
  - lib/slave-1.2.1.rb
54
33
  - lib/slave.rb
55
- - rdoc.cmd
34
+ - readme.erb
56
35
  - samples/a.rb
57
36
  - samples/b.rb
58
37
  - samples/c.rb
@@ -60,12 +39,10 @@ files:
60
39
  - samples/e.rb
61
40
  - samples/f.rb
62
41
  - samples/g.rb
63
- - test.old/slave.rb
42
+ - slave.gemspec
64
43
  homepage: https://github.com/ahoward/slave
65
44
  licenses: []
66
45
 
67
- metadata: {}
68
-
69
46
  post_install_message:
70
47
  rdoc_options: []
71
48
 
@@ -92,9 +69,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
92
69
  requirements: []
93
70
 
94
71
  rubyforge_project: codeforpeople
95
- rubygems_version: 1.8.10
72
+ rubygems_version: 1.8.11
96
73
  signing_key:
97
- specification_version: 4
74
+ specification_version: 3
98
75
  summary: slave
99
76
  test_files: []
100
77
 
@@ -1,997 +0,0 @@
1
- <?xml version="1.0" encoding="iso-8859-1"?>
2
- <!DOCTYPE html
3
- PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
-
6
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
7
- <head>
8
- <title>Class: Slave</title>
9
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
- <meta http-equiv="Content-Script-Type" content="text/javascript" />
11
- <link rel="stylesheet" href=".././rdoc-style.css" type="text/css" media="screen" />
12
- <script type="text/javascript">
13
- // <![CDATA[
14
-
15
- function popupCode( url ) {
16
- window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
17
- }
18
-
19
- function toggleCode( id ) {
20
- if ( document.getElementById )
21
- elem = document.getElementById( id );
22
- else if ( document.all )
23
- elem = eval( "document.all." + id );
24
- else
25
- return false;
26
-
27
- elemStyle = elem.style;
28
-
29
- if ( elemStyle.display != "block" ) {
30
- elemStyle.display = "block"
31
- } else {
32
- elemStyle.display = "none"
33
- }
34
-
35
- return true;
36
- }
37
-
38
- // Make codeblocks hidden by default
39
- document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
40
-
41
- // ]]>
42
- </script>
43
-
44
- </head>
45
- <body>
46
-
47
-
48
-
49
- <div id="classHeader">
50
- <table class="header-table">
51
- <tr class="top-aligned-row">
52
- <td><strong>Class</strong></td>
53
- <td class="class-name-in-header">Slave</td>
54
- </tr>
55
- <tr class="top-aligned-row">
56
- <td><strong>In:</strong></td>
57
- <td>
58
- <a href="../files/lib/slave_rb.html">
59
- lib/slave.rb
60
- </a>
61
- <br />
62
- </td>
63
- </tr>
64
-
65
- <tr class="top-aligned-row">
66
- <td><strong>Parent:</strong></td>
67
- <td>
68
- Object
69
- </td>
70
- </tr>
71
- </table>
72
- </div>
73
- <!-- banner header -->
74
-
75
- <div id="bodyContent">
76
-
77
-
78
-
79
- <div id="contextContent">
80
- <div id="diagram">
81
- <map id="map" name="map">
82
- <area shape="rect" coords="27,50,99,98" href="Slave.html" alt="Slave" />
83
- </map>
84
- <img src="../dot/f_1.jpg" usemap="#map" border="0" alt="dot/f_1.jpg">
85
- </div>
86
-
87
- <div id="description">
88
- <p>
89
- the <a href="Slave.html">Slave</a> class encapsulates the work of setting
90
- up a drb server in another process running on localhost via unix domain
91
- sockets. the slave process is attached to it&#8216;s parent via a <a
92
- href="Slave/LifeLine.html">LifeLine</a> which is designed such that the
93
- slave cannot out-live it&#8216;s parent and become a zombie, even if the
94
- parent dies and early death, such as by &#8216;kill -9&#8217;. the concept
95
- and purpose of the <a href="Slave.html">Slave</a> class is to be able to
96
- setup any server <a href="Slave.html#M000015">object</a> in another process
97
- so easily that using a multi-process, drb/ipc, based design is as easy, or
98
- easier, than a multi-threaded one. eg
99
- </p>
100
- <pre>
101
- class Server
102
- def add_two n
103
- n + 2
104
- end
105
- end
106
-
107
- slave = Slave.new 'object' =&gt; Server.new
108
- server = slave.object
109
-
110
- p server.add_two(40) #=&gt; 42
111
- </pre>
112
- <p>
113
- two other methods of providing server objects exist:
114
- </p>
115
- <p>
116
- a) server = Server.new &quot;this is called the parent&quot; }
117
- </p>
118
- <pre>
119
- Slave.new(:object=&gt;server){|s| puts &quot;#{ s.inspect } passed to block in child process&quot;}
120
- </pre>
121
- <p>
122
- b) <a href="Slave.html#M000005">Slave.new</a>{ Server.new &quot;this is
123
- called only in the child&quot; }
124
- </p>
125
- <p>
126
- of the two &#8216;b&#8217; is preferred.
127
- </p>
128
-
129
- </div>
130
-
131
-
132
- </div>
133
-
134
- <div id="method-list">
135
- <h3 class="section-bar">Methods</h3>
136
-
137
- <div class="name-list">
138
- <a href="#M000012">default</a>&nbsp;&nbsp;
139
- <a href="#M000002">default</a>&nbsp;&nbsp;
140
- <a href="#M000006">detach</a>&nbsp;&nbsp;
141
- <a href="#M000004">fork</a>&nbsp;&nbsp;
142
- <a href="#M000011">gen_psname</a>&nbsp;&nbsp;
143
- <a href="#M000003">getopts</a>&nbsp;&nbsp;
144
- <a href="#M000013">getopts</a>&nbsp;&nbsp;
145
- <a href="#M000005">new</a>&nbsp;&nbsp;
146
- <a href="#M000015">object</a>&nbsp;&nbsp;
147
- <a href="#M000009">shutdown</a>&nbsp;&nbsp;
148
- <a href="#M000010">shutdown?</a>&nbsp;&nbsp;
149
- <a href="#M000014">trace</a>&nbsp;&nbsp;
150
- <a href="#M000001">version</a>&nbsp;&nbsp;
151
- <a href="#M000007">wait</a>&nbsp;&nbsp;
152
- <a href="#M000008">wait2</a>&nbsp;&nbsp;
153
- </div>
154
- </div>
155
-
156
- </div>
157
-
158
-
159
- <!-- if includes -->
160
-
161
- <div id="section">
162
-
163
- <div id="class-list">
164
- <h3 class="section-bar">Classes and Modules</h3>
165
-
166
- Class <a href="Slave/LifeLine.html" class="link">Slave::LifeLine</a><br />
167
- Class <a href="Slave/ThreadSafe.html" class="link">Slave::ThreadSafe</a><br />
168
- Class <a href="Slave/ThreadSafeHash.html" class="link">Slave::ThreadSafeHash</a><br />
169
-
170
- </div>
171
-
172
- <div id="constants-list">
173
- <h3 class="section-bar">Constants</h3>
174
-
175
- <div class="name-list">
176
- <table summary="Constants">
177
- <tr class="top-aligned-row context-row">
178
- <td class="context-item-name">VERSION</td>
179
- <td>=</td>
180
- <td class="context-item-value">'1.2.1'</td>
181
- </tr>
182
- <tr class="top-aligned-row context-row">
183
- <td class="context-item-name">DEFAULT_SOCKET_CREATION_ATTEMPTS</td>
184
- <td>=</td>
185
- <td class="context-item-value">Integer(ENV['SLAVE_SOCKET_CREATION_ATTEMPTS'] || 42)</td>
186
- <td width="3em">&nbsp;</td>
187
- <td class="context-item-desc">
188
- env config
189
-
190
- </td>
191
- </tr>
192
- <tr class="top-aligned-row context-row">
193
- <td class="context-item-name">DEFAULT_DEBUG</td>
194
- <td>=</td>
195
- <td class="context-item-value">(ENV['SLAVE_DEBUG'] ? true : false)</td>
196
- </tr>
197
- <tr class="top-aligned-row context-row">
198
- <td class="context-item-name">DEFAULT_THREADSAFE</td>
199
- <td>=</td>
200
- <td class="context-item-value">(ENV['SLAVE_THREADSAFE'] ? true : false)</td>
201
- </tr>
202
- </table>
203
- </div>
204
- </div>
205
-
206
-
207
-
208
- <div id="attribute-list">
209
- <h3 class="section-bar">Attributes</h3>
210
-
211
- <div class="name-list">
212
- <table>
213
- <tr class="top-aligned-row context-row">
214
- <td class="context-item-name">at_exit</td>
215
- <td class="context-item-value">&nbsp;[R]&nbsp;</td>
216
- <td class="context-item-desc"></td>
217
- </tr>
218
- <tr class="top-aligned-row context-row">
219
- <td class="context-item-name">debug</td>
220
- <td class="context-item-value">&nbsp;[RW]&nbsp;</td>
221
- <td class="context-item-desc">
222
- if this is true and you are running from a terminal information is printed
223
- on STDERR
224
-
225
- </td>
226
- </tr>
227
- <tr class="top-aligned-row context-row">
228
- <td class="context-item-name">debug</td>
229
- <td class="context-item-value">&nbsp;[R]&nbsp;</td>
230
- <td class="context-item-desc"></td>
231
- </tr>
232
- <tr class="top-aligned-row context-row">
233
- <td class="context-item-name">dumped</td>
234
- <td class="context-item-value">&nbsp;[R]&nbsp;</td>
235
- <td class="context-item-desc"></td>
236
- </tr>
237
- <tr class="top-aligned-row context-row">
238
- <td class="context-item-name">obj</td>
239
- <td class="context-item-value">&nbsp;[R]&nbsp;</td>
240
- <td class="context-item-desc">
241
- attrs
242
-
243
- </td>
244
- </tr>
245
- <tr class="top-aligned-row context-row">
246
- <td class="context-item-name">object</td>
247
- <td class="context-item-value">&nbsp;[R]&nbsp;</td>
248
- <td class="context-item-desc"></td>
249
- </tr>
250
- <tr class="top-aligned-row context-row">
251
- <td class="context-item-name">pid</td>
252
- <td class="context-item-value">&nbsp;[R]&nbsp;</td>
253
- <td class="context-item-desc"></td>
254
- </tr>
255
- <tr class="top-aligned-row context-row">
256
- <td class="context-item-name">ppid</td>
257
- <td class="context-item-value">&nbsp;[R]&nbsp;</td>
258
- <td class="context-item-desc"></td>
259
- </tr>
260
- <tr class="top-aligned-row context-row">
261
- <td class="context-item-name">psname</td>
262
- <td class="context-item-value">&nbsp;[R]&nbsp;</td>
263
- <td class="context-item-desc"></td>
264
- </tr>
265
- <tr class="top-aligned-row context-row">
266
- <td class="context-item-name">socket</td>
267
- <td class="context-item-value">&nbsp;[R]&nbsp;</td>
268
- <td class="context-item-desc"></td>
269
- </tr>
270
- <tr class="top-aligned-row context-row">
271
- <td class="context-item-name">socket_creation_attempts</td>
272
- <td class="context-item-value">&nbsp;[RW]&nbsp;</td>
273
- <td class="context-item-desc"></td>
274
- </tr>
275
- <tr class="top-aligned-row context-row">
276
- <td class="context-item-name">socket_creation_attempts</td>
277
- <td class="context-item-value">&nbsp;[R]&nbsp;</td>
278
- <td class="context-item-desc"></td>
279
- </tr>
280
- <tr class="top-aligned-row context-row">
281
- <td class="context-item-name">status</td>
282
- <td class="context-item-value">&nbsp;[R]&nbsp;</td>
283
- <td class="context-item-desc"></td>
284
- </tr>
285
- <tr class="top-aligned-row context-row">
286
- <td class="context-item-name">threadsafe</td>
287
- <td class="context-item-value">&nbsp;[RW]&nbsp;</td>
288
- <td class="context-item-desc">
289
- if this is true all slave objects will be wrapped such that any call to the
290
- <a href="Slave.html#M000015">object</a> is threadsafe. if you do not use
291
- this you must ensure that your objects are threadsafe <em>yourself</em> as
292
- this is required of any <a href="Slave.html#M000015">object</a> acting as a
293
- drb server
294
-
295
- </td>
296
- </tr>
297
- <tr class="top-aligned-row context-row">
298
- <td class="context-item-name">uri</td>
299
- <td class="context-item-value">&nbsp;[R]&nbsp;</td>
300
- <td class="context-item-desc"></td>
301
- </tr>
302
- </table>
303
- </div>
304
- </div>
305
-
306
-
307
-
308
- <!-- if method_list -->
309
- <div id="methods">
310
- <h3 class="section-bar">Public Class methods</h3>
311
-
312
- <div id="method-M000002" class="method-detail">
313
- <a name="M000002"></a>
314
-
315
- <div class="method-heading">
316
- <a href="#M000002" class="method-signature">
317
- <span class="method-name">default</span><span class="method-args">(key)</span>
318
- </a>
319
- </div>
320
-
321
- <div class="method-description">
322
- <p>
323
- get a <a href="Slave.html#M000002">default</a> value
324
- </p>
325
- <p><a class="source-toggle" href="#"
326
- onclick="toggleCode('M000002-source');return false;">[Source]</a></p>
327
- <div class="method-source-code" id="M000002-source">
328
- <pre>
329
- <span class="ruby-comment cmt"># File lib/slave.rb, line 77</span>
330
- 77: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">default</span> <span class="ruby-identifier">key</span>
331
- 78: <span class="ruby-comment cmt">#--{{{</span>
332
- 79: <span class="ruby-identifier">send</span> <span class="ruby-identifier">key</span>
333
- 80: <span class="ruby-comment cmt">#--}}}</span>
334
- 81: <span class="ruby-keyword kw">end</span>
335
- </pre>
336
- </div>
337
- </div>
338
- </div>
339
-
340
- <div id="method-M000004" class="method-detail">
341
- <a name="M000004"></a>
342
-
343
- <div class="method-heading">
344
- <a href="#M000004" class="method-signature">
345
- <span class="method-name">fork</span><span class="method-args">(&amp;b)</span>
346
- </a>
347
- </div>
348
-
349
- <div class="method-description">
350
- <p>
351
- just <a href="Slave.html#M000004">fork</a> with out silly warnings
352
- </p>
353
- <p><a class="source-toggle" href="#"
354
- onclick="toggleCode('M000004-source');return false;">[Source]</a></p>
355
- <div class="method-source-code" id="M000004-source">
356
- <pre>
357
- <span class="ruby-comment cmt"># File lib/slave.rb, line 98</span>
358
- 98: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">fork</span> <span class="ruby-operator">&amp;</span><span class="ruby-identifier">b</span>
359
- 99: <span class="ruby-comment cmt">#--{{{</span>
360
- 100: <span class="ruby-identifier">v</span> = <span class="ruby-identifier">$VERBOSE</span>
361
- 101: <span class="ruby-keyword kw">begin</span>
362
- 102: <span class="ruby-identifier">$VERBOSE</span> = <span class="ruby-keyword kw">nil</span>
363
- 103: <span class="ruby-constant">Process</span><span class="ruby-operator">::</span><span class="ruby-identifier">fork</span>(<span class="ruby-operator">&amp;</span><span class="ruby-identifier">b</span>)
364
- 104: <span class="ruby-keyword kw">ensure</span>
365
- 105: <span class="ruby-identifier">$VERBOSE</span> = <span class="ruby-identifier">v</span>
366
- 106: <span class="ruby-keyword kw">end</span>
367
- 107: <span class="ruby-comment cmt">#--}}}</span>
368
- 108: <span class="ruby-keyword kw">end</span>
369
- </pre>
370
- </div>
371
- </div>
372
- </div>
373
-
374
- <div id="method-M000003" class="method-detail">
375
- <a name="M000003"></a>
376
-
377
- <div class="method-heading">
378
- <a href="#M000003" class="method-signature">
379
- <span class="method-name">getopts</span><span class="method-args">(opts)</span>
380
- </a>
381
- </div>
382
-
383
- <div class="method-description">
384
- <p><a class="source-toggle" href="#"
385
- onclick="toggleCode('M000003-source');return false;">[Source]</a></p>
386
- <div class="method-source-code" id="M000003-source">
387
- <pre>
388
- <span class="ruby-comment cmt"># File lib/slave.rb, line 83</span>
389
- 83: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">getopts</span> <span class="ruby-identifier">opts</span>
390
- 84: <span class="ruby-comment cmt">#--{{{</span>
391
- 85: <span class="ruby-identifier">raise</span> <span class="ruby-constant">ArgumentError</span>, <span class="ruby-identifier">opts</span>.<span class="ruby-identifier">class</span> <span class="ruby-keyword kw">unless</span>
392
- 86: <span class="ruby-identifier">opts</span>.<span class="ruby-identifier">respond_to?</span>(<span class="ruby-value str">'has_key?'</span>) <span class="ruby-keyword kw">and</span> <span class="ruby-identifier">opts</span>.<span class="ruby-identifier">respond_to?</span>(<span class="ruby-value str">'[]'</span>)
393
- 87:
394
- 88: <span class="ruby-identifier">lambda</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">key</span>, <span class="ruby-operator">*</span><span class="ruby-identifier">defval</span><span class="ruby-operator">|</span>
395
- 89: <span class="ruby-identifier">defval</span> = <span class="ruby-identifier">defval</span>.<span class="ruby-identifier">shift</span>
396
- 90: <span class="ruby-identifier">keys</span> = [<span class="ruby-identifier">key</span>, <span class="ruby-identifier">key</span>.<span class="ruby-identifier">to_s</span>, <span class="ruby-identifier">key</span>.<span class="ruby-identifier">to_s</span>.<span class="ruby-identifier">intern</span>]
397
- 91: <span class="ruby-identifier">key</span> = <span class="ruby-identifier">keys</span>.<span class="ruby-identifier">detect</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">k</span><span class="ruby-operator">|</span> <span class="ruby-identifier">opts</span>.<span class="ruby-identifier">has_key?</span> <span class="ruby-identifier">k</span> } <span class="ruby-keyword kw">and</span> <span class="ruby-keyword kw">break</span> <span class="ruby-identifier">opts</span>[<span class="ruby-identifier">key</span>]
398
- 92: <span class="ruby-identifier">defval</span>
399
- 93: <span class="ruby-keyword kw">end</span>
400
- 94: <span class="ruby-comment cmt">#--}}}</span>
401
- 95: <span class="ruby-keyword kw">end</span>
402
- </pre>
403
- </div>
404
- </div>
405
- </div>
406
-
407
- <div id="method-M000005" class="method-detail">
408
- <a name="M000005"></a>
409
-
410
- <div class="method-heading">
411
- <a href="#M000005" class="method-signature">
412
- <span class="method-name">new</span><span class="method-args">(opts = {})</span>
413
- </a>
414
- </div>
415
-
416
- <div class="method-description">
417
- <p>
418
- sets up a child process serving any <a href="Slave.html#M000015">object</a>
419
- as a DRb server running locally on unix domain sockets. the child process
420
- has a <a href="Slave/LifeLine.html">LifeLine</a> established between it and
421
- the parent, making it impossible for the child to outlive the parent
422
- (become a zombie). the <a href="Slave.html#M000015">object</a> to serve is
423
- specfied either directly using the &#8216;<a
424
- href="Slave.html#M000015">object</a>&#8217;/:<a
425
- href="Slave.html#M000015">object</a> keyword
426
- </p>
427
- <pre>
428
- Slave.new :object =&gt; MyServer.new
429
- </pre>
430
- <p>
431
- or, preferably, using the block form
432
- </p>
433
- <pre>
434
- Slave.new{ MyServer.new }
435
- </pre>
436
- <p>
437
- when the block form is used the <a href="Slave.html#M000015">object</a> is
438
- contructed in the child process itself. this is quite advantageous if the
439
- child <a href="Slave.html#M000015">object</a> consumes resources or opens
440
- file handles (db connections, etc). by contructing the <a
441
- href="Slave.html#M000015">object</a> in the child any resources are
442
- consumed from the child&#8216;s address space and things like open file
443
- handles will not be carried into subsequent child processes (via standard
444
- unix <a href="Slave.html#M000004">fork</a> semantics). in the event that a
445
- block is specified but the <a href="Slave.html#M000015">object</a> cannot
446
- be constructed and, instead, throws and Exception, that exception will be
447
- propogated to the parent process.
448
- </p>
449
- <p>
450
- opts may contain the following keys, as either strings or symbols
451
- </p>
452
- <pre>
453
- object : specify the slave object. otherwise block value is used.
454
- socket_creation_attempts : specify how many attempts to create a unix domain socket will be made
455
- debug : turn on some logging to STDERR
456
- psname : specify the name that will appear in 'top' ($0)
457
- at_exit : specify a lambda to be called in the *parent* when the child dies
458
- dumped : specify that the slave object should *not* be DRbUndumped (default is DRbUndumped)
459
- threadsafe : wrap the slave object with ThreadSafe to implement gross thread safety
460
- </pre>
461
- <p><a class="source-toggle" href="#"
462
- onclick="toggleCode('M000005-source');return false;">[Source]</a></p>
463
- <div class="method-source-code" id="M000005-source">
464
- <pre>
465
- <span class="ruby-comment cmt"># File lib/slave.rb, line 319</span>
466
- 319: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span> <span class="ruby-identifier">opts</span> = {}, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">block</span>
467
- 320: <span class="ruby-comment cmt">#--{{{</span>
468
- 321: <span class="ruby-identifier">getopt</span> = <span class="ruby-identifier">getopts</span> <span class="ruby-identifier">opts</span>
469
- 322:
470
- 323: <span class="ruby-ivar">@obj</span> = <span class="ruby-identifier">getopt</span>[<span class="ruby-value str">'object'</span>]
471
- 324: <span class="ruby-ivar">@socket_creation_attempts</span> = <span class="ruby-identifier">getopt</span>[<span class="ruby-value str">'socket_creation_attempts'</span>] <span class="ruby-operator">||</span> <span class="ruby-identifier">default</span>(<span class="ruby-value str">'socket_creation_attempts'</span>)
472
- 325: <span class="ruby-ivar">@debug</span> = <span class="ruby-identifier">getopt</span>[<span class="ruby-value str">'debug'</span>] <span class="ruby-operator">||</span> <span class="ruby-identifier">default</span>(<span class="ruby-value str">'debug'</span>)
473
- 326: <span class="ruby-ivar">@psname</span> = <span class="ruby-identifier">getopt</span>[<span class="ruby-value str">'psname'</span>]
474
- 327: <span class="ruby-ivar">@at_exit</span> = <span class="ruby-identifier">getopt</span>[<span class="ruby-value str">'at_exit'</span>]
475
- 328: <span class="ruby-ivar">@dumped</span> = <span class="ruby-identifier">getopt</span>[<span class="ruby-value str">'dumped'</span>]
476
- 329: <span class="ruby-ivar">@threadsafe</span> = <span class="ruby-identifier">getopt</span>[<span class="ruby-value str">'threadsafe'</span>] <span class="ruby-operator">||</span> <span class="ruby-identifier">default</span>(<span class="ruby-value str">'threadsafe'</span>)
477
- 330:
478
- 331: <span class="ruby-identifier">raise</span> <span class="ruby-constant">ArgumentError</span>, <span class="ruby-value str">'no slave object or slave object block provided!'</span> <span class="ruby-keyword kw">if</span>
479
- 332: <span class="ruby-ivar">@obj</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-keyword kw">and</span> <span class="ruby-identifier">block</span>.<span class="ruby-identifier">nil?</span>
480
- 333:
481
- 334: <span class="ruby-ivar">@shutdown</span> = <span class="ruby-keyword kw">false</span>
482
- 335: <span class="ruby-ivar">@waiter</span> = <span class="ruby-ivar">@status</span> = <span class="ruby-keyword kw">nil</span>
483
- 336: <span class="ruby-ivar">@lifeline</span> = <span class="ruby-constant">LifeLine</span>.<span class="ruby-identifier">new</span>
484
- 337:
485
- 338: <span class="ruby-comment cmt"># weird syntax because dot/rdoc chokes on this!?!?</span>
486
- 339: <span class="ruby-identifier">init_failure</span> = <span class="ruby-identifier">lambda</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">e</span><span class="ruby-operator">|</span>
487
- 340: <span class="ruby-identifier">trace</span>{ <span class="ruby-node">%Q[#{ e.message } (#{ e.class })\n#{ e.backtrace.join &quot;\n&quot; }]</span> }
488
- 341: <span class="ruby-identifier">o</span> = <span class="ruby-constant">Object</span>.<span class="ruby-identifier">new</span>
489
- 342: <span class="ruby-keyword kw">class</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">o</span>
490
- 343: <span class="ruby-identifier">attr_accessor</span> <span class="ruby-value str">'__slave_object_failure__'</span>
491
- 344: <span class="ruby-keyword kw">end</span>
492
- 345: <span class="ruby-identifier">o</span>.<span class="ruby-identifier">__slave_object_failure__</span> = <span class="ruby-constant">Marshal</span>.<span class="ruby-identifier">dump</span> [<span class="ruby-identifier">e</span>.<span class="ruby-identifier">class</span>, <span class="ruby-identifier">e</span>.<span class="ruby-identifier">message</span>, <span class="ruby-identifier">e</span>.<span class="ruby-identifier">backtrace</span>]
493
- 346: <span class="ruby-ivar">@object</span> = <span class="ruby-identifier">o</span>
494
- 347: <span class="ruby-keyword kw">end</span>
495
- 348:
496
- 349: <span class="ruby-comment cmt">#</span>
497
- 350: <span class="ruby-comment cmt"># child</span>
498
- 351: <span class="ruby-comment cmt">#</span>
499
- 352: <span class="ruby-keyword kw">unless</span>((<span class="ruby-ivar">@pid</span> = <span class="ruby-constant">Slave</span><span class="ruby-operator">::</span><span class="ruby-identifier">fork</span>))
500
- 353: <span class="ruby-identifier">e</span> = <span class="ruby-keyword kw">nil</span>
501
- 354: <span class="ruby-keyword kw">begin</span>
502
- 355: <span class="ruby-constant">Kernel</span>.<span class="ruby-identifier">at_exit</span>{ <span class="ruby-constant">Kernel</span>.<span class="ruby-identifier">exit!</span> }
503
- 356: <span class="ruby-ivar">@lifeline</span>.<span class="ruby-identifier">catch</span>
504
- 357:
505
- 358: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@obj</span>
506
- 359: <span class="ruby-ivar">@object</span> = <span class="ruby-ivar">@obj</span>
507
- 360: <span class="ruby-keyword kw">else</span>
508
- 361: <span class="ruby-keyword kw">begin</span>
509
- 362: <span class="ruby-ivar">@object</span> = <span class="ruby-identifier">block</span>.<span class="ruby-identifier">call</span>
510
- 363: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Exception</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">e</span>
511
- 364: <span class="ruby-identifier">init_failure</span>[<span class="ruby-identifier">e</span>]
512
- 365: <span class="ruby-keyword kw">end</span>
513
- 366: <span class="ruby-keyword kw">end</span>
514
- 367:
515
- 368: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">block</span> <span class="ruby-keyword kw">and</span> <span class="ruby-ivar">@obj</span>
516
- 369: <span class="ruby-keyword kw">begin</span>
517
- 370: <span class="ruby-identifier">block</span>[<span class="ruby-ivar">@obj</span>]
518
- 371: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Exception</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">e</span>
519
- 372: <span class="ruby-identifier">init_failure</span>[<span class="ruby-identifier">e</span>]
520
- 373: <span class="ruby-keyword kw">end</span>
521
- 374: <span class="ruby-keyword kw">end</span>
522
- 375:
523
- 376: <span class="ruby-identifier">$0</span> = (<span class="ruby-ivar">@psname</span> <span class="ruby-operator">||=</span> <span class="ruby-identifier">gen_psname</span>(<span class="ruby-ivar">@object</span>))
524
- 377:
525
- 378: <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@dumped</span> <span class="ruby-keyword kw">or</span> <span class="ruby-ivar">@object</span>.<span class="ruby-identifier">respond_to?</span>(<span class="ruby-value str">'__slave_object_failure__'</span>)
526
- 379: <span class="ruby-ivar">@object</span>.<span class="ruby-identifier">extend</span> <span class="ruby-constant">DRbUndumped</span>
527
- 380: <span class="ruby-keyword kw">end</span>
528
- 381:
529
- 382: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@threadsafe</span>
530
- 383: <span class="ruby-ivar">@object</span> = <span class="ruby-constant">ThreadSafe</span>.<span class="ruby-identifier">new</span> <span class="ruby-ivar">@object</span>
531
- 384: <span class="ruby-keyword kw">end</span>
532
- 385:
533
- 386: <span class="ruby-ivar">@ppid</span>, <span class="ruby-ivar">@pid</span> = <span class="ruby-constant">Process</span><span class="ruby-operator">::</span><span class="ruby-identifier">ppid</span>, <span class="ruby-constant">Process</span><span class="ruby-operator">::</span><span class="ruby-identifier">pid</span>
534
- 387: <span class="ruby-ivar">@socket</span> = <span class="ruby-keyword kw">nil</span>
535
- 388: <span class="ruby-ivar">@uri</span> = <span class="ruby-keyword kw">nil</span>
536
- 389:
537
- 390: <span class="ruby-identifier">tmpdir</span>, <span class="ruby-identifier">basename</span> = <span class="ruby-constant">Dir</span><span class="ruby-operator">::</span><span class="ruby-identifier">tmpdir</span>, <span class="ruby-constant">File</span><span class="ruby-operator">::</span><span class="ruby-identifier">basename</span>(<span class="ruby-ivar">@psname</span>)
538
- 391:
539
- 392: <span class="ruby-ivar">@socket_creation_attempts</span>.<span class="ruby-identifier">times</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">attempt</span><span class="ruby-operator">|</span>
540
- 393: <span class="ruby-identifier">se</span> = <span class="ruby-keyword kw">nil</span>
541
- 394: <span class="ruby-keyword kw">begin</span>
542
- 395: <span class="ruby-identifier">s</span> = <span class="ruby-constant">File</span><span class="ruby-operator">::</span><span class="ruby-identifier">join</span>(<span class="ruby-identifier">tmpdir</span>, <span class="ruby-node">&quot;#{ basename }_#{ attempt }_#{ rand }&quot;</span>)
543
- 396: <span class="ruby-identifier">u</span> = <span class="ruby-node">&quot;drbunix://#{ s }&quot;</span>
544
- 397: <span class="ruby-constant">DRb</span><span class="ruby-operator">::</span><span class="ruby-identifier">start_service</span> <span class="ruby-identifier">u</span>, <span class="ruby-ivar">@object</span>
545
- 398: <span class="ruby-ivar">@socket</span> = <span class="ruby-identifier">s</span>
546
- 399: <span class="ruby-ivar">@uri</span> = <span class="ruby-identifier">u</span>
547
- 400: <span class="ruby-identifier">trace</span>{ <span class="ruby-node">&quot;child - socket &lt;#{ @socket }&gt;&quot;</span> }
548
- 401: <span class="ruby-identifier">trace</span>{ <span class="ruby-node">&quot;child - uri &lt;#{ @uri }&gt;&quot;</span> }
549
- 402: <span class="ruby-keyword kw">break</span>
550
- 403: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Errno</span><span class="ruby-operator">::</span><span class="ruby-constant">EADDRINUSE</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">se</span>
551
- 404: <span class="ruby-keyword kw">nil</span>
552
- 405: <span class="ruby-keyword kw">end</span>
553
- 406: <span class="ruby-keyword kw">end</span>
554
- 407:
555
- 408: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@socket</span> <span class="ruby-keyword kw">and</span> <span class="ruby-ivar">@uri</span>
556
- 409: <span class="ruby-identifier">trap</span>(<span class="ruby-value str">'SIGUSR2'</span>) <span class="ruby-keyword kw">do</span>
557
- 410: <span class="ruby-constant">DBb</span><span class="ruby-operator">::</span><span class="ruby-identifier">thread</span>.<span class="ruby-identifier">kill</span> <span class="ruby-keyword kw">rescue</span> <span class="ruby-keyword kw">nil</span>
558
- 411: <span class="ruby-constant">FileUtils</span><span class="ruby-operator">::</span><span class="ruby-identifier">rm_f</span> <span class="ruby-ivar">@socket</span> <span class="ruby-keyword kw">rescue</span> <span class="ruby-keyword kw">nil</span>
559
- 412: <span class="ruby-identifier">exit</span>
560
- 413: <span class="ruby-keyword kw">end</span>
561
- 414:
562
- 415: <span class="ruby-ivar">@lifeline</span>.<span class="ruby-identifier">puts</span> <span class="ruby-ivar">@socket</span>
563
- 416: <span class="ruby-ivar">@lifeline</span>.<span class="ruby-identifier">cling</span>
564
- 417: <span class="ruby-keyword kw">else</span>
565
- 418: <span class="ruby-ivar">@lifeline</span>.<span class="ruby-identifier">release</span>
566
- 419: <span class="ruby-identifier">warn</span> <span class="ruby-node">&quot;slave(#{ $$ }) could not create socket!&quot;</span>
567
- 420: <span class="ruby-identifier">exit</span>
568
- 421: <span class="ruby-keyword kw">end</span>
569
- 422: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Exception</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">e</span>
570
- 423: <span class="ruby-identifier">trace</span>{ <span class="ruby-node">%Q[#{ e.message } (#{ e.class })\n#{ e.backtrace.join &quot;\n&quot; }]</span> }
571
- 424: <span class="ruby-keyword kw">ensure</span>
572
- 425: <span class="ruby-identifier">status</span> = <span class="ruby-identifier">e</span>.<span class="ruby-identifier">respond_to?</span>(<span class="ruby-value str">'status'</span>) <span class="ruby-operator">?</span> <span class="ruby-identifier">e</span>.<span class="ruby-identifier">status</span> <span class="ruby-operator">:</span> <span class="ruby-value">1</span>
573
- 426: <span class="ruby-identifier">exit</span>(<span class="ruby-identifier">status</span>)
574
- 427: <span class="ruby-keyword kw">end</span>
575
- 428: <span class="ruby-comment cmt">#</span>
576
- 429: <span class="ruby-comment cmt"># parent </span>
577
- 430: <span class="ruby-comment cmt">#</span>
578
- 431: <span class="ruby-keyword kw">else</span>
579
- 432: <span class="ruby-identifier">detach</span>
580
- 433: <span class="ruby-ivar">@lifeline</span>.<span class="ruby-identifier">throw</span>
581
- 434:
582
- 435: <span class="ruby-identifier">buf</span> = <span class="ruby-ivar">@lifeline</span>.<span class="ruby-identifier">gets</span>
583
- 436: <span class="ruby-identifier">raise</span> <span class="ruby-value str">&quot;failed to find slave socket&quot;</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">buf</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-keyword kw">or</span> <span class="ruby-identifier">buf</span>.<span class="ruby-identifier">strip</span>.<span class="ruby-identifier">empty?</span>
584
- 437: <span class="ruby-ivar">@socket</span> = <span class="ruby-identifier">buf</span>.<span class="ruby-identifier">strip</span>
585
- 438: <span class="ruby-identifier">trace</span>{ <span class="ruby-node">&quot;parent - socket &lt;#{ @socket }&gt;&quot;</span> }
586
- 439:
587
- 440: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@at_exit</span>
588
- 441: <span class="ruby-ivar">@at_exit_thread</span> = <span class="ruby-ivar">@lifeline</span>.<span class="ruby-identifier">on_cut</span>{
589
- 442: <span class="ruby-ivar">@at_exit</span>.<span class="ruby-identifier">respond_to?</span>(<span class="ruby-value str">'call'</span>) <span class="ruby-operator">?</span> <span class="ruby-ivar">@at_exit</span>.<span class="ruby-identifier">call</span>(<span class="ruby-keyword kw">self</span>) <span class="ruby-operator">:</span> <span class="ruby-identifier">send</span>(<span class="ruby-ivar">@at_exit</span>.<span class="ruby-identifier">to_s</span>, <span class="ruby-keyword kw">self</span>)
590
- 443: }
591
- 444: <span class="ruby-keyword kw">end</span>
592
- 445:
593
- 446: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@socket</span> <span class="ruby-keyword kw">and</span> <span class="ruby-constant">File</span><span class="ruby-operator">::</span><span class="ruby-identifier">exist?</span> <span class="ruby-ivar">@socket</span>
594
- 447: <span class="ruby-constant">Kernel</span>.<span class="ruby-identifier">at_exit</span>{ <span class="ruby-constant">FileUtils</span><span class="ruby-operator">::</span><span class="ruby-identifier">rm_f</span> <span class="ruby-ivar">@socket</span> }
595
- 448: <span class="ruby-ivar">@uri</span> = <span class="ruby-node">&quot;drbunix://#{ socket }&quot;</span>
596
- 449: <span class="ruby-identifier">trace</span>{ <span class="ruby-node">&quot;parent - uri &lt;#{ @uri }&gt;&quot;</span> }
597
- 450: <span class="ruby-comment cmt">#</span>
598
- 451: <span class="ruby-comment cmt"># starting drb on localhost avoids dns lookups!</span>
599
- 452: <span class="ruby-comment cmt">#</span>
600
- 453: <span class="ruby-constant">DRb</span><span class="ruby-operator">::</span><span class="ruby-identifier">start_service</span>(<span class="ruby-value str">'druby://localhost:0'</span>, <span class="ruby-keyword kw">nil</span>) <span class="ruby-keyword kw">unless</span> <span class="ruby-constant">DRb</span><span class="ruby-operator">::</span><span class="ruby-identifier">thread</span>
601
- 454: <span class="ruby-ivar">@object</span> = <span class="ruby-constant">DRbObject</span><span class="ruby-operator">::</span><span class="ruby-identifier">new</span> <span class="ruby-keyword kw">nil</span>, <span class="ruby-ivar">@uri</span>
602
- 455: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@object</span>.<span class="ruby-identifier">respond_to?</span> <span class="ruby-value str">'__slave_object_failure__'</span>
603
- 456: <span class="ruby-identifier">c</span>, <span class="ruby-identifier">m</span>, <span class="ruby-identifier">bt</span> = <span class="ruby-constant">Marshal</span>.<span class="ruby-identifier">load</span> <span class="ruby-ivar">@object</span>.<span class="ruby-identifier">__slave_object_failure__</span>
604
- 457: (<span class="ruby-identifier">e</span> = <span class="ruby-identifier">c</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">m</span>)).<span class="ruby-identifier">set_backtrace</span> <span class="ruby-identifier">bt</span>
605
- 458: <span class="ruby-identifier">trace</span>{ <span class="ruby-node">%Q[#{ e.message } (#{ e.class })\n#{ e.backtrace.join &quot;\n&quot; }]</span> }
606
- 459: <span class="ruby-identifier">raise</span> <span class="ruby-identifier">e</span>
607
- 460: <span class="ruby-keyword kw">end</span>
608
- 461: <span class="ruby-ivar">@psname</span> <span class="ruby-operator">||=</span> <span class="ruby-identifier">gen_psname</span>(<span class="ruby-ivar">@object</span>)
609
- 462: <span class="ruby-keyword kw">else</span>
610
- 463: <span class="ruby-identifier">raise</span> <span class="ruby-node">&quot;failed to find slave socket &lt;#{ @socket }&gt;&quot;</span>
611
- 464: <span class="ruby-keyword kw">end</span>
612
- 465: <span class="ruby-keyword kw">end</span>
613
- 466: <span class="ruby-comment cmt">#--}}}</span>
614
- 467: <span class="ruby-keyword kw">end</span>
615
- </pre>
616
- </div>
617
- </div>
618
- </div>
619
-
620
- <div id="method-M000015" class="method-detail">
621
- <a name="M000015"></a>
622
-
623
- <div class="method-heading">
624
- <a href="#M000015" class="method-signature">
625
- <span class="method-name">object</span><span class="method-args">(opts = {})</span>
626
- </a>
627
- </div>
628
-
629
- <div class="method-description">
630
- <p>
631
- a simple convenience method which returns an <b><a
632
- href="Slave.html#M000015">object</a></b> from another process. the <a
633
- href="Slave.html#M000015">object</a> returned is the result of the supplied
634
- block. eg
635
- </p>
636
- <pre>
637
- object = Slave.object{ processor_intensive_object_built_in_child_process() }
638
- </pre>
639
- <p>
640
- eg.
641
- </p>
642
- <p>
643
- the call can be made asynchronous via the &#8216;async&#8217;/:async
644
- keyword
645
- </p>
646
- <pre>
647
- thread = Slave.object(:async=&gt;true){ long_processor_intensive_object_built_in_child_process() }
648
-
649
- # go on about your coding business then, later
650
-
651
- object = thread.value
652
- </pre>
653
- <p><a class="source-toggle" href="#"
654
- onclick="toggleCode('M000015-source');return false;">[Source]</a></p>
655
- <div class="method-source-code" id="M000015-source">
656
- <pre>
657
- <span class="ruby-comment cmt"># File lib/slave.rb, line 587</span>
658
- 587: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">object</span> <span class="ruby-identifier">opts</span> = {}, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">b</span>
659
- 588: <span class="ruby-comment cmt">#--{{{</span>
660
- 589: <span class="ruby-identifier">async</span> = <span class="ruby-identifier">opts</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-value str">'async'</span>) <span class="ruby-operator">||</span> <span class="ruby-identifier">opts</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-identifier">:async</span>)
661
- 590:
662
- 591: <span class="ruby-identifier">opts</span>[<span class="ruby-value str">'object'</span>] = <span class="ruby-identifier">opts</span>[<span class="ruby-identifier">:object</span>] = <span class="ruby-identifier">lambda</span>(<span class="ruby-operator">&amp;</span><span class="ruby-identifier">b</span>)
663
- 592: <span class="ruby-identifier">opts</span>[<span class="ruby-value str">'dumped'</span>] = <span class="ruby-identifier">opts</span>[<span class="ruby-identifier">:dumped</span>] = <span class="ruby-keyword kw">true</span>
664
- 593:
665
- 594: <span class="ruby-identifier">slave</span> = <span class="ruby-constant">Slave</span>.<span class="ruby-identifier">new</span> <span class="ruby-identifier">opts</span>
666
- 595:
667
- 596: <span class="ruby-identifier">value</span> = <span class="ruby-identifier">lambda</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">slave</span><span class="ruby-operator">|</span>
668
- 597: <span class="ruby-keyword kw">begin</span>
669
- 598: <span class="ruby-identifier">slave</span>.<span class="ruby-identifier">object</span>.<span class="ruby-identifier">call</span>
670
- 599: <span class="ruby-keyword kw">ensure</span>
671
- 600: <span class="ruby-identifier">slave</span>.<span class="ruby-identifier">shutdown</span>
672
- 601: <span class="ruby-keyword kw">end</span>
673
- 602: <span class="ruby-keyword kw">end</span>
674
- 603:
675
- 604: <span class="ruby-identifier">async</span> <span class="ruby-value">? </span><span class="ruby-constant">Thread</span>.<span class="ruby-identifier">new</span>{ <span class="ruby-identifier">value</span>[<span class="ruby-identifier">slave</span>] } <span class="ruby-operator">:</span> <span class="ruby-identifier">value</span>[<span class="ruby-identifier">slave</span>]
676
- 605: <span class="ruby-comment cmt">#--}}}</span>
677
- 606: <span class="ruby-keyword kw">end</span>
678
- </pre>
679
- </div>
680
- </div>
681
- </div>
682
-
683
- <div id="method-M000001" class="method-detail">
684
- <a name="M000001"></a>
685
-
686
- <div class="method-heading">
687
- <a href="#M000001" class="method-signature">
688
- <span class="method-name">version</span><span class="method-args">()</span>
689
- </a>
690
- </div>
691
-
692
- <div class="method-description">
693
- <p><a class="source-toggle" href="#"
694
- onclick="toggleCode('M000001-source');return false;">[Source]</a></p>
695
- <div class="method-source-code" id="M000001-source">
696
- <pre>
697
- <span class="ruby-comment cmt"># File lib/slave.rb, line 44</span>
698
- 44: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">version</span>() <span class="ruby-constant">VERSION</span> <span class="ruby-keyword kw">end</span>
699
- </pre>
700
- </div>
701
- </div>
702
- </div>
703
-
704
- <h3 class="section-bar">Public Instance methods</h3>
705
-
706
- <div id="method-M000012" class="method-detail">
707
- <a name="M000012"></a>
708
-
709
- <div class="method-heading">
710
- <a href="#M000012" class="method-signature">
711
- <span class="method-name">default</span><span class="method-args">(key)</span>
712
- </a>
713
- </div>
714
-
715
- <div class="method-description">
716
- <p>
717
- see docs for <a href="Slave.html#M000002">Slave.default</a>
718
- </p>
719
- <p><a class="source-toggle" href="#"
720
- onclick="toggleCode('M000012-source');return false;">[Source]</a></p>
721
- <div class="method-source-code" id="M000012-source">
722
- <pre>
723
- <span class="ruby-comment cmt"># File lib/slave.rb, line 546</span>
724
- 546: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">default</span> <span class="ruby-identifier">key</span>
725
- 547: <span class="ruby-comment cmt">#--{{{</span>
726
- 548: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">class</span>.<span class="ruby-identifier">default</span> <span class="ruby-identifier">key</span>
727
- 549: <span class="ruby-comment cmt">#--}}}</span>
728
- 550: <span class="ruby-keyword kw">end</span>
729
- </pre>
730
- </div>
731
- </div>
732
- </div>
733
-
734
- <div id="method-M000006" class="method-detail">
735
- <a name="M000006"></a>
736
-
737
- <div class="method-heading">
738
- <a href="#M000006" class="method-signature">
739
- <span class="method-name">detach</span><span class="method-args">()</span>
740
- </a>
741
- </div>
742
-
743
- <div class="method-description">
744
- <p>
745
- starts a thread to collect the child status and sets up at_exit handler to
746
- prevent zombies. the at_exit handler is canceled if the thread is able to
747
- collect the status
748
- </p>
749
- <p><a class="source-toggle" href="#"
750
- onclick="toggleCode('M000006-source');return false;">[Source]</a></p>
751
- <div class="method-source-code" id="M000006-source">
752
- <pre>
753
- <span class="ruby-comment cmt"># File lib/slave.rb, line 473</span>
754
- 473: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">detach</span>
755
- 474: <span class="ruby-comment cmt">#--{{{</span>
756
- 475: <span class="ruby-identifier">reap</span> = <span class="ruby-identifier">lambda</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">cid</span><span class="ruby-operator">|</span>
757
- 476: <span class="ruby-keyword kw">begin</span>
758
- 477: <span class="ruby-ivar">@status</span> = <span class="ruby-constant">Process</span><span class="ruby-operator">::</span><span class="ruby-identifier">waitpid2</span>(<span class="ruby-identifier">cid</span>).<span class="ruby-identifier">last</span>
759
- 478: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Exception</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">e</span>
760
- 479: <span class="ruby-identifier">m</span>, <span class="ruby-identifier">c</span>, <span class="ruby-identifier">b</span> = <span class="ruby-identifier">e</span>.<span class="ruby-identifier">message</span>, <span class="ruby-identifier">e</span>.<span class="ruby-identifier">class</span>, <span class="ruby-identifier">e</span>.<span class="ruby-identifier">backtrace</span>.<span class="ruby-identifier">join</span>(<span class="ruby-value str">&quot;\n&quot;</span>)
761
- 480: <span class="ruby-identifier">warn</span> <span class="ruby-node">&quot;#{ m } (#{ c })\n#{ b }&quot;</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">e</span>.<span class="ruby-identifier">is_a?</span> <span class="ruby-constant">Errno</span><span class="ruby-operator">::</span><span class="ruby-constant">ECHILD</span>
762
- 481: <span class="ruby-keyword kw">end</span>
763
- 482: <span class="ruby-keyword kw">end</span>
764
- 483:
765
- 484: <span class="ruby-constant">Kernel</span>.<span class="ruby-identifier">at_exit</span> <span class="ruby-keyword kw">do</span>
766
- 485: <span class="ruby-identifier">shutdown</span> <span class="ruby-keyword kw">rescue</span> <span class="ruby-keyword kw">nil</span>
767
- 486: <span class="ruby-identifier">reap</span>[<span class="ruby-ivar">@pid</span>] <span class="ruby-keyword kw">rescue</span> <span class="ruby-keyword kw">nil</span>
768
- 487: <span class="ruby-keyword kw">end</span>
769
- 488:
770
- 489: <span class="ruby-ivar">@waiter</span> =
771
- 490: <span class="ruby-constant">Thread</span>.<span class="ruby-identifier">new</span> <span class="ruby-keyword kw">do</span>
772
- 491: <span class="ruby-keyword kw">begin</span>
773
- 492: <span class="ruby-ivar">@status</span> = <span class="ruby-constant">Process</span><span class="ruby-operator">::</span><span class="ruby-identifier">waitpid2</span>(<span class="ruby-ivar">@pid</span>).<span class="ruby-identifier">last</span>
774
- 493: <span class="ruby-keyword kw">ensure</span>
775
- 494: <span class="ruby-identifier">reap</span> = <span class="ruby-identifier">lambda</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">cid</span><span class="ruby-operator">|</span> <span class="ruby-value str">'no-op'</span> }
776
- 495: <span class="ruby-keyword kw">end</span>
777
- 496: <span class="ruby-keyword kw">end</span>
778
- 497: <span class="ruby-comment cmt">#--}}}</span>
779
- 498: <span class="ruby-keyword kw">end</span>
780
- </pre>
781
- </div>
782
- </div>
783
- </div>
784
-
785
- <div id="method-M000011" class="method-detail">
786
- <a name="M000011"></a>
787
-
788
- <div class="method-heading">
789
- <a href="#M000011" class="method-signature">
790
- <span class="method-name">gen_psname</span><span class="method-args">(obj)</span>
791
- </a>
792
- </div>
793
-
794
- <div class="method-description">
795
- <p>
796
- generate a <a href="Slave.html#M000002">default</a> name to appear in
797
- ps/top
798
- </p>
799
- <p><a class="source-toggle" href="#"
800
- onclick="toggleCode('M000011-source');return false;">[Source]</a></p>
801
- <div class="method-source-code" id="M000011-source">
802
- <pre>
803
- <span class="ruby-comment cmt"># File lib/slave.rb, line 538</span>
804
- 538: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">gen_psname</span> <span class="ruby-identifier">obj</span>
805
- 539: <span class="ruby-comment cmt">#--{{{</span>
806
- 540: <span class="ruby-node">&quot;slave_#{ obj.class }_#{ obj.object_id }_#{ Process::ppid }_#{ Process::pid }&quot;</span>.<span class="ruby-identifier">downcase</span>.<span class="ruby-identifier">gsub</span>(<span class="ruby-regexp re">%r/\s+/</span>,<span class="ruby-value str">'_'</span>)
807
- 541: <span class="ruby-comment cmt">#--}}}</span>
808
- 542: <span class="ruby-keyword kw">end</span>
809
- </pre>
810
- </div>
811
- </div>
812
- </div>
813
-
814
- <div id="method-M000013" class="method-detail">
815
- <a name="M000013"></a>
816
-
817
- <div class="method-heading">
818
- <a href="#M000013" class="method-signature">
819
- <span class="method-name">getopts</span><span class="method-args">(opts)</span>
820
- </a>
821
- </div>
822
-
823
- <div class="method-description">
824
- <p>
825
- see docs for <a href="Slave.html#M000003">Slave.getopts</a>
826
- </p>
827
- <p><a class="source-toggle" href="#"
828
- onclick="toggleCode('M000013-source');return false;">[Source]</a></p>
829
- <div class="method-source-code" id="M000013-source">
830
- <pre>
831
- <span class="ruby-comment cmt"># File lib/slave.rb, line 554</span>
832
- 554: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">getopts</span> <span class="ruby-identifier">opts</span>
833
- 555: <span class="ruby-comment cmt">#--{{{</span>
834
- 556: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">class</span>.<span class="ruby-identifier">getopts</span> <span class="ruby-identifier">opts</span>
835
- 557: <span class="ruby-comment cmt">#--}}}</span>
836
- 558: <span class="ruby-keyword kw">end</span>
837
- </pre>
838
- </div>
839
- </div>
840
- </div>
841
-
842
- <div id="method-M000009" class="method-detail">
843
- <a name="M000009"></a>
844
-
845
- <div class="method-heading">
846
- <a href="#M000009" class="method-signature">
847
- <span class="method-name">shutdown</span><span class="method-args">(opts = {})</span>
848
- </a>
849
- </div>
850
-
851
- <div class="method-description">
852
- <p>
853
- cuts the lifeline and kills the child process - give the key
854
- &#8216;quiet&#8217; to ignore errors shutting down, including having
855
- already <a href="Slave.html#M000009">shutdown</a>
856
- </p>
857
- <p><a class="source-toggle" href="#"
858
- onclick="toggleCode('M000009-source');return false;">[Source]</a></p>
859
- <div class="method-source-code" id="M000009-source">
860
- <pre>
861
- <span class="ruby-comment cmt"># File lib/slave.rb, line 517</span>
862
- 517: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">shutdown</span> <span class="ruby-identifier">opts</span> = {}
863
- 518: <span class="ruby-comment cmt">#--{{{</span>
864
- 519: <span class="ruby-identifier">quiet</span> = <span class="ruby-identifier">getopts</span>(<span class="ruby-identifier">opts</span>)[<span class="ruby-value str">'quiet'</span>]
865
- 520: <span class="ruby-identifier">raise</span> <span class="ruby-value str">&quot;already shutdown&quot;</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@shutdown</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">quiet</span>
866
- 521: <span class="ruby-keyword kw">begin</span>; <span class="ruby-constant">Process</span><span class="ruby-operator">::</span><span class="ruby-identifier">kill</span> <span class="ruby-value str">'SIGUSR2'</span>, <span class="ruby-ivar">@pid</span>; <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Exception</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">e</span>; <span class="ruby-keyword kw">end</span>
867
- 522: <span class="ruby-keyword kw">begin</span>; <span class="ruby-ivar">@lifeline</span>.<span class="ruby-identifier">cut</span>; <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Exception</span>; <span class="ruby-keyword kw">end</span>
868
- 523: <span class="ruby-identifier">raise</span> <span class="ruby-identifier">e</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">e</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">quiet</span>
869
- 524: <span class="ruby-ivar">@shutdown</span> = <span class="ruby-keyword kw">true</span>
870
- 525: <span class="ruby-comment cmt">#--}}}</span>
871
- 526: <span class="ruby-keyword kw">end</span>
872
- </pre>
873
- </div>
874
- </div>
875
- </div>
876
-
877
- <div id="method-M000010" class="method-detail">
878
- <a name="M000010"></a>
879
-
880
- <div class="method-heading">
881
- <a href="#M000010" class="method-signature">
882
- <span class="method-name">shutdown?</span><span class="method-args">()</span>
883
- </a>
884
- </div>
885
-
886
- <div class="method-description">
887
- <p>
888
- true
889
- </p>
890
- <p><a class="source-toggle" href="#"
891
- onclick="toggleCode('M000010-source');return false;">[Source]</a></p>
892
- <div class="method-source-code" id="M000010-source">
893
- <pre>
894
- <span class="ruby-comment cmt"># File lib/slave.rb, line 530</span>
895
- 530: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">shutdown?</span>
896
- 531: <span class="ruby-comment cmt">#--{{{</span>
897
- 532: <span class="ruby-ivar">@shutdown</span>
898
- 533: <span class="ruby-comment cmt">#--}}}</span>
899
- 534: <span class="ruby-keyword kw">end</span>
900
- </pre>
901
- </div>
902
- </div>
903
- </div>
904
-
905
- <div id="method-M000014" class="method-detail">
906
- <a name="M000014"></a>
907
-
908
- <div class="method-heading">
909
- <a href="#M000014" class="method-signature">
910
- <span class="method-name">trace</span><span class="method-args">() {|| ...}</span>
911
- </a>
912
- </div>
913
-
914
- <div class="method-description">
915
- <p>
916
- debugging output - ENV[&#8216;SLAVE_DEBUG&#8217;]=1 to enable
917
- </p>
918
- <p><a class="source-toggle" href="#"
919
- onclick="toggleCode('M000014-source');return false;">[Source]</a></p>
920
- <div class="method-source-code" id="M000014-source">
921
- <pre>
922
- <span class="ruby-comment cmt"># File lib/slave.rb, line 562</span>
923
- 562: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">trace</span>
924
- 563: <span class="ruby-comment cmt">#--{{{</span>
925
- 564: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@debug</span>
926
- 565: <span class="ruby-constant">STDERR</span>.<span class="ruby-identifier">puts</span> <span class="ruby-keyword kw">yield</span>
927
- 566: <span class="ruby-constant">STDERR</span>.<span class="ruby-identifier">flush</span>
928
- 567: <span class="ruby-keyword kw">end</span>
929
- 568: <span class="ruby-comment cmt">#--}}}</span>
930
- 569: <span class="ruby-keyword kw">end</span>
931
- </pre>
932
- </div>
933
- </div>
934
- </div>
935
-
936
- <div id="method-M000007" class="method-detail">
937
- <a name="M000007"></a>
938
-
939
- <div class="method-heading">
940
- <a href="#M000007" class="method-signature">
941
- <span class="method-name">wait</span><span class="method-args">(opts = {})</span>
942
- </a>
943
- </div>
944
-
945
- <div class="method-description">
946
- <p>
947
- <a href="Slave.html#M000007">wait</a> for slave to finish. if the keyword
948
- &#8216;non_block&#8217;=&gt;true is given a thread is returned to do the
949
- waiting in an async fashion. eg
950
- </p>
951
- <pre>
952
- thread = slave.wait(:non_block=&gt;true){|value| &quot;background &lt;#{ value }&gt;&quot;}
953
- </pre>
954
- <p><a class="source-toggle" href="#"
955
- onclick="toggleCode('M000007-source');return false;">[Source]</a></p>
956
- <div class="method-source-code" id="M000007-source">
957
- <pre>
958
- <span class="ruby-comment cmt"># File lib/slave.rb, line 505</span>
959
- 505: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">wait</span> <span class="ruby-identifier">opts</span> = {}, <span class="ruby-operator">&amp;</span><span class="ruby-identifier">b</span>
960
- 506: <span class="ruby-comment cmt">#--{{{</span>
961
- 507: <span class="ruby-identifier">b</span> <span class="ruby-operator">||=</span> <span class="ruby-identifier">lambda</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">exit_status</span><span class="ruby-operator">|</span>}
962
- 508: <span class="ruby-identifier">non_block</span> = <span class="ruby-identifier">getopts</span>(<span class="ruby-identifier">opts</span>)[<span class="ruby-value str">'non_block'</span>]
963
- 509: <span class="ruby-identifier">non_block</span> <span class="ruby-value">? </span><span class="ruby-constant">Thread</span>.<span class="ruby-identifier">new</span>{ <span class="ruby-identifier">b</span>[ <span class="ruby-ivar">@waiter</span>.<span class="ruby-identifier">value</span> ] } <span class="ruby-operator">:</span> <span class="ruby-identifier">b</span>[ <span class="ruby-ivar">@waiter</span>.<span class="ruby-identifier">value</span> ]
964
- 510: <span class="ruby-comment cmt">#--}}}</span>
965
- 511: <span class="ruby-keyword kw">end</span>
966
- </pre>
967
- </div>
968
- </div>
969
- </div>
970
-
971
- <div id="method-M000008" class="method-detail">
972
- <a name="M000008"></a>
973
-
974
- <div class="method-heading">
975
- <span class="method-name">wait2</span><span class="method-args">(opts = {})</span>
976
- </div>
977
-
978
- <div class="method-description">
979
- <p>
980
- Alias for <a href="Slave.html#M000007">wait</a>
981
- </p>
982
- </div>
983
- </div>
984
-
985
-
986
- </div>
987
-
988
-
989
- </div>
990
-
991
-
992
- <div id="validator-badges">
993
- <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
994
- </div>
995
-
996
- </body>
997
- </html>