slave 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/README ADDED
@@ -0,0 +1,42 @@
1
+ the Slave class forks a process and starts a drb server in the child using any
2
+ object as the server. the process is detached so it is not required (nor
3
+ possible) to wait on the child pid. a Heartbeat is set up between the parent
4
+ and child processes so that the child will exit of the parent exits for any
5
+ reason - preventing orphaned slaves from running indefinitely. the purpose of
6
+ Slaves is to be able to easily set up a collection of objects communicating
7
+ via drb protocols instead of having to use IPC.
8
+
9
+ typical usage:
10
+
11
+ obj = AnyClass::new
12
+
13
+ slave = Slave::new obj
14
+
15
+ p slave.object # handle on drb object
16
+ p slave.uri # uri of the drb object
17
+ p slave.socket # unix domain socket path for drb object
18
+ p slave.psname # title shown in ps/top
19
+
20
+ other usage:
21
+
22
+ set the pulse_rate used for the Heartbeat
23
+
24
+ slave = Slave::new MyClass::new, 'pulse_rate' => 10
25
+
26
+ same
27
+
28
+ Slave::pulse_rate = 10
29
+ slave = Slave::new MyClass::new
30
+
31
+ same
32
+
33
+ ENV['SLAVE_PULSE_RATE'] = 10
34
+ slave = Slave::new MyClass::new
35
+
36
+ slaves may be configured via the environment, the Slave class, or via the ctor
37
+ for object itself. attributes which may be configured include
38
+
39
+ * socket_creation_attempts
40
+ * pulse_rate
41
+ * psname
42
+ * debug
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.0
@@ -0,0 +1,541 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
+ "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
+ <h1>Slave <sup class="type-note">(Class)</sup></h1>
51
+ <table class="header-table">
52
+ <tr class="top-aligned-row">
53
+ <td><strong>In:</strong></td>
54
+ <td>
55
+ <a href="../files/lib/slave_rb.html">
56
+ lib/slave.rb
57
+ </a>
58
+ <br />
59
+ </td>
60
+ </tr>
61
+
62
+ <tr class="top-aligned-row">
63
+ <td><strong>Parent:</strong></td>
64
+ <td>
65
+ Object
66
+ </td>
67
+ </tr>
68
+ </table>
69
+ </div>
70
+ <!-- banner header -->
71
+
72
+ <div id="bodyContent">
73
+
74
+
75
+ <div id="contextContent">
76
+ <div id="diagram">
77
+ <map name="map">
78
+ <area shape="RECT" coords="28,88,99,40" href="Slave.html" alt="Slave">
79
+ </map>
80
+ <img src="../dot/f_2.jpg" usemap="#map" border=0 alt="TopLevel">
81
+ </div>
82
+
83
+ <div id="description">
84
+ <p>
85
+ the <a href="Slave.html">Slave</a> class encapsulates the work of setting
86
+ up a drb server in another process.
87
+ </p>
88
+
89
+ </div>
90
+
91
+
92
+ <div id="method-list">
93
+ <h2 class="section-bar">Methods</h2>
94
+
95
+ <div class="name-list">
96
+ <a href="#M000002">fork</a>&nbsp;&nbsp;
97
+ <a href="#M000005">gen_psname</a>&nbsp;&nbsp;
98
+ <a href="#M000006">getval</a>&nbsp;&nbsp;
99
+ <a href="#M000001">getval</a>&nbsp;&nbsp;
100
+ <a href="#M000003">new</a>&nbsp;&nbsp;
101
+ <a href="#M000004">shutdown</a>&nbsp;&nbsp;
102
+ <a href="#M000007">trace</a>&nbsp;&nbsp;
103
+ </div>
104
+ </div>
105
+
106
+ <div id="constants-list">
107
+ <h2 class="section-bar">Constants</h2>
108
+
109
+ <div class="name-list">
110
+ <table summary="Constants">
111
+ <tr class="top-aligned-row context-row">
112
+ <td class="context-item-name">DEFAULT_SOCKET_CREATION_ATTEMPTS</td>
113
+ <td>=</td>
114
+ <td class="context-item-value">Integer(ENV['SLAVE_SOCKET_CREATION_ATTEMPTS'] || 42)</td>
115
+ </tr>
116
+ <tr class="top-aligned-row context-row">
117
+ <td class="context-item-name">DEFAULT_PULSE_RATE</td>
118
+ <td>=</td>
119
+ <td class="context-item-value">Float(ENV['SLAVE_PULSE_RATE'] || 8)</td>
120
+ </tr>
121
+ <tr class="top-aligned-row context-row">
122
+ <td class="context-item-name">DEFAULT_DEBUG</td>
123
+ <td>=</td>
124
+ <td class="context-item-value">(ENV['SLAVE_DEBUG'] ? true : false)</td>
125
+ </tr>
126
+ </table>
127
+ </div>
128
+ </div>
129
+
130
+
131
+
132
+ <div id="attribute-list">
133
+ <h2 class="section-bar">Attributes</h2>
134
+
135
+ <div class="name-list">
136
+ <table>
137
+ <tr class="top-aligned-row context-row">
138
+ <td class="context-item-name">debug</td>
139
+ <td class="context-item-value">&nbsp;[R]&nbsp;</td>
140
+ <td class="context-item-desc"></td>
141
+ </tr>
142
+ <tr class="top-aligned-row context-row">
143
+ <td class="context-item-name">debug</td>
144
+ <td class="context-item-value">&nbsp;[RW]&nbsp;</td>
145
+ <td class="context-item-desc">
146
+ if this is true and you are running from a terminal information is printed
147
+ on STDERR
148
+
149
+ </td>
150
+ </tr>
151
+ <tr class="top-aligned-row context-row">
152
+ <td class="context-item-name">obj</td>
153
+ <td class="context-item-value">&nbsp;[R]&nbsp;</td>
154
+ <td class="context-item-desc"></td>
155
+ </tr>
156
+ <tr class="top-aligned-row context-row">
157
+ <td class="context-item-name">object</td>
158
+ <td class="context-item-value">&nbsp;[R]&nbsp;</td>
159
+ <td class="context-item-desc"></td>
160
+ </tr>
161
+ <tr class="top-aligned-row context-row">
162
+ <td class="context-item-name">pid</td>
163
+ <td class="context-item-value">&nbsp;[R]&nbsp;</td>
164
+ <td class="context-item-desc"></td>
165
+ </tr>
166
+ <tr class="top-aligned-row context-row">
167
+ <td class="context-item-name">ppid</td>
168
+ <td class="context-item-value">&nbsp;[R]&nbsp;</td>
169
+ <td class="context-item-desc"></td>
170
+ </tr>
171
+ <tr class="top-aligned-row context-row">
172
+ <td class="context-item-name">psname</td>
173
+ <td class="context-item-value">&nbsp;[R]&nbsp;</td>
174
+ <td class="context-item-desc"></td>
175
+ </tr>
176
+ <tr class="top-aligned-row context-row">
177
+ <td class="context-item-name">pulse_rate</td>
178
+ <td class="context-item-value">&nbsp;[RW]&nbsp;</td>
179
+ <td class="context-item-desc">
180
+ defined the rate of pinging in the <a
181
+ href="Slave/Heartbeat.html">Heartbeat</a> object
182
+
183
+ </td>
184
+ </tr>
185
+ <tr class="top-aligned-row context-row">
186
+ <td class="context-item-name">pulse_rate</td>
187
+ <td class="context-item-value">&nbsp;[R]&nbsp;</td>
188
+ <td class="context-item-desc"></td>
189
+ </tr>
190
+ <tr class="top-aligned-row context-row">
191
+ <td class="context-item-name">socket</td>
192
+ <td class="context-item-value">&nbsp;[R]&nbsp;</td>
193
+ <td class="context-item-desc"></td>
194
+ </tr>
195
+ <tr class="top-aligned-row context-row">
196
+ <td class="context-item-name">socket_creation_attempts</td>
197
+ <td class="context-item-value">&nbsp;[RW]&nbsp;</td>
198
+ <td class="context-item-desc"></td>
199
+ </tr>
200
+ <tr class="top-aligned-row context-row">
201
+ <td class="context-item-name">uri</td>
202
+ <td class="context-item-value">&nbsp;[R]&nbsp;</td>
203
+ <td class="context-item-desc"></td>
204
+ </tr>
205
+ </table>
206
+ </div>
207
+ </div>
208
+
209
+ <div id="class-list">
210
+ <h2 class="section-bar">Classes and Modules</h2>
211
+
212
+ Class <a href="Slave/Heartbeat.html" class="link">Slave::Heartbeat</a><br />
213
+
214
+ </div>
215
+
216
+ </div>
217
+
218
+
219
+
220
+ <!-- if includes -->
221
+
222
+
223
+ <!-- if method_list -->
224
+ <div id="methods">
225
+ <h2 class="section-bar">Public Class methods</h2>
226
+
227
+ <div id="method-M000002" class="method-detail">
228
+ <a name="M000002"></a>
229
+
230
+ <div class="method-heading">
231
+ <a href="#M000002" class="method-signature">
232
+ <span class="method-name">fork</span><span class="method-args">(&amp;block)</span>
233
+ </a>
234
+ </div>
235
+
236
+ <div class="method-description">
237
+ <p>
238
+ just fork with out silly warnings
239
+ </p>
240
+ <p><a class="source-toggle" href="#"
241
+ onclick="toggleCode('M000002-source');return false;">[Source]</a></p>
242
+ <div class="method-source-code" id="M000002-source">
243
+ <pre>
244
+ <span class="ruby-comment cmt"># File lib/slave.rb, line 47</span>
245
+ 47: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">fork</span> <span class="ruby-operator">&amp;</span><span class="ruby-identifier">block</span>
246
+ 48: <span class="ruby-comment cmt">#--{{{</span>
247
+ 49: <span class="ruby-identifier">v</span> = <span class="ruby-identifier">$VERBOSE</span>
248
+ 50: <span class="ruby-keyword kw">begin</span>
249
+ 51: <span class="ruby-identifier">$VERBOSE</span> = <span class="ruby-keyword kw">nil</span>
250
+ 52: <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">block</span>
251
+ 53: <span class="ruby-keyword kw">ensure</span>
252
+ 54: <span class="ruby-identifier">$VERBOSE</span> = <span class="ruby-identifier">v</span>
253
+ 55: <span class="ruby-keyword kw">end</span>
254
+ 56: <span class="ruby-comment cmt">#--}}}</span>
255
+ 57: <span class="ruby-keyword kw">end</span>
256
+ </pre>
257
+ </div>
258
+ </div>
259
+ </div>
260
+
261
+ <div id="method-M000001" class="method-detail">
262
+ <a name="M000001"></a>
263
+
264
+ <div class="method-heading">
265
+ <a href="#M000001" class="method-signature">
266
+ <span class="method-name">getval</span><span class="method-args">key, opts = {}</span>
267
+ </a>
268
+ </div>
269
+
270
+ <div class="method-description">
271
+ <p>
272
+ look up a value in an option hash failing back to class defaults
273
+ </p>
274
+ <p><a class="source-toggle" href="#"
275
+ onclick="toggleCode('M000001-source');return false;">[Source]</a></p>
276
+ <div class="method-source-code" id="M000001-source">
277
+ <pre>
278
+ <span class="ruby-comment cmt"># File lib/slave.rb, line 39</span>
279
+ 39: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">getval</span> <span class="ruby-identifier">key</span>, <span class="ruby-identifier">opts</span> = {}
280
+ 40: <span class="ruby-comment cmt">#--{{{</span>
281
+ 41: <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>]
282
+ 42: <span class="ruby-identifier">keys</span>.<span class="ruby-identifier">each</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">k</span><span class="ruby-operator">|</span> <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">opts</span>[<span class="ruby-identifier">k</span>] <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">opts</span>.<span class="ruby-identifier">has_key?</span>(<span class="ruby-identifier">k</span>)}
283
+ 43: <span class="ruby-identifier">send</span> <span class="ruby-identifier">key</span> <span class="ruby-keyword kw">rescue</span> <span class="ruby-keyword kw">nil</span>
284
+ 44: <span class="ruby-comment cmt">#--}}}</span>
285
+ 45: <span class="ruby-keyword kw">end</span>
286
+ </pre>
287
+ </div>
288
+ </div>
289
+ </div>
290
+
291
+ <div id="method-M000003" class="method-detail">
292
+ <a name="M000003"></a>
293
+
294
+ <div class="method-heading">
295
+ <a href="#M000003" class="method-signature">
296
+ <span class="method-name">new</span><span class="method-args">obj, opts = {}</span>
297
+ </a>
298
+ </div>
299
+
300
+ <div class="method-description">
301
+ <p>
302
+ &#8216;obj&#8217; can be any object and &#8216;opts&#8217; may contain the
303
+ keys &#8216;socket_creation_attempts&#8217;, &#8216;pulse_rate&#8217;,
304
+ &#8216;psname&#8217;, or &#8216;debug&#8217;
305
+ </p>
306
+ <p><a class="source-toggle" href="#"
307
+ onclick="toggleCode('M000003-source');return false;">[Source]</a></p>
308
+ <div class="method-source-code" id="M000003-source">
309
+ <pre>
310
+ <span class="ruby-comment cmt"># File lib/slave.rb, line 73</span>
311
+ 73: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span> <span class="ruby-identifier">obj</span>, <span class="ruby-identifier">opts</span> = {}
312
+ 74: <span class="ruby-comment cmt">#--{{{</span>
313
+ 75: <span class="ruby-ivar">@obj</span> = <span class="ruby-identifier">obj</span>
314
+ 76:
315
+ 77: <span class="ruby-ivar">@socket_creation_attempts</span> = <span class="ruby-identifier">getval</span>(<span class="ruby-value str">'socket_creation_attempts'</span>, <span class="ruby-identifier">opts</span>)
316
+ 78: <span class="ruby-ivar">@pulse_rate</span> = <span class="ruby-identifier">getval</span>(<span class="ruby-value str">'pulse_rate'</span>, <span class="ruby-identifier">opts</span>)
317
+ 79: <span class="ruby-ivar">@debug</span> = <span class="ruby-identifier">getval</span>(<span class="ruby-value str">'debug'</span>, <span class="ruby-identifier">opts</span>)
318
+ 80: <span class="ruby-ivar">@psname</span> = <span class="ruby-identifier">getval</span>(<span class="ruby-value str">'psname'</span>, <span class="ruby-identifier">opts</span>) <span class="ruby-operator">||</span> <span class="ruby-identifier">gen_psname</span>(<span class="ruby-ivar">@obj</span>)
319
+ 81:
320
+ 82: <span class="ruby-identifier">trace</span>{ <span class="ruby-node">&quot;socket_creation_attempts &lt;#{ @socket_creation_attempts }&gt;&quot;</span> }
321
+ 83: <span class="ruby-identifier">trace</span>{ <span class="ruby-node">&quot;pulse_rate &lt;#{ @pulse_rate }&gt;&quot;</span> }
322
+ 84: <span class="ruby-identifier">trace</span>{ <span class="ruby-node">&quot;psname &lt;#{ @psname }&gt;&quot;</span> }
323
+ 85:
324
+ 86: <span class="ruby-ivar">@shutdown</span> = <span class="ruby-keyword kw">false</span>
325
+ 87:
326
+ 88: <span class="ruby-ivar">@heartbeat</span> = <span class="ruby-constant">Heartbeat</span><span class="ruby-operator">::</span><span class="ruby-identifier">new</span> <span class="ruby-ivar">@pulse_rate</span>, <span class="ruby-ivar">@debug</span>
327
+ 89: <span class="ruby-ivar">@r</span>, <span class="ruby-ivar">@w</span> = <span class="ruby-constant">IO</span><span class="ruby-operator">::</span><span class="ruby-identifier">pipe</span>
328
+ 90: <span class="ruby-comment cmt">#</span>
329
+ 91: <span class="ruby-comment cmt"># child</span>
330
+ 92: <span class="ruby-comment cmt">#</span>
331
+ 93: <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>))
332
+ 94: <span class="ruby-keyword kw">begin</span>
333
+ 95: <span class="ruby-identifier">$0</span> = <span class="ruby-ivar">@psname</span>
334
+ 96: <span class="ruby-ivar">@pid</span> = <span class="ruby-constant">Process</span><span class="ruby-operator">::</span><span class="ruby-identifier">pid</span>
335
+ 97: <span class="ruby-ivar">@ppid</span> = <span class="ruby-constant">Process</span><span class="ruby-operator">::</span><span class="ruby-identifier">ppid</span>
336
+ 98:
337
+ 99: <span class="ruby-ivar">@r</span>.<span class="ruby-identifier">close</span>
338
+ 100: <span class="ruby-ivar">@socket</span> = <span class="ruby-keyword kw">nil</span>
339
+ 101: <span class="ruby-ivar">@uri</span> = <span class="ruby-keyword kw">nil</span>
340
+ 102:
341
+ 103: <span class="ruby-identifier">tmpdir</span> = <span class="ruby-constant">Dir</span><span class="ruby-operator">::</span><span class="ruby-identifier">tmpdir</span>
342
+ 104: <span class="ruby-identifier">basename</span> = <span class="ruby-constant">File</span><span class="ruby-operator">::</span><span class="ruby-identifier">basename</span> <span class="ruby-ivar">@psname</span>
343
+ 105:
344
+ 106: <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>
345
+ 107: <span class="ruby-keyword kw">begin</span>
346
+ 108: <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 }&quot;</span>)
347
+ 109: <span class="ruby-identifier">u</span> = <span class="ruby-node">&quot;drbunix://#{ s }&quot;</span>
348
+ 110: <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-identifier">obj</span>
349
+ 111: <span class="ruby-ivar">@socket</span> = <span class="ruby-identifier">s</span>
350
+ 112: <span class="ruby-ivar">@uri</span> = <span class="ruby-identifier">u</span>
351
+ 113: <span class="ruby-identifier">trace</span>{ <span class="ruby-node">&quot;child - socket &lt;#{ @socket }&gt;&quot;</span> }
352
+ 114: <span class="ruby-identifier">trace</span>{ <span class="ruby-node">&quot;child - uri &lt;#{ @uri }&gt;&quot;</span> }
353
+ 115: <span class="ruby-keyword kw">break</span>
354
+ 116: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Errno</span><span class="ruby-operator">::</span><span class="ruby-constant">EADDRINUSE</span>
355
+ 117: <span class="ruby-keyword kw">nil</span>
356
+ 118: <span class="ruby-keyword kw">end</span>
357
+ 119: <span class="ruby-keyword kw">end</span>
358
+ 120:
359
+ 121: <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>
360
+ 122: <span class="ruby-ivar">@heartbeat</span>.<span class="ruby-identifier">start</span>
361
+ 123: <span class="ruby-ivar">@w</span>.<span class="ruby-identifier">write</span> <span class="ruby-ivar">@socket</span>
362
+ 124: <span class="ruby-ivar">@w</span>.<span class="ruby-identifier">close</span>
363
+ 125: <span class="ruby-identifier">trap</span>(<span class="ruby-value str">'SIGUSR2'</span>) <span class="ruby-keyword kw">do</span>
364
+ 126: <span class="ruby-ivar">@heartbeat</span>.<span class="ruby-identifier">stop</span> <span class="ruby-keyword kw">rescue</span> <span class="ruby-keyword kw">nil</span>
365
+ 127: <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>
366
+ 128: <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>
367
+ 129: <span class="ruby-identifier">exit!</span>
368
+ 130: <span class="ruby-keyword kw">end</span>
369
+ 131: <span class="ruby-constant">DRb</span><span class="ruby-operator">::</span><span class="ruby-identifier">thread</span>.<span class="ruby-identifier">join</span>
370
+ 132: <span class="ruby-keyword kw">else</span>
371
+ 133: <span class="ruby-ivar">@w</span>.<span class="ruby-identifier">close</span>
372
+ 134: <span class="ruby-keyword kw">end</span>
373
+ 135: <span class="ruby-keyword kw">rescue</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">e</span>
374
+ 136: <span class="ruby-identifier">trace</span>{ <span class="ruby-node">%[#{ e.message } (#{ e.class })\n#{ e.backtrace.join &quot;\n&quot; }]</span> }
375
+ 137: <span class="ruby-keyword kw">ensure</span>
376
+ 138: <span class="ruby-identifier">exit!</span>
377
+ 139: <span class="ruby-keyword kw">end</span>
378
+ 140: <span class="ruby-comment cmt">#</span>
379
+ 141: <span class="ruby-comment cmt"># parent </span>
380
+ 142: <span class="ruby-comment cmt">#</span>
381
+ 143: <span class="ruby-keyword kw">else</span>
382
+ 144: <span class="ruby-constant">Process</span><span class="ruby-operator">::</span><span class="ruby-identifier">detach</span> <span class="ruby-ivar">@pid</span>
383
+ 145: <span class="ruby-ivar">@w</span>.<span class="ruby-identifier">close</span>
384
+ 146: <span class="ruby-ivar">@socket</span> = <span class="ruby-ivar">@r</span>.<span class="ruby-identifier">read</span>
385
+ 147: <span class="ruby-ivar">@r</span>.<span class="ruby-identifier">close</span>
386
+ 148:
387
+ 149: <span class="ruby-identifier">trace</span>{ <span class="ruby-node">&quot;parent - socket &lt;#{ @socket }&gt;&quot;</span> }
388
+ 150:
389
+ 151: <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>
390
+ 152: <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> }
391
+ 153: <span class="ruby-ivar">@uri</span> = <span class="ruby-node">&quot;drbunix://#{ socket }&quot;</span>
392
+ 154: <span class="ruby-identifier">trace</span>{ <span class="ruby-node">&quot;parent - uri &lt;#{ @uri }&gt;&quot;</span> }
393
+ 155: <span class="ruby-ivar">@heartbeat</span>.<span class="ruby-identifier">start</span>
394
+ 156: <span class="ruby-comment cmt">#</span>
395
+ 157: <span class="ruby-comment cmt"># starting drb on localhost avoids dns lookups!</span>
396
+ 158: <span class="ruby-comment cmt">#</span>
397
+ 159: <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>
398
+ 160: <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>
399
+ 161: <span class="ruby-keyword kw">else</span>
400
+ 162: <span class="ruby-identifier">raise</span> <span class="ruby-node">&quot;failed to find slave socket &lt;#{ @socket }&gt;&quot;</span>
401
+ 163: <span class="ruby-keyword kw">end</span>
402
+ 164: <span class="ruby-keyword kw">end</span>
403
+ 165: <span class="ruby-comment cmt">#--}}}</span>
404
+ 166: <span class="ruby-keyword kw">end</span>
405
+ </pre>
406
+ </div>
407
+ </div>
408
+ </div>
409
+
410
+ <h2 class="section-bar">Public Instance methods</h2>
411
+
412
+ <div id="method-M000005" class="method-detail">
413
+ <a name="M000005"></a>
414
+
415
+ <div class="method-heading">
416
+ <a href="#M000005" class="method-signature">
417
+ <span class="method-name">gen_psname</span><span class="method-args">obj</span>
418
+ </a>
419
+ </div>
420
+
421
+ <div class="method-description">
422
+ <p>
423
+ generate a default name to appear in ps/top
424
+ </p>
425
+ <p><a class="source-toggle" href="#"
426
+ onclick="toggleCode('M000005-source');return false;">[Source]</a></p>
427
+ <div class="method-source-code" id="M000005-source">
428
+ <pre>
429
+ <span class="ruby-comment cmt"># File lib/slave.rb, line 179</span>
430
+ 179: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">gen_psname</span> <span class="ruby-identifier">obj</span>
431
+ 180: <span class="ruby-comment cmt">#--{{{</span>
432
+ 181: <span class="ruby-node">&quot;#{ obj.class }_slave_of_#{ Process::pid }&quot;</span>.<span class="ruby-identifier">downcase</span>
433
+ 182: <span class="ruby-comment cmt">#--}}}</span>
434
+ 183: <span class="ruby-keyword kw">end</span>
435
+ </pre>
436
+ </div>
437
+ </div>
438
+ </div>
439
+
440
+ <div id="method-M000006" class="method-detail">
441
+ <a name="M000006"></a>
442
+
443
+ <div class="method-heading">
444
+ <a href="#M000006" class="method-signature">
445
+ <span class="method-name">getval</span><span class="method-args">key, opts = {}</span>
446
+ </a>
447
+ </div>
448
+
449
+ <div class="method-description">
450
+ <p>
451
+ see docs for class.getval
452
+ </p>
453
+ <p><a class="source-toggle" href="#"
454
+ onclick="toggleCode('M000006-source');return false;">[Source]</a></p>
455
+ <div class="method-source-code" id="M000006-source">
456
+ <pre>
457
+ <span class="ruby-comment cmt"># File lib/slave.rb, line 185</span>
458
+ 185: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">getval</span> <span class="ruby-identifier">key</span>, <span class="ruby-identifier">opts</span> = {}
459
+ 186: <span class="ruby-comment cmt">#--{{{</span>
460
+ 187: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">class</span>.<span class="ruby-identifier">getval</span> <span class="ruby-identifier">key</span>
461
+ 188: <span class="ruby-comment cmt">#--}}}</span>
462
+ 189: <span class="ruby-keyword kw">end</span>
463
+ </pre>
464
+ </div>
465
+ </div>
466
+ </div>
467
+
468
+ <div id="method-M000004" class="method-detail">
469
+ <a name="M000004"></a>
470
+
471
+ <div class="method-heading">
472
+ <a href="#M000004" class="method-signature">
473
+ <span class="method-name">shutdown</span><span class="method-args">()</span>
474
+ </a>
475
+ </div>
476
+
477
+ <div class="method-description">
478
+ <p>
479
+ stops the heartbeat thread and kills the child process
480
+ </p>
481
+ <p><a class="source-toggle" href="#"
482
+ onclick="toggleCode('M000004-source');return false;">[Source]</a></p>
483
+ <div class="method-source-code" id="M000004-source">
484
+ <pre>
485
+ <span class="ruby-comment cmt"># File lib/slave.rb, line 168</span>
486
+ 168: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">shutdown</span>
487
+ 169: <span class="ruby-comment cmt">#--{{{</span>
488
+ 170: <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>
489
+ 171: <span class="ruby-ivar">@heartbeat</span>.<span class="ruby-identifier">stop</span> <span class="ruby-keyword kw">rescue</span> <span class="ruby-keyword kw">nil</span>
490
+ 172: <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-keyword kw">nil</span>
491
+ 173: <span class="ruby-constant">Process</span><span class="ruby-operator">::</span><span class="ruby-identifier">kill</span>(<span class="ruby-value str">'SIGTERM'</span>, <span class="ruby-ivar">@pid</span>) <span class="ruby-keyword kw">rescue</span> <span class="ruby-keyword kw">nil</span>
492
+ 174: <span class="ruby-constant">FileUtils</span><span class="ruby-operator">::</span><span class="ruby-identifier">rm_f</span> <span class="ruby-ivar">@socket</span>
493
+ 175: <span class="ruby-ivar">@shutdown</span> = <span class="ruby-keyword kw">true</span>
494
+ 176: <span class="ruby-comment cmt">#--}}}</span>
495
+ 177: <span class="ruby-keyword kw">end</span>
496
+ </pre>
497
+ </div>
498
+ </div>
499
+ </div>
500
+
501
+ <div id="method-M000007" class="method-detail">
502
+ <a name="M000007"></a>
503
+
504
+ <div class="method-heading">
505
+ <a href="#M000007" class="method-signature">
506
+ <span class="method-name">trace</span><span class="method-args">() {|| ...}</span>
507
+ </a>
508
+ </div>
509
+
510
+ <div class="method-description">
511
+ <p>
512
+ debugging output
513
+ </p>
514
+ <p><a class="source-toggle" href="#"
515
+ onclick="toggleCode('M000007-source');return false;">[Source]</a></p>
516
+ <div class="method-source-code" id="M000007-source">
517
+ <pre>
518
+ <span class="ruby-comment cmt"># File lib/slave.rb, line 191</span>
519
+ 191: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">trace</span>
520
+ 192: <span class="ruby-comment cmt">#--{{{</span>
521
+ 193: <span class="ruby-constant">STDERR</span>.<span class="ruby-identifier">puts</span>(<span class="ruby-keyword kw">yield</span>) <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@debug</span> <span class="ruby-keyword kw">and</span> <span class="ruby-constant">STDERR</span>.<span class="ruby-identifier">tty?</span>
522
+ 194: <span class="ruby-comment cmt">#--}}}</span>
523
+ 195: <span class="ruby-keyword kw">end</span>
524
+ </pre>
525
+ </div>
526
+ </div>
527
+ </div>
528
+
529
+
530
+ </div>
531
+
532
+
533
+ </div>
534
+
535
+
536
+ <div id="validator-badges">
537
+ <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
538
+ </div>
539
+
540
+ </body>
541
+ </html>