<?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <title>Class: Semaphore</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <link rel="stylesheet" href=".././rdoc-style.css" type="text/css" media="screen" /> <script language="JavaScript" type="text/javascript"> // <![CDATA[ function toggleSource( id ) { var elem var link if( document.getElementById ) { elem = document.getElementById( id ) link = document.getElementById( "l_" + id ) } else if ( document.all ) { elem = eval( "document.all." + id ) link = eval( "document.all.l_" + id ) } else return false; if( elem.style.display == "block" ) { elem.style.display = "none" link.innerHTML = "+" } else { elem.style.display = "block" link.innerHTML = "-" } } function openCode( url ) { window.open( url, "SOURCE_CODE", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=480,width=750" ).focus(); } // ]]> </script> </head> <body> <table width="100%" border='0' cellpadding='0' cellspacing='0' class='banner'><tr> <td class="file-title"><span class="file-title-prefix">Class</span><br />Semaphore</td> <td align="right"> <table cellspacing="0" cellpadding="2"> <tr valign="top"> <td>In:</td> <td> <a href="../files/lib/more/facets/semaphore_rb.html">lib/more/facets/semaphore.rb</a> </td> </tr> <tr> <td>Parent:</td> <td> Object </td> </tr> </table> </td> </tr> </table> <!-- banner header --> <div id="bodyContent"> <div id="content"> <div class="description"><h1><a href="Semaphore.html">Semaphore</a></h1> <p> Technically a semaphore is simply an integer variable which has an execution queue associated with it. </p> </div> <div class="sectiontitle">Methods</div> <span style="padding-right: 5px;"><a href="#M000211">down</a></span> <span style="padding-right: 5px;"><a href="#M000215">exclusive</a></span> <span style="padding-right: 5px;"><a href="#M000208">new</a></span> <span style="padding-right: 5px;"><a href="#M000213">p</a></span> <span style="padding-right: 5px;"><a href="#M000210">signal</a></span> <span style="padding-right: 5px;"><a href="#M000216">synchronize</a></span> <span style="padding-right: 5px;"><a href="#M000212">up</a></span> <span style="padding-right: 5px;"><a href="#M000214">v</a></span> <span style="padding-right: 5px;"><a href="#M000209">wait</a></span> <div class="sectiontitle">Public Class methods</div> <div class="method"> <div class="title"> <a name="M000208"></a><b>new</b>(initvalue = 0) </div> <div class="sourcecode"> <p class="source-link">[ <a href="javascript:toggleSource('M000208_source')" id="l_M000208_source">+</a> ]</p> <div id="M000208_source" class="dyn-source"> <pre> <span class="ruby-comment cmt"># File lib/more/facets/semaphore.rb, line 31</span> <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">initvalue</span> = <span class="ruby-value">0</span>) <span class="ruby-ivar">@counter</span> = <span class="ruby-identifier">initvalue</span> <span class="ruby-ivar">@waiting_list</span> = [] <span class="ruby-keyword kw">end</span> </pre> </div> </div> </div> <div class="sectiontitle">Public Instance methods</div> <div class="method"> <div class="title"> <a name="M000211"></a><b>down</b>() </div> <div class="description"> <p> Alias for <a href="Semaphore.html#M000209">wait</a> </p> </div> </div> <div class="method"> <div class="title"> <a name="M000215"></a><b>exclusive</b>() {|| ...} </div> <div class="aka"> This method is also aliased as <a href="Semaphore.html#M000216">synchronize</a> </div> <div class="sourcecode"> <p class="source-link">[ <a href="javascript:toggleSource('M000215_source')" id="l_M000215_source">+</a> ]</p> <div id="M000215_source" class="dyn-source"> <pre> <span class="ruby-comment cmt"># File lib/more/facets/semaphore.rb, line 67</span> <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">exclusive</span> <span class="ruby-identifier">wait</span> <span class="ruby-keyword kw">yield</span> <span class="ruby-keyword kw">ensure</span> <span class="ruby-identifier">signal</span> <span class="ruby-keyword kw">end</span> </pre> </div> </div> </div> <div class="method"> <div class="title"> <a name="M000213"></a><b>p</b>() </div> <div class="description"> <p> Alias for <a href="Semaphore.html#M000209">wait</a> </p> </div> </div> <div class="method"> <div class="title"> <a name="M000210"></a><b>signal</b>() </div> <div class="aka"> This method is also aliased as <a href="Semaphore.html#M000212">up</a> <a href="Semaphore.html#M000214">v</a> </div> <div class="sourcecode"> <p class="source-link">[ <a href="javascript:toggleSource('M000210_source')" id="l_M000210_source">+</a> ]</p> <div id="M000210_source" class="dyn-source"> <pre> <span class="ruby-comment cmt"># File lib/more/facets/semaphore.rb, line 47</span> <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">signal</span> <span class="ruby-constant">Thread</span>.<span class="ruby-identifier">critical</span> = <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">begin</span> <span class="ruby-keyword kw">if</span> (<span class="ruby-ivar">@counter</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>) <span class="ruby-operator"><=</span> <span class="ruby-value">0</span> <span class="ruby-identifier">t</span> = <span class="ruby-ivar">@waiting_list</span>.<span class="ruby-identifier">shift</span> <span class="ruby-identifier">t</span>.<span class="ruby-identifier">wakeup</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">t</span> <span class="ruby-keyword kw">end</span> <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">ThreadError</span> <span class="ruby-keyword kw">retry</span> <span class="ruby-keyword kw">end</span> <span class="ruby-keyword kw">self</span> <span class="ruby-keyword kw">ensure</span> <span class="ruby-constant">Thread</span>.<span class="ruby-identifier">critical</span> = <span class="ruby-keyword kw">false</span> <span class="ruby-keyword kw">end</span> </pre> </div> </div> </div> <div class="method"> <div class="title"> <a name="M000216"></a><b>synchronize</b>() </div> <div class="description"> <p> Alias for <a href="Semaphore.html#M000215">exclusive</a> </p> </div> </div> <div class="method"> <div class="title"> <a name="M000212"></a><b>up</b>() </div> <div class="description"> <p> Alias for <a href="Semaphore.html#M000210">signal</a> </p> </div> </div> <div class="method"> <div class="title"> <a name="M000214"></a><b>v</b>() </div> <div class="description"> <p> Alias for <a href="Semaphore.html#M000210">signal</a> </p> </div> </div> <div class="method"> <div class="title"> <a name="M000209"></a><b>wait</b>() </div> <div class="aka"> This method is also aliased as <a href="Semaphore.html#M000211">down</a> <a href="Semaphore.html#M000213">p</a> </div> <div class="sourcecode"> <p class="source-link">[ <a href="javascript:toggleSource('M000209_source')" id="l_M000209_source">+</a> ]</p> <div id="M000209_source" class="dyn-source"> <pre> <span class="ruby-comment cmt"># File lib/more/facets/semaphore.rb, line 36</span> <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">wait</span> <span class="ruby-constant">Thread</span>.<span class="ruby-identifier">critical</span> = <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">if</span> (<span class="ruby-ivar">@counter</span> <span class="ruby-operator">-=</span> <span class="ruby-value">1</span>) <span class="ruby-operator"><</span> <span class="ruby-value">0</span> <span class="ruby-ivar">@waiting_list</span>.<span class="ruby-identifier">push</span>(<span class="ruby-constant">Thread</span>.<span class="ruby-identifier">current</span>) <span class="ruby-constant">Thread</span>.<span class="ruby-identifier">stop</span> <span class="ruby-keyword kw">end</span> <span class="ruby-keyword kw">self</span> <span class="ruby-keyword kw">ensure</span> <span class="ruby-constant">Thread</span>.<span class="ruby-identifier">critical</span> = <span class="ruby-keyword kw">false</span> <span class="ruby-keyword kw">end</span> </pre> </div> </div> </div> </div> </div> </body> </html>