<!DOCTYPE html>
<html lang='en'>
<head>
<title>Only grab keyboard when we have focus - tigervnc.git - High performance, multi-platform VNC client and server: https://github.com/TigerVNC/tigervnc</title>
<meta name='generator' content='cgit v1.2.3'/>
<meta name='robots' content='index, nofollow'/>
<link rel='stylesheet' type='text/css' href='/cgit.css'/>
<link rel='shortcut icon' href='/favicon.ico'/>
<link rel='alternate' title='Atom feed' href='https://source.dussan.org/tigervnc.git/atom/common/rfb/LogWriter.cxx?h=master' type='application/atom+xml'/>
</head>
<body>
<div id='cgit'><table id='header'>
<tr>
<td class='logo' rowspan='2'><a href='/'><img src='/cgit.png' alt='cgit logo'/></a></td>
<td class='main'><a href='/'>index</a> : <a href='/tigervnc.git/'>tigervnc.git</a></td><td class='form'><form method='get'>
<input type='hidden' name='id' value='72e94ca93d3ada8fb7f518fa65644d2bc172bd4b'/><select name='h' onchange='this.form.submit();'>
<option value='1.0-branch'>1.0-branch</option>
<option value='1.1-branch'>1.1-branch</option>
<option value='1.10-branch'>1.10-branch</option>
<option value='1.11-branch'>1.11-branch</option>
<option value='1.12-branch'>1.12-branch</option>
<option value='1.13-branch'>1.13-branch</option>
<option value='1.14-branch'>1.14-branch</option>
<option value='1.15-branch'>1.15-branch</option>
<option value='1.2-branch'>1.2-branch</option>
<option value='1.3-branch'>1.3-branch</option>
<option value='1.4-branch'>1.4-branch</option>
<option value='1.5-branch'>1.5-branch</option>
<option value='1.6-branch'>1.6-branch</option>
<option value='1.7-branch'>1.7-branch</option>
<option value='1.8-branch'>1.8-branch</option>
<option value='1.9-branch'>1.9-branch</option>
<option value='master' selected='selected'>master</option>
</select> <input type='submit' value='switch'/></form></td></tr>
<tr><td class='sub'>High performance, multi-platform VNC client and server: https://github.com/TigerVNC/tigervnc</td><td class='sub right'>www-data</td></tr></table>
<table class='tabs'><tr><td>
<a href='/tigervnc.git/about/'>about</a><a href='/tigervnc.git/'>summary</a><a href='/tigervnc.git/refs/?id=72e94ca93d3ada8fb7f518fa65644d2bc172bd4b'>refs</a><a href='/tigervnc.git/log/common/rfb/LogWriter.cxx'>log</a><a href='/tigervnc.git/tree/common/rfb/LogWriter.cxx?id=72e94ca93d3ada8fb7f518fa65644d2bc172bd4b'>tree</a><a class='active' href='/tigervnc.git/commit/common/rfb/LogWriter.cxx?id=72e94ca93d3ada8fb7f518fa65644d2bc172bd4b'>commit</a><a href='/tigervnc.git/diff/common/rfb/LogWriter.cxx?id=72e94ca93d3ada8fb7f518fa65644d2bc172bd4b'>diff</a><a href='/tigervnc.git/stats/common/rfb/LogWriter.cxx'>stats</a></td><td class='form'><form class='right' method='get' action='/tigervnc.git/log/common/rfb/LogWriter.cxx'>
<input type='hidden' name='id' value='72e94ca93d3ada8fb7f518fa65644d2bc172bd4b'/><select name='qt'>
<option value='grep'>log msg</option>
<option value='author'>author</option>
<option value='committer'>committer</option>
<option value='range'>range</option>
</select>
<input class='txt' type='search' size='10' name='q' value=''/>
<input type='submit' value='search'/>
</form>
</td></tr></table>
<div class='path'>path: <a href='/tigervnc.git/commit/?id=72e94ca93d3ada8fb7f518fa65644d2bc172bd4b'>root</a>/<a href='/tigervnc.git/commit/common?id=72e94ca93d3ada8fb7f518fa65644d2bc172bd4b'>common</a>/<a href='/tigervnc.git/commit/common/rfb?id=72e94ca93d3ada8fb7f518fa65644d2bc172bd4b'>rfb</a>/<a href='/tigervnc.git/commit/common/rfb/LogWriter.cxx?id=72e94ca93d3ada8fb7f518fa65644d2bc172bd4b'>LogWriter.cxx</a></div><div class='content'><div class='cgit-panel'><b>diff options</b><form method='get'><input type='hidden' name='id' value='72e94ca93d3ada8fb7f518fa65644d2bc172bd4b'/><table><tr><td colspan='2'/></tr><tr><td class='label'>context:</td><td class='ctrl'><select name='context' onchange='this.form.submit();'><option value='1'>1</option><option value='2'>2</option><option value='3' selected='selected'>3</option><option value='4'>4</option><option value='5'>5</option><option value='6'>6</option><option value='7'>7</option><option value='8'>8</option><option value='9'>9</option><option value='10'>10</option><option value='15'>15</option><option value='20'>20</option><option value='25'>25</option><option value='30'>30</option><option value='35'>35</option><option value='40'>40</option></select></td></tr><tr><td class='label'>space:</td><td class='ctrl'><select name='ignorews' onchange='this.form.submit();'><option value='0' selected='selected'>include</option><option value='1'>ignore</option></select></td></tr><tr><td class='label'>mode:</td><td class='ctrl'><select name='dt' onchange='this.form.submit();'><option value='0' selected='selected'>unified</option><option value='1'>ssdiff</option><option value='2'>stat only</option></select></td></tr><tr><td/><td class='ctrl'><noscript><input type='submit' value='reload'/></noscript></td></tr></table></form></div><table summary='commit info' class='commit-info'>
<tr><th>author</th><td>Samuel Mannehed &lt;samuel@cendio.se&gt;</td><td class='right'>2021-09-23 16:31:59 +0200</td></tr>
<tr><th>committer</th><td>Samuel Mannehed &lt;samuel@cendio.se&gt;</td><td class='right'>2021-09-24 13:07:17 +0200</td></tr>
<tr><th>commit</th><td colspan='2' class='oid'><a href='/tigervnc.git/commit/common/rfb/LogWriter.cxx?id=72e94ca93d3ada8fb7f518fa65644d2bc172bd4b'>72e94ca93d3ada8fb7f518fa65644d2bc172bd4b</a> (<a href='/tigervnc.git/patch/common/rfb/LogWriter.cxx?id=72e94ca93d3ada8fb7f518fa65644d2bc172bd4b'>patch</a>)</td></tr>
<tr><th>tree</th><td colspan='2' class='oid'><a href='/tigervnc.git/tree/?id=72e94ca93d3ada8fb7f518fa65644d2bc172bd4b'>6748b67747a8661b676134c162b1a35d98166005</a> /<a href='/tigervnc.git/tree/common/rfb/LogWriter.cxx?id=72e94ca93d3ada8fb7f518fa65644d2bc172bd4b'>common/rfb/LogWriter.cxx</a></td></tr>
<tr><th>parent</th><td colspan='2' class='oid'><a href='/tigervnc.git/commit/common/rfb/LogWriter.cxx?id=d6f4edbbf3e27771d27d8691f7bf0984997bd2e3'>d6f4edbbf3e27771d27d8691f7bf0984997bd2e3</a> (<a href='/tigervnc.git/diff/common/rfb/LogWriter.cxx?id=72e94ca93d3ada8fb7f518fa65644d2bc172bd4b&amp;id2=d6f4edbbf3e27771d27d8691f7bf0984997bd2e3'>diff</a>)</td></tr><tr><th>download</th><td colspan='2' class='oid'><a href='/tigervnc.git/snapshot/tigervnc-72e94ca93d3ada8fb7f518fa65644d2bc172bd4b.tar.gz'>tigervnc-72e94ca93d3ada8fb7f518fa65644d2bc172bd4b.tar.gz</a><br/><a href='/tigervnc.git/snapshot/tigervnc-72e94ca93d3ada8fb7f518fa65644d2bc172bd4b.zip'>tigervnc-72e94ca93d3ada8fb7f518fa65644d2bc172bd4b.zip</a><br/></td></tr></table>
<div class='commit-subject'>Only grab keyboard when we have focus<span class='decoration'></span></div><div class='commit-msg'>There was an issue with the new grabs that were introduced in commit
2289342de7222e4ff2483eae95bb9898830e6097. On macOS when running
vncviewer in fullscreen on one monitor, we saw that we sometimes got
resize and fullscreen events when switching the focus away from
vncviewer. With the changes in the commit mentioned above this meant
that we immediately grabbed the keyboard again, thus never releasing it.

Fixes #1332.
</div><div class='diffstat-header'><a href='/tigervnc.git/diff/?id=72e94ca93d3ada8fb7f518fa65644d2bc172bd4b'>Diffstat</a> (limited to 'common/rfb/LogWriter.cxx')</div><table summary='diffstat' class='diffstat'></table><div class='diffstat-summary'>0 files changed, 0 insertions, 0 deletions</div><table summary='diff' class='diff'><tr><td></td></tr></table></div> <!-- class=content -->
<div class='footer'>generated by <a href='https://git.zx2c4.com/cgit/about/'>cgit v1.2.3</a> (<a href='https://git-scm.com/'>git 2.39.1</a>) at 2025-08-10 10:28:57 +0000</div>
</div> <!-- id=cgit -->
</body>
</html>
>
<a id='n47' href='#n47'>47</a>
<a id='n48' href='#n48'>48</a>
<a id='n49' href='#n49'>49</a>
<a id='n50' href='#n50'>50</a>
<a id='n51' href='#n51'>51</a>
<a id='n52' href='#n52'>52</a>
<a id='n53' href='#n53'>53</a>
<a id='n54' href='#n54'>54</a>
<a id='n55' href='#n55'>55</a>
<a id='n56' href='#n56'>56</a>
<a id='n57' href='#n57'>57</a>
<a id='n58' href='#n58'>58</a>
<a id='n59' href='#n59'>59</a>
<a id='n60' href='#n60'>60</a>
<a id='n61' href='#n61'>61</a>
<a id='n62' href='#n62'>62</a>
<a id='n63' href='#n63'>63</a>
<a id='n64' href='#n64'>64</a>
<a id='n65' href='#n65'>65</a>
<a id='n66' href='#n66'>66</a>
<a id='n67' href='#n67'>67</a>
<a id='n68' href='#n68'>68</a>
<a id='n69' href='#n69'>69</a>
<a id='n70' href='#n70'>70</a>
<a id='n71' href='#n71'>71</a>
<a id='n72' href='#n72'>72</a>
<a id='n73' href='#n73'>73</a>
<a id='n74' href='#n74'>74</a>
<a id='n75' href='#n75'>75</a>
<a id='n76' href='#n76'>76</a>
<a id='n77' href='#n77'>77</a>
<a id='n78' href='#n78'>78</a>
<a id='n79' href='#n79'>79</a>
<a id='n80' href='#n80'>80</a>
<a id='n81' href='#n81'>81</a>
<a id='n82' href='#n82'>82</a>
<a id='n83' href='#n83'>83</a>
<a id='n84' href='#n84'>84</a>
<a id='n85' href='#n85'>85</a>
<a id='n86' href='#n86'>86</a>
<a id='n87' href='#n87'>87</a>
<a id='n88' href='#n88'>88</a>
<a id='n89' href='#n89'>89</a>
<a id='n90' href='#n90'>90</a>
<a id='n91' href='#n91'>91</a>
<a id='n92' href='#n92'>92</a>
<a id='n93' href='#n93'>93</a>
<a id='n94' href='#n94'>94</a>
<a id='n95' href='#n95'>95</a>
<a id='n96' href='#n96'>96</a>
<a id='n97' href='#n97'>97</a>
<a id='n98' href='#n98'>98</a>
<a id='n99' href='#n99'>99</a>
<a id='n100' href='#n100'>100</a>
<a id='n101' href='#n101'>101</a>
<a id='n102' href='#n102'>102</a>
<a id='n103' href='#n103'>103</a>
<a id='n104' href='#n104'>104</a>
<a id='n105' href='#n105'>105</a>
<a id='n106' href='#n106'>106</a>
<a id='n107' href='#n107'>107</a>
<a id='n108' href='#n108'>108</a>
<a id='n109' href='#n109'>109</a>
<a id='n110' href='#n110'>110</a>
<a id='n111' href='#n111'>111</a>
<a id='n112' href='#n112'>112</a>
<a id='n113' href='#n113'>113</a>
<a id='n114' href='#n114'>114</a>
<a id='n115' href='#n115'>115</a>
<a id='n116' href='#n116'>116</a>
<a id='n117' href='#n117'>117</a>
<a id='n118' href='#n118'>118</a>
<a id='n119' href='#n119'>119</a>
<a id='n120' href='#n120'>120</a>
<a id='n121' href='#n121'>121</a>
<a id='n122' href='#n122'>122</a>
<a id='n123' href='#n123'>123</a>
<a id='n124' href='#n124'>124</a>
<a id='n125' href='#n125'>125</a>
<a id='n126' href='#n126'>126</a>
<a id='n127' href='#n127'>127</a>
<a id='n128' href='#n128'>128</a>
<a id='n129' href='#n129'>129</a>
<a id='n130' href='#n130'>130</a>
<a id='n131' href='#n131'>131</a>
<a id='n132' href='#n132'>132</a>
<a id='n133' href='#n133'>133</a>
<a id='n134' href='#n134'>134</a>
<a id='n135' href='#n135'>135</a>
<a id='n136' href='#n136'>136</a>
<a id='n137' href='#n137'>137</a>
<a id='n138' href='#n138'>138</a>
<a id='n139' href='#n139'>139</a>
<a id='n140' href='#n140'>140</a>
<a id='n141' href='#n141'>141</a>
<a id='n142' href='#n142'>142</a>
<a id='n143' href='#n143'>143</a>
<a id='n144' href='#n144'>144</a>
<a id='n145' href='#n145'>145</a>
<a id='n146' href='#n146'>146</a>
<a id='n147' href='#n147'>147</a>
<a id='n148' href='#n148'>148</a>
<a id='n149' href='#n149'>149</a>
<a id='n150' href='#n150'>150</a>
<a id='n151' href='#n151'>151</a>
<a id='n152' href='#n152'>152</a>
<a id='n153' href='#n153'>153</a>
<a id='n154' href='#n154'>154</a>
<a id='n155' href='#n155'>155</a>
<a id='n156' href='#n156'>156</a>
<a id='n157' href='#n157'>157</a>
<a id='n158' href='#n158'>158</a>
<a id='n159' href='#n159'>159</a>
<a id='n160' href='#n160'>160</a>
<a id='n161' href='#n161'>161</a>
<a id='n162' href='#n162'>162</a>
<a id='n163' href='#n163'>163</a>
<a id='n164' href='#n164'>164</a>
<a id='n165' href='#n165'>165</a>
<a id='n166' href='#n166'>166</a>
<a id='n167' href='#n167'>167</a>
<a id='n168' href='#n168'>168</a>
<a id='n169' href='#n169'>169</a>
<a id='n170' href='#n170'>170</a>
<a id='n171' href='#n171'>171</a>
<a id='n172' href='#n172'>172</a>
<a id='n173' href='#n173'>173</a>
<a id='n174' href='#n174'>174</a>
<a id='n175' href='#n175'>175</a>
<a id='n176' href='#n176'>176</a>
<a id='n177' href='#n177'>177</a>
<a id='n178' href='#n178'>178</a>
<a id='n179' href='#n179'>179</a>
<a id='n180' href='#n180'>180</a>
<a id='n181' href='#n181'>181</a>
<a id='n182' href='#n182'>182</a>
<a id='n183' href='#n183'>183</a>
<a id='n184' href='#n184'>184</a>
<a id='n185' href='#n185'>185</a>
<a id='n186' href='#n186'>186</a>
<a id='n187' href='#n187'>187</a>
<a id='n188' href='#n188'>188</a>
<a id='n189' href='#n189'>189</a>
<a id='n190' href='#n190'>190</a>
<a id='n191' href='#n191'>191</a>
<a id='n192' href='#n192'>192</a>
<a id='n193' href='#n193'>193</a>
<a id='n194' href='#n194'>194</a>
<a id='n195' href='#n195'>195</a>
<a id='n196' href='#n196'>196</a>
<a id='n197' href='#n197'>197</a>
<a id='n198' href='#n198'>198</a>
<a id='n199' href='#n199'>199</a>
<a id='n200' href='#n200'>200</a>
<a id='n201' href='#n201'>201</a>
<a id='n202' href='#n202'>202</a>
<a id='n203' href='#n203'>203</a>
<a id='n204' href='#n204'>204</a>
<a id='n205' href='#n205'>205</a>
<a id='n206' href='#n206'>206</a>
<a id='n207' href='#n207'>207</a>
<a id='n208' href='#n208'>208</a>
<a id='n209' href='#n209'>209</a>
<a id='n210' href='#n210'>210</a>
<a id='n211' href='#n211'>211</a>
<a id='n212' href='#n212'>212</a>
<a id='n213' href='#n213'>213</a>
<a id='n214' href='#n214'>214</a>
<a id='n215' href='#n215'>215</a>
<a id='n216' href='#n216'>216</a>
<a id='n217' href='#n217'>217</a>
<a id='n218' href='#n218'>218</a>
<a id='n219' href='#n219'>219</a>
<a id='n220' href='#n220'>220</a>
<a id='n221' href='#n221'>221</a>
<a id='n222' href='#n222'>222</a>
<a id='n223' href='#n223'>223</a>
<a id='n224' href='#n224'>224</a>
<a id='n225' href='#n225'>225</a>
<a id='n226' href='#n226'>226</a>
<a id='n227' href='#n227'>227</a>
<a id='n228' href='#n228'>228</a>
<a id='n229' href='#n229'>229</a>
<a id='n230' href='#n230'>230</a>
<a id='n231' href='#n231'>231</a>
<a id='n232' href='#n232'>232</a>
<a id='n233' href='#n233'>233</a>
<a id='n234' href='#n234'>234</a>
<a id='n235' href='#n235'>235</a>
<a id='n236' href='#n236'>236</a>
<a id='n237' href='#n237'>237</a>
<a id='n238' href='#n238'>238</a>
<a id='n239' href='#n239'>239</a>
<a id='n240' href='#n240'>240</a>
<a id='n241' href='#n241'>241</a>
<a id='n242' href='#n242'>242</a>
<a id='n243' href='#n243'>243</a>
<a id='n244' href='#n244'>244</a>
<a id='n245' href='#n245'>245</a>
<a id='n246' href='#n246'>246</a>
<a id='n247' href='#n247'>247</a>
<a id='n248' href='#n248'>248</a>
<a id='n249' href='#n249'>249</a>
<a id='n250' href='#n250'>250</a>
<a id='n251' href='#n251'>251</a>
<a id='n252' href='#n252'>252</a>
<a id='n253' href='#n253'>253</a>
<a id='n254' href='#n254'>254</a>
<a id='n255' href='#n255'>255</a>
<a id='n256' href='#n256'>256</a>
<a id='n257' href='#n257'>257</a>
<a id='n258' href='#n258'>258</a>
<a id='n259' href='#n259'>259</a>
<a id='n260' href='#n260'>260</a>
<a id='n261' href='#n261'>261</a>
<a id='n262' href='#n262'>262</a>
<a id='n263' href='#n263'>263</a>
<a id='n264' href='#n264'>264</a>
<a id='n265' href='#n265'>265</a>
<a id='n266' href='#n266'>266</a>
<a id='n267' href='#n267'>267</a>
<a id='n268' href='#n268'>268</a>
<a id='n269' href='#n269'>269</a>
<a id='n270' href='#n270'>270</a>
<a id='n271' href='#n271'>271</a>
<a id='n272' href='#n272'>272</a>
<a id='n273' href='#n273'>273</a>
<a id='n274' href='#n274'>274</a>
<a id='n275' href='#n275'>275</a>
<a id='n276' href='#n276'>276</a>
<a id='n277' href='#n277'>277</a>
<a id='n278' href='#n278'>278</a>
<a id='n279' href='#n279'>279</a>
<a id='n280' href='#n280'>280</a>
<a id='n281' href='#n281'>281</a>
<a id='n282' href='#n282'>282</a>
<a id='n283' href='#n283'>283</a>
<a id='n284' href='#n284'>284</a>
<a id='n285' href='#n285'>285</a>
<a id='n286' href='#n286'>286</a>
<a id='n287' href='#n287'>287</a>
<a id='n288' href='#n288'>288</a>
<a id='n289' href='#n289'>289</a>
<a id='n290' href='#n290'>290</a>
<a id='n291' href='#n291'>291</a>
<a id='n292' href='#n292'>292</a>
<a id='n293' href='#n293'>293</a>
<a id='n294' href='#n294'>294</a>
<a id='n295' href='#n295'>295</a>
<a id='n296' href='#n296'>296</a>
<a id='n297' href='#n297'>297</a>
<a id='n298' href='#n298'>298</a>
<a id='n299' href='#n299'>299</a>
<a id='n300' href='#n300'>300</a>
<a id='n301' href='#n301'>301</a>
<a id='n302' href='#n302'>302</a>
<a id='n303' href='#n303'>303</a>
<a id='n304' href='#n304'>304</a>
<a id='n305' href='#n305'>305</a>
<a id='n306' href='#n306'>306</a>
<a id='n307' href='#n307'>307</a>
<a id='n308' href='#n308'>308</a>
<a id='n309' href='#n309'>309</a>
<a id='n310' href='#n310'>310</a>
<a id='n311' href='#n311'>311</a>
<a id='n312' href='#n312'>312</a>
<a id='n313' href='#n313'>313</a>
<a id='n314' href='#n314'>314</a>
<a id='n315' href='#n315'>315</a>
<a id='n316' href='#n316'>316</a>
<a id='n317' href='#n317'>317</a>
<a id='n318' href='#n318'>318</a>
<a id='n319' href='#n319'>319</a>
<a id='n320' href='#n320'>320</a>
<a id='n321' href='#n321'>321</a>
<a id='n322' href='#n322'>322</a>
<a id='n323' href='#n323'>323</a>
<a id='n324' href='#n324'>324</a>
<a id='n325' href='#n325'>325</a>
<a id='n326' href='#n326'>326</a>
<a id='n327' href='#n327'>327</a>
<a id='n328' href='#n328'>328</a>
<a id='n329' href='#n329'>329</a>
<a id='n330' href='#n330'>330</a>
<a id='n331' href='#n331'>331</a>
<a id='n332' href='#n332'>332</a>
<a id='n333' href='#n333'>333</a>
<a id='n334' href='#n334'>334</a>
<a id='n335' href='#n335'>335</a>
<a id='n336' href='#n336'>336</a>
<a id='n337' href='#n337'>337</a>
<a id='n338' href='#n338'>338</a>
<a id='n339' href='#n339'>339</a>
<a id='n340' href='#n340'>340</a>
<a id='n341' href='#n341'>341</a>
<a id='n342' href='#n342'>342</a>
<a id='n343' href='#n343'>343</a>
<a id='n344' href='#n344'>344</a>
<a id='n345' href='#n345'>345</a>
<a id='n346' href='#n346'>346</a>
<a id='n347' href='#n347'>347</a>
<a id='n348' href='#n348'>348</a>
<a id='n349' href='#n349'>349</a>
<a id='n350' href='#n350'>350</a>
<a id='n351' href='#n351'>351</a>
<a id='n352' href='#n352'>352</a>
<a id='n353' href='#n353'>353</a>
<a id='n354' href='#n354'>354</a>
<a id='n355' href='#n355'>355</a>
<a id='n356' href='#n356'>356</a>
<a id='n357' href='#n357'>357</a>
<a id='n358' href='#n358'>358</a>
<a id='n359' href='#n359'>359</a>
<a id='n360' href='#n360'>360</a>
<a id='n361' href='#n361'>361</a>
<a id='n362' href='#n362'>362</a>
<a id='n363' href='#n363'>363</a>
<a id='n364' href='#n364'>364</a>
<a id='n365' href='#n365'>365</a>
<a id='n366' href='#n366'>366</a>
<a id='n367' href='#n367'>367</a>
<a id='n368' href='#n368'>368</a>
<a id='n369' href='#n369'>369</a>
<a id='n370' href='#n370'>370</a>
<a id='n371' href='#n371'>371</a>
<a id='n372' href='#n372'>372</a>
<a id='n373' href='#n373'>373</a>
<a id='n374' href='#n374'>374</a>
<a id='n375' href='#n375'>375</a>
<a id='n376' href='#n376'>376</a>
<a id='n377' href='#n377'>377</a>
<a id='n378' href='#n378'>378</a>
<a id='n379' href='#n379'>379</a>
<a id='n380' href='#n380'>380</a>
<a id='n381' href='#n381'>381</a>
<a id='n382' href='#n382'>382</a>
<a id='n383' href='#n383'>383</a>
<a id='n384' href='#n384'>384</a>
<a id='n385' href='#n385'>385</a>
<a id='n386' href='#n386'>386</a>
<a id='n387' href='#n387'>387</a>
<a id='n388' href='#n388'>388</a>
<a id='n389' href='#n389'>389</a>
<a id='n390' href='#n390'>390</a>
<a id='n391' href='#n391'>391</a>
<a id='n392' href='#n392'>392</a>
<a id='n393' href='#n393'>393</a>
<a id='n394' href='#n394'>394</a>
<a id='n395' href='#n395'>395</a>
<a id='n396' href='#n396'>396</a>
<a id='n397' href='#n397'>397</a>
<a id='n398' href='#n398'>398</a>
<a id='n399' href='#n399'>399</a>
<a id='n400' href='#n400'>400</a>
<a id='n401' href='#n401'>401</a>
<a id='n402' href='#n402'>402</a>
<a id='n403' href='#n403'>403</a>
<a id='n404' href='#n404'>404</a>
<a id='n405' href='#n405'>405</a>
<a id='n406' href='#n406'>406</a>
<a id='n407' href='#n407'>407</a>
<a id='n408' href='#n408'>408</a>
<a id='n409' href='#n409'>409</a>
<a id='n410' href='#n410'>410</a>
<a id='n411' href='#n411'>411</a>
<a id='n412' href='#n412'>412</a>
<a id='n413' href='#n413'>413</a>
<a id='n414' href='#n414'>414</a>
<a id='n415' href='#n415'>415</a>
<a id='n416' href='#n416'>416</a>
<a id='n417' href='#n417'>417</a>
<a id='n418' href='#n418'>418</a>
<a id='n419' href='#n419'>419</a>
<a id='n420' href='#n420'>420</a>
<a id='n421' href='#n421'>421</a>
<a id='n422' href='#n422'>422</a>
<a id='n423' href='#n423'>423</a>
<a id='n424' href='#n424'>424</a>
<a id='n425' href='#n425'>425</a>
<a id='n426' href='#n426'>426</a>
<a id='n427' href='#n427'>427</a>
<a id='n428' href='#n428'>428</a>
<a id='n429' href='#n429'>429</a>
<a id='n430' href='#n430'>430</a>
<a id='n431' href='#n431'>431</a>
<a id='n432' href='#n432'>432</a>
<a id='n433' href='#n433'>433</a>
<a id='n434' href='#n434'>434</a>
<a id='n435' href='#n435'>435</a>
<a id='n436' href='#n436'>436</a>
<a id='n437' href='#n437'>437</a>
<a id='n438' href='#n438'>438</a>
<a id='n439' href='#n439'>439</a>
<a id='n440' href='#n440'>440</a>
<a id='n441' href='#n441'>441</a>
<a id='n442' href='#n442'>442</a>
<a id='n443' href='#n443'>443</a>
<a id='n444' href='#n444'>444</a>
<a id='n445' href='#n445'>445</a>
<a id='n446' href='#n446'>446</a>
<a id='n447' href='#n447'>447</a>
<a id='n448' href='#n448'>448</a>
<a id='n449' href='#n449'>449</a>
</pre></td>
<td class='lines'><pre><code><style>pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */</style><div class="highlight"><pre><span></span><span class="cm">/* -*- Mode: Java; -*-</span>

<span class="cm">Copyright (c) Xerox Corporation 1998-2002.  All rights reserved.</span>

<span class="cm">Use and copying of this software and preparation of derivative works based</span>
<span class="cm">upon this software are permitted.  Any distribution of this software or</span>
<span class="cm">derivative works must comply with all applicable United States export control</span>
<span class="cm">laws.</span>
<span class="cm"> </span>
<span class="cm">This software is made available AS IS, and Xerox Corporation makes no warranty</span>
<span class="cm">about the software, its performance or its conformity to any specification.</span>

<span class="cm">|&lt;---            this code is formatted to fit into 80 columns             ---&gt;|</span>
<span class="cm">|&lt;---            this code is formatted to fit into 80 columns             ---&gt;|</span>
<span class="cm">|&lt;---            this code is formatted to fit into 80 columns             ---&gt;|</span>

<span class="cm">*/</span>

<span class="kn">package</span><span class="w"> </span><span class="nn">coordination</span><span class="p">;</span>

<span class="kn">import</span><span class="w"> </span><span class="nn">java.util.*</span><span class="p">;</span><span class="w">  </span><span class="c1">//!!!</span>

<span class="cm">/**</span>
<span class="cm"> * The Coordinator class provides the basic functionality for synchronizing</span>
<span class="cm"> * and coordinating different threads upon entering and exiting methods.</span>
<span class="cm"> * It can be used in two different ways:</span>
<span class="cm"> * 1) by instantiating regular coordinator objects that are used by aspects; or</span>
<span class="cm"> * 2) by extending it (sub-classing) with coordinator aspects.</span>
<span class="cm"> * &lt;P&gt;</span>
<span class="cm"> * Method invocations are the smallest units for defining critical sections </span>
<span class="cm"> * and pre-conditions. The use of coordinators, either regular objects or aspect</span>
<span class="cm"> * instances, should always end up by invoking guardedEntry(...) in a</span>
<span class="cm"> * before weave and guardedExit(...) in an after weave for all methods that </span>
<span class="cm"> * need coordination. guardedEntry and guardedExit are the methods that</span>
<span class="cm"> * actually manage the synchronization and coordination constraints given</span>
<span class="cm"> * by their parameters and by pre-existent exclusion markers.</span>
<span class="cm"> * &lt;P&gt;</span>
<span class="cm"> * The synchronization of threads for the execution of critical section </span>
<span class="cm"> * methods in an object is done by marking those methods as self- and/or </span>
<span class="cm"> * mutually-exclusive (addSelfex, addMutex).</span>
<span class="cm"> * Just by itself,  addSelfex(&quot;M&quot;) does not enforce the self-exclusion</span>
<span class="cm"> * of method M - enforcement is done by invoking guardedEntry before</span>
<span class="cm"> * M is executed. Similarly, addMutex(new String[] {&quot;M1&quot;, &quot;M2&quot;}) does </span>
<span class="cm"> * not enforce the mutual exclusion between methods M1 and M2.</span>
<span class="cm"> * &lt;P&gt;</span>
<span class="cm"> * A guardedEntry on a method that has been marked as self-exclusive </span>
<span class="cm"> * ensures that the method is executed in the invoked object by only one thread </span>
<span class="cm"> * at a time. A guardedEntry on a method that has been marked has mutually-</span>
<span class="cm"> * exclusive with other methods ensures that the execution of that method</span>
<span class="cm"> * by a thread in the invoked object temporarily blocks the execution by</span>
<span class="cm"> * other threads of the methods that are in the same mutex set.</span>
<span class="cm"> * &lt;P&gt;</span>
<span class="cm"> * The coordination of threads, i.e. their explicit suspension and </span>
<span class="cm"> * resumption, is done through the use of pre-conditions and coordination </span>
<span class="cm"> * actions that are passed as parameters to guardedEntry and guardedExit</span>
<span class="cm"> * with the form of anonymous classes.</span>
<span class="cm"> */</span>
<span class="kd">public</span><span class="w"> </span><span class="kd">abstract</span><span class="w"> </span><span class="n">aspect</span><span class="w"> </span><span class="n">Coordinator</span><span class="w"> </span><span class="p">{</span>
<span class="w">    </span><span class="kd">private</span><span class="w"> </span><span class="n">Hashtable</span><span class="w"> </span><span class="n">methods</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">null</span><span class="p">;</span>
<span class="w">    </span><span class="kd">private</span><span class="w"> </span><span class="n">Vector</span><span class="w"> </span><span class="n">exclusions</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">null</span><span class="p">;</span>
<span class="w">  </span>
<span class="w">    </span><span class="kd">abstract</span><span class="w"> </span><span class="kd">protected</span><span class="w"> </span><span class="n">pointcut</span><span class="w"> </span><span class="nf">synchronizationPoint</span><span class="p">();</span>

<span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="nf">Coordinator</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w">	</span><span class="n">methods</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Hashtable</span><span class="p">();</span>
<span class="w">	</span><span class="n">exclusions</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Vector</span><span class="p">(</span><span class="mi">5</span><span class="p">);</span>
<span class="w">    </span><span class="p">}</span>

<span class="w">    </span><span class="n">before</span><span class="w"> </span><span class="p">():</span><span class="w"> </span><span class="n">synchronizationPoint</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w">	</span><span class="k">this</span><span class="p">.</span><span class="na">guardedEntry</span><span class="p">(</span><span class="n">thisJoinPointStaticPart</span><span class="p">.</span><span class="na">getSignature</span><span class="p">().</span><span class="na">getName</span><span class="p">());</span>
<span class="w">    </span><span class="p">}</span>
<span class="w">  </span>
<span class="w">    </span><span class="n">after</span><span class="w"> </span><span class="p">():</span><span class="w"> </span><span class="n">synchronizationPoint</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w">	</span><span class="k">this</span><span class="p">.</span><span class="na">guardedExit</span><span class="p">(</span><span class="n">thisJoinPointStaticPart</span><span class="p">.</span><span class="na">getSignature</span><span class="p">().</span><span class="na">getName</span><span class="p">());</span>
<span class="w">    </span><span class="p">}</span>

<span class="w">    </span><span class="cm">/**</span>
<span class="cm">     * Takes a multi-part method name (eg &quot;BoundedBuffer.put&quot;)</span>
<span class="cm">     * and marks that method as self-exclusive.</span>
<span class="cm">     * No checks are made with respect to the existence of the method</span>
<span class="cm">     * whose name is given.</span>
<span class="cm">     */</span>
<span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">synchronized</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">addSelfex</span><span class="p">(</span><span class="n">String</span><span class="w"> </span><span class="n">methName</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">	</span><span class="n">Selfex</span><span class="w"> </span><span class="n">sex</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Selfex</span><span class="w"> </span><span class="p">(</span><span class="n">methName</span><span class="p">);</span>

<span class="w">	</span><span class="c1">// update db of all exclusions in this coordinator</span>
<span class="w">	</span><span class="n">exclusions</span><span class="p">.</span><span class="na">addElement</span><span class="p">(</span><span class="n">sex</span><span class="p">);</span>

<span class="w">	</span><span class="c1">// update local info in method</span>
<span class="w">	</span><span class="n">Method</span><span class="w"> </span><span class="n">aMeth</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">getOrSetMethod</span><span class="p">(</span><span class="n">methName</span><span class="p">);</span>
<span class="w">	</span><span class="n">aMeth</span><span class="p">.</span><span class="na">addExclusion</span><span class="p">(</span><span class="n">sex</span><span class="p">);</span>
<span class="w">    </span><span class="p">}</span>

<span class="w">    </span><span class="cm">/**</span>
<span class="cm">     * Takes a multi-part method name (e.g. &quot;BoundedBuffer.put&quot;)</span>
<span class="cm">     * and removes that method from the list of self-exclusive methods.</span>
<span class="cm">     */</span>
<span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">synchronized</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">removeSelfex</span><span class="p">(</span><span class="n">String</span><span class="w"> </span><span class="n">methName</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">	</span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">exclusions</span><span class="p">.</span><span class="na">size</span><span class="p">();</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">	    </span><span class="n">Exclusion</span><span class="w"> </span><span class="n">sex</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">Exclusion</span><span class="p">)</span><span class="n">exclusions</span><span class="p">.</span><span class="na">elementAt</span><span class="p">(</span><span class="n">i</span><span class="p">);</span>
<span class="w">	    </span><span class="k">if</span><span class="w"> </span><span class="p">((</span><span class="n">sex</span><span class="w"> </span><span class="k">instanceof</span><span class="w"> </span><span class="n">Selfex</span><span class="p">)</span><span class="w"> </span><span class="o">&amp;&amp;</span>
<span class="w">		</span><span class="p">(((</span><span class="n">Selfex</span><span class="p">)</span><span class="n">sex</span><span class="p">).</span><span class="na">methodName</span><span class="p">.</span><span class="na">equals</span><span class="p">(</span><span class="n">methName</span><span class="p">)))</span><span class="w"> </span><span class="p">{</span>

<span class="w">		</span><span class="c1">// update db of all exclusions in this coordinator </span>
<span class="w">		</span><span class="n">exclusions</span><span class="p">.</span><span class="na">removeElementAt</span><span class="p">(</span><span class="n">i</span><span class="p">);</span>

<span class="w">		</span><span class="c1">// update local info in method</span>
<span class="w">		</span><span class="n">Method</span><span class="w"> </span><span class="n">aMeth</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">getOrSetMethod</span><span class="p">(</span><span class="n">methName</span><span class="p">);</span>
<span class="w">		</span><span class="n">aMeth</span><span class="p">.</span><span class="na">removeExclusion</span><span class="p">(</span><span class="n">sex</span><span class="p">);</span>
<span class="w">	    </span><span class="p">}</span>
<span class="w">	</span><span class="p">}</span>
<span class="w">    </span><span class="p">}</span>

<span class="w">    </span><span class="cm">/**</span>
<span class="cm">     * Takes an array of multi-part method names and marks those</span>
<span class="cm">     * methods as mutually exclusive.</span>
<span class="cm">     * No checks are made with respect to the existence of the methods</span>
<span class="cm">     * whose names are given.</span>
<span class="cm">     */</span>
<span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">synchronized</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">addMutex</span><span class="p">(</span><span class="n">String</span><span class="o">[]</span><span class="w"> </span><span class="n">methNames</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">	</span><span class="n">Mutex</span><span class="w"> </span><span class="n">mux</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Mutex</span><span class="p">(</span><span class="n">methNames</span><span class="p">);</span>

<span class="w">	</span><span class="c1">// update db of all exclusions in this coordinator</span>
<span class="w">	</span><span class="n">exclusions</span><span class="p">.</span><span class="na">addElement</span><span class="p">(</span><span class="n">mux</span><span class="p">);</span>

<span class="w">	</span><span class="c1">// update local info in each method</span>
<span class="w">	</span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">methNames</span><span class="p">.</span><span class="na">length</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">	    </span><span class="n">Method</span><span class="w"> </span><span class="n">aMeth</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">getOrSetMethod</span><span class="p">(</span><span class="n">methNames</span><span class="o">[</span><span class="n">i</span><span class="o">]</span><span class="p">);</span>
<span class="w">	    </span><span class="n">aMeth</span><span class="p">.</span><span class="na">addExclusion</span><span class="p">(</span><span class="n">mux</span><span class="p">);</span>
<span class="w">	</span><span class="p">}</span>
<span class="w">    </span><span class="p">}</span>

<span class="w">    </span><span class="cm">/**</span>
<span class="cm">     * Takes an array of multi-part method names that correspond</span>
<span class="cm">     * to an existing mutex set and remove the mutual exclusion constraint.</span>
<span class="cm">     * If the given mutex set does not exist, removeMutex does nothing.</span>
<span class="cm">     */</span>
<span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">synchronized</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">removeMutex</span><span class="p">(</span><span class="n">String</span><span class="o">[]</span><span class="w"> </span><span class="n">methNames</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">	</span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">exclusions</span><span class="p">.</span><span class="na">size</span><span class="p">();</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">	    </span><span class="n">Exclusion</span><span class="w"> </span><span class="n">mux</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">Exclusion</span><span class="p">)</span><span class="n">exclusions</span><span class="p">.</span><span class="na">elementAt</span><span class="p">(</span><span class="n">i</span><span class="p">);</span>
<span class="w">	    </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">mux</span><span class="w"> </span><span class="k">instanceof</span><span class="w"> </span><span class="n">Mutex</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">		</span><span class="kt">boolean</span><span class="w"> </span><span class="n">same</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">true</span><span class="p">;</span>
<span class="w">		</span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">j</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">j</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">methNames</span><span class="p">.</span><span class="na">length</span><span class="p">;</span><span class="w"> </span><span class="n">j</span><span class="o">++</span><span class="p">)</span>
<span class="w">		    </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">methNames</span><span class="o">[</span><span class="n">j</span><span class="o">]</span><span class="p">.</span><span class="na">equals</span><span class="p">(((</span><span class="n">Mutex</span><span class="p">)</span><span class="n">mux</span><span class="p">).</span><span class="na">methodNames</span><span class="o">[</span><span class="n">j</span><span class="o">]</span><span class="p">))</span>
<span class="w">			</span><span class="n">same</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">false</span><span class="p">;</span>
<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">same</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">		    </span><span class="c1">// update db of all exclusions in this coordinator</span>
<span class="w">		    </span><span class="n">exclusions</span><span class="p">.</span><span class="na">removeElementAt</span><span class="p">(</span><span class="n">i</span><span class="p">);</span>

<span class="w">		    </span><span class="c1">// update local info in each method involved</span>
<span class="w">		    </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">j</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">j</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">methNames</span><span class="p">.</span><span class="na">length</span><span class="p">;</span><span class="w"> </span><span class="n">j</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="n">Method</span><span class="w"> </span><span class="n">aMeth</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">getOrSetMethod</span><span class="p">(</span><span class="n">methNames</span><span class="o">[</span><span class="n">j</span><span class="o">]</span><span class="p">);</span>
<span class="w">			</span><span class="n">aMeth</span><span class="p">.</span><span class="na">removeExclusion</span><span class="p">(</span><span class="n">mux</span><span class="p">);</span>
<span class="w">		    </span><span class="p">}</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">	    </span><span class="p">}</span>
<span class="w">	</span><span class="p">}</span>
<span class="w">    </span><span class="p">}</span>

<span class="w">    </span><span class="cm">/**</span>
<span class="cm">     * This method is the guard for enforcing all synchronization and</span>
<span class="cm">     * coordination constraints of a given method, and it should be called</span>
<span class="cm">     * just before the method is executed.</span>
<span class="cm">     * In this form, only the method name is given. The only constraints</span>
<span class="cm">     * checked are the exclusion constraints.</span>
<span class="cm">     * If the method was previousely marked as selfex (through addSelfex),</span>
<span class="cm">     * guardedEntry ensures that the method is executed only when no other </span>
<span class="cm">     * thread is executing it.</span>
<span class="cm">     * If the method was previousely marked as being in one or more mutex</span>
<span class="cm">     * sets, guardedEntry ensures that the method is executed only when no other </span>
<span class="cm">     * thread is executing any of the methods with which the give method is</span>
<span class="cm">     * mutexed.</span>
<span class="cm">     */</span>
<span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">synchronized</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">guardedEntry</span><span class="p">(</span><span class="n">String</span><span class="w"> </span><span class="n">methName</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">	</span><span class="n">guardedEntry</span><span class="p">(</span><span class="n">methName</span><span class="p">,</span><span class="w">  </span><span class="k">new</span><span class="w"> </span><span class="n">Condition</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w">		</span><span class="kd">public</span><span class="w"> </span><span class="kt">boolean</span><span class="w"> </span><span class="nf">checkit</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w">		    </span><span class="k">return</span><span class="w"> </span><span class="kc">true</span><span class="p">;</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">	    </span><span class="p">},</span><span class="w"> </span><span class="kc">null</span><span class="p">);</span>
<span class="w">    </span><span class="p">}</span>

<span class="w">    </span><span class="cm">/**</span>
<span class="cm">     * Just like guardedEntry(String methName), but the given method is executed</span>
<span class="cm">     * only when the given condition is true.</span>
<span class="cm">     * guardedEntry is the guard for enforcing all synchronization and</span>
<span class="cm">     * coordination constraints of a given method, and it should be called</span>
<span class="cm">     * just before the method is executed.</span>
<span class="cm">     * In this form, the method name is given along with a condition. </span>
<span class="cm">     * The constraints checked are the exclusion constraints and whether</span>
<span class="cm">     * the given condition is true.</span>
<span class="cm">     * If the method was previousely marked as selfex (through addSelfex),</span>
<span class="cm">     * guardedEntry ensures that the method is executed only when no other </span>
<span class="cm">     * thread is executing it.</span>
<span class="cm">     * If the method was previousely marked as being in one or more mutex</span>
<span class="cm">     * sets, guardedEntry ensures that the method is executed only when no other </span>
<span class="cm">     * thread is executing any of the methods with which the give method is</span>
<span class="cm">     * mutexed.</span>
<span class="cm">     * If the condition is false, guardedEntry suspends the current thread.</span>
<span class="cm">     * That thread remains suspended until the condition becomes true, in</span>
<span class="cm">     * which case all constraints are rechecked before the method is executed.</span>
<span class="cm">     * When all exclusion constraints are checked and the given condition is</span>
<span class="cm">     * true, the given method is executed.</span>
<span class="cm">     */</span>
<span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">synchronized</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">guardedEntry</span><span class="p">(</span><span class="n">String</span><span class="w"> </span><span class="n">methName</span><span class="p">,</span><span class="w"> </span><span class="n">Condition</span><span class="w"> </span><span class="n">condition</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">	</span><span class="n">guardedEntry</span><span class="p">(</span><span class="n">methName</span><span class="p">,</span><span class="w"> </span><span class="n">condition</span><span class="p">,</span><span class="w"> </span><span class="kc">null</span><span class="p">);</span>
<span class="w">    </span><span class="p">}</span>

<span class="w">    </span><span class="cm">/**</span>
<span class="cm">     * Just like guardedEntry(String methName), but with an additional</span>
<span class="cm">     * coordination action that is executed before the given method is</span>
<span class="cm">     * executed.</span>
<span class="cm">     * guardedEntry is the guard for enforcing all synchronization and</span>
<span class="cm">     * coordination constraints of a given method, and it should be called</span>
<span class="cm">     * just before the method is executed.</span>
<span class="cm">     * In this form, the method name is given along with a coordination action. </span>
<span class="cm">     * The only constraints checked are the exclusion constraints.</span>
<span class="cm">     * If the method was previousely marked as selfex (through addSelfex),</span>
<span class="cm">     * guardedEntry ensures that the method is executed only when no other </span>
<span class="cm">     * thread is executing it.</span>
<span class="cm">     * If the method was previousely marked as being in one or more mutex</span>
<span class="cm">     * sets, guardedEntry ensures that the method is executed only when no other </span>
<span class="cm">     * thread is executing any of the methods with which the give method is</span>
<span class="cm">     * mutexed.</span>
<span class="cm">     * The given coordination action is executed just before the given method </span>
<span class="cm">     * is executed.</span>
<span class="cm">     */</span>
<span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">synchronized</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">guardedEntry</span><span class="p">(</span><span class="n">String</span><span class="w"> </span><span class="n">methName</span><span class="p">,</span><span class="w"> </span>
<span class="w">					  </span><span class="n">CoordinationAction</span><span class="w"> </span><span class="n">action</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">	</span><span class="n">guardedEntry</span><span class="p">(</span><span class="n">methName</span><span class="p">,</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Condition</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w">		</span><span class="kd">public</span><span class="w"> </span><span class="kt">boolean</span><span class="w"> </span><span class="nf">checkit</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w">		    </span><span class="k">return</span><span class="w"> </span><span class="kc">true</span><span class="p">;</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">	    </span><span class="p">},</span><span class="w"> </span>
<span class="w">		     </span><span class="n">action</span><span class="p">);</span>
<span class="w">    </span><span class="p">}</span>

<span class="w">    </span><span class="cm">/**</span>
<span class="cm">     * Just like guardedEntry(String methName), but the given method is executed</span>
<span class="cm">     * only when the given condition is true; the additional</span>
<span class="cm">     * coordination action that is executed before the given method is</span>
<span class="cm">     * executed.</span>
<span class="cm">     * guardedEntry is the guard for enforcing all synchronization and</span>
<span class="cm">     * coordination constraints of a given method, and it should be called</span>
<span class="cm">     * just before the method is executed.</span>
<span class="cm">     * In this form, the method name is given along with a condition and</span>
<span class="cm">     * a coordination action. </span>
<span class="cm">     * The constraints checked are the exclusion constraints and whether the</span>
<span class="cm">     * given condition is true.</span>
<span class="cm">     * If the method was previousely marked as selfex (through addSelfex),</span>
<span class="cm">     * guardedEntry ensures that the method is executed only when no other </span>
<span class="cm">     * thread is executing it.</span>
<span class="cm">     * If the method was previousely marked as being in one or more mutex</span>
<span class="cm">     * sets, guardedEntry ensures that the method is executed only when no other </span>
<span class="cm">     * thread is executing any of the methods with which the give method is</span>
<span class="cm">     * mutexed.</span>
<span class="cm">     * If the condition is false, guardedEntry suspends the current thread.</span>
<span class="cm">     * That thread remains suspended until the condition becomes true, in</span>
<span class="cm">     * which case all constraints are rechecked before the method is executed.</span>
<span class="cm">     * When all exclusion constraints are checked and the given condition is</span>
<span class="cm">     * true, the given method is executed.</span>
<span class="cm">     * The given coordination action is executed just before the given method </span>
<span class="cm">     * is executed.</span>
<span class="cm">     */</span>
<span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">synchronized</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">guardedEntry</span><span class="p">(</span><span class="n">String</span><span class="w"> </span><span class="n">methName</span><span class="p">,</span><span class="w"> </span>
<span class="w">					  </span><span class="n">Condition</span><span class="w"> </span><span class="n">condition</span><span class="p">,</span>
<span class="w">					  </span><span class="n">CoordinationAction</span><span class="w"> </span><span class="n">action</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">	</span><span class="n">Method</span><span class="w"> </span><span class="n">aMeth</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">getOrSetMethod</span><span class="p">(</span><span class="n">methName</span><span class="p">);</span>
<span class="w">	</span><span class="kt">boolean</span><span class="w"> </span><span class="n">canGo</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">false</span><span class="p">;</span>

<span class="w">	</span><span class="c1">// test pre-conditions for entering the method</span>
<span class="w">	</span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">canGo</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">	    </span><span class="n">canGo</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">true</span><span class="p">;</span>
<span class="w">	    </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">aMeth</span><span class="p">.</span><span class="na">exes</span><span class="p">.</span><span class="na">size</span><span class="p">()</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">canGo</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span>
<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="p">((</span><span class="n">Exclusion</span><span class="p">)</span><span class="n">aMeth</span><span class="p">.</span><span class="na">exes</span><span class="p">.</span><span class="na">elementAt</span><span class="p">(</span><span class="n">i</span><span class="p">)).</span><span class="na">testExclusion</span><span class="p">(</span><span class="n">aMeth</span><span class="p">.</span><span class="na">name</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
<span class="w">		    </span><span class="n">canGo</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">false</span><span class="p">;</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">	    </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">canGo</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="o">!</span><span class="n">condition</span><span class="p">.</span><span class="na">checkit</span><span class="p">())</span><span class="w"> </span><span class="p">{</span>
<span class="w">		</span><span class="n">canGo</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">false</span><span class="p">;</span>
<span class="w">	    </span><span class="p">}</span>
<span class="w">	    </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">canGo</span><span class="p">)</span>
<span class="w">		</span><span class="k">try</span><span class="w"> </span><span class="p">{</span>
<span class="w">		    </span><span class="n">wait</span><span class="p">();</span>
<span class="w">		</span><span class="p">}</span><span class="w"> </span><span class="k">catch</span><span class="w"> </span><span class="p">(</span><span class="n">InterruptedException</span><span class="w"> </span><span class="n">e</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="p">}</span>
<span class="w">	</span><span class="p">}</span>

<span class="w">	</span><span class="c1">// OK.</span>
<span class="w">	</span><span class="n">enterMethod</span><span class="p">(</span><span class="n">aMeth</span><span class="p">,</span><span class="w"> </span><span class="n">action</span><span class="p">);</span>
<span class="w">    </span><span class="p">}</span>

<span class="w">    </span><span class="cm">/**</span>
<span class="cm">     * This method is similar to guardedEntry, but it takes</span>
<span class="cm">     * an additional parameter - the milliseconds after which any suspension</span>
<span class="cm">     * will abort with a timeout.</span>
<span class="cm">     */</span>
<span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">synchronized</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">guardedEntryWithTimeout</span><span class="p">(</span><span class="n">String</span><span class="w"> </span><span class="n">methName</span><span class="p">,</span>
<span class="w">						     </span><span class="kt">long</span><span class="w"> </span><span class="n">millis</span><span class="p">)</span><span class="w"> </span>
<span class="w">				 </span><span class="kd">throws</span><span class="w"> </span><span class="n">TimeoutException</span><span class="w"> </span><span class="p">{</span>
<span class="w">	</span><span class="n">guardedEntryWithTimeout</span><span class="p">(</span><span class="n">methName</span><span class="p">,</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Condition</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w">		</span><span class="kd">public</span><span class="w"> </span><span class="kt">boolean</span><span class="w"> </span><span class="nf">checkit</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w">		    </span><span class="k">return</span><span class="w"> </span><span class="kc">true</span><span class="p">;</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">	    </span><span class="p">},</span><span class="w"> </span><span class="kc">null</span><span class="p">,</span><span class="w"> </span><span class="n">millis</span><span class="p">);</span>
<span class="w">    </span><span class="p">}</span>

<span class="w">    </span><span class="cm">/**</span>
<span class="cm">     * This method is similar to guardedEntry, but it takes</span>
<span class="cm">     * an additional parameter - the milliseconds after which any suspension</span>
<span class="cm">     * will abort with a timeout.</span>
<span class="cm">     */</span>
<span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">synchronized</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">guardedEntryWithTimeout</span><span class="p">(</span><span class="n">String</span><span class="w"> </span><span class="n">methName</span><span class="p">,</span><span class="w"> </span>
<span class="w">						     </span><span class="n">Condition</span><span class="w"> </span><span class="n">condition</span><span class="p">,</span>
<span class="w">						     </span><span class="kt">long</span><span class="w"> </span><span class="n">millis</span><span class="p">)</span><span class="w"> </span>
<span class="w">				 </span><span class="kd">throws</span><span class="w"> </span><span class="n">TimeoutException</span><span class="w"> </span><span class="p">{</span>
<span class="w">	</span><span class="n">guardedEntryWithTimeout</span><span class="p">(</span><span class="n">methName</span><span class="p">,</span><span class="w"> </span><span class="n">condition</span><span class="p">,</span><span class="w"> </span><span class="kc">null</span><span class="p">,</span><span class="w"> </span><span class="n">millis</span><span class="p">);</span>
<span class="w">    </span><span class="p">}</span>

<span class="w">    </span><span class="cm">/**</span>
<span class="cm">     * This method is similar to guardedEntry, but it takes</span>
<span class="cm">     * an additional parameter - the milliseconds after which any suspension</span>
<span class="cm">     * will abort with a timeout.</span>
<span class="cm">     */</span>
<span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">synchronized</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">guardedEntryWithTimeout</span><span class="p">(</span><span class="n">String</span><span class="w"> </span><span class="n">methName</span><span class="p">,</span><span class="w"> </span>
<span class="w">						     </span><span class="n">CoordinationAction</span><span class="w"> </span><span class="n">action</span><span class="p">,</span>
<span class="w">						     </span><span class="kt">long</span><span class="w"> </span><span class="n">millis</span><span class="p">)</span><span class="w"> </span>
<span class="w">				 </span><span class="kd">throws</span><span class="w"> </span><span class="n">TimeoutException</span><span class="w"> </span><span class="p">{</span>
<span class="w">	</span><span class="n">guardedEntryWithTimeout</span><span class="p">(</span><span class="n">methName</span><span class="p">,</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Condition</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w">		</span><span class="kd">public</span><span class="w"> </span><span class="kt">boolean</span><span class="w"> </span><span class="nf">checkit</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w">		    </span><span class="k">return</span><span class="w"> </span><span class="kc">true</span><span class="p">;</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">	    </span><span class="p">},</span><span class="w"> </span><span class="n">action</span><span class="p">,</span><span class="w"> </span><span class="n">millis</span><span class="p">);</span>
<span class="w">    </span><span class="p">}</span>

<span class="w">    </span><span class="cm">/**</span>
<span class="cm">     * This method is similar to guardedEntry, but it takes</span>
<span class="cm">     * an additional parameter - the milliseconds after which any suspension</span>
<span class="cm">     * will abort with a timeout.</span>
<span class="cm">     */</span>
<span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">synchronized</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">guardedEntryWithTimeout</span><span class="p">(</span><span class="n">String</span><span class="w"> </span><span class="n">methName</span><span class="p">,</span><span class="w"> </span>
<span class="w">						     </span><span class="n">Condition</span><span class="w"> </span><span class="n">condition</span><span class="p">,</span>
<span class="w">						     </span><span class="n">CoordinationAction</span><span class="w"> </span><span class="n">action</span><span class="p">,</span>
<span class="w">						     </span><span class="kt">long</span><span class="w"> </span><span class="n">millis</span><span class="p">)</span><span class="w"> </span>
<span class="w">				 </span><span class="kd">throws</span><span class="w"> </span><span class="n">TimeoutException</span><span class="w"> </span><span class="p">{</span>

<span class="w">	</span><span class="n">Method</span><span class="w"> </span><span class="n">aMeth</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">getOrSetMethod</span><span class="p">(</span><span class="n">methName</span><span class="p">);</span>
<span class="w">	</span><span class="kt">boolean</span><span class="w"> </span><span class="n">canGo</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">false</span><span class="p">;</span>
<span class="w">	</span><span class="kt">long</span><span class="w"> </span><span class="n">waitTime</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">millis</span><span class="p">;</span>
<span class="w">	</span><span class="kt">long</span><span class="w"> </span><span class="n">startTime</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">System</span><span class="p">.</span><span class="na">currentTimeMillis</span><span class="p">();</span>

<span class="w">	</span><span class="c1">// test pre-conditions for entering the method</span>
<span class="w">	</span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">canGo</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">	    </span><span class="n">canGo</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">true</span><span class="p">;</span>
<span class="w">	    </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">aMeth</span><span class="p">.</span><span class="na">exes</span><span class="p">.</span><span class="na">size</span><span class="p">()</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">canGo</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span>
<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">((</span><span class="o">!</span><span class="p">((</span><span class="n">Exclusion</span><span class="p">)</span><span class="n">aMeth</span><span class="p">.</span><span class="na">exes</span><span class="p">.</span><span class="na">elementAt</span><span class="p">(</span><span class="n">i</span><span class="p">)).</span><span class="na">testExclusion</span><span class="p">(</span><span class="n">aMeth</span><span class="p">.</span><span class="na">name</span><span class="p">))</span><span class="w"> </span><span class="o">||</span>
<span class="w">		    </span><span class="p">(</span><span class="o">!</span><span class="n">condition</span><span class="p">.</span><span class="na">checkit</span><span class="p">()))</span><span class="w"> </span><span class="p">{</span>
<span class="w">		    </span><span class="n">canGo</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">false</span><span class="p">;</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">	    </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">canGo</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">		</span><span class="k">try</span><span class="w"> </span><span class="p">{</span>
<span class="w">		    </span><span class="n">wait</span><span class="p">(</span><span class="n">waitTime</span><span class="p">);</span>
<span class="w">		</span><span class="p">}</span><span class="w"> </span><span class="k">catch</span><span class="w"> </span><span class="p">(</span><span class="n">InterruptedException</span><span class="w"> </span><span class="n">e</span><span class="p">)</span><span class="w"> </span><span class="p">{}</span>

<span class="w">		</span><span class="kt">long</span><span class="w"> </span><span class="n">now</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">System</span><span class="p">.</span><span class="na">currentTimeMillis</span><span class="p">();</span>
<span class="w">		</span><span class="kt">long</span><span class="w"> </span><span class="n">timeSoFar</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">now</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">startTime</span><span class="p">;</span>
<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">timeSoFar</span><span class="w"> </span><span class="o">&gt;=</span><span class="w"> </span><span class="n">millis</span><span class="p">)</span><span class="w"> </span><span class="c1">// timeout!</span>
<span class="w">		    </span><span class="k">throw</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">TimeoutException</span><span class="p">(</span><span class="n">timeSoFar</span><span class="p">);</span>
<span class="w">		</span><span class="k">else</span><span class="w"> </span><span class="c1">// adjust time</span>
<span class="w">		    </span><span class="n">waitTime</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">millis</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">timeSoFar</span><span class="p">;</span>
<span class="w">	    </span><span class="p">}</span>
<span class="w">	</span><span class="p">}</span>

<span class="w">	</span><span class="c1">// OK.</span>
<span class="w">	</span><span class="n">enterMethod</span><span class="p">(</span><span class="n">aMeth</span><span class="p">,</span><span class="w"> </span><span class="n">action</span><span class="p">);</span>
<span class="w">    </span><span class="p">}</span>

<span class="w">    </span><span class="cm">/**</span>
<span class="cm">     * This method provides the means for updating all synchronization and</span>
<span class="cm">     * coordination state after the execution of a given method, and it should be </span>
<span class="cm">     * called after the method is executed.</span>
<span class="cm">     * In this form, only the method name is given.</span>
<span class="cm">     * The synchronization state for self- and mutual-exclusion is </span>
<span class="cm">     * automatically upadted.</span>
<span class="cm">     */</span>
<span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">synchronized</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">guardedExit</span><span class="p">(</span><span class="n">String</span><span class="w"> </span><span class="n">methName</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">	</span><span class="n">guardedExit</span><span class="p">(</span><span class="n">methName</span><span class="p">,</span><span class="w"> </span><span class="kc">null</span><span class="p">);</span>
<span class="w">    </span><span class="p">}</span>

<span class="w">    </span><span class="cm">/**</span>
<span class="cm">     * Just like guardedExit(String methName) but with an additional</span>
<span class="cm">     * coordination action that is executed.</span>
<span class="cm">     * guardedExit provides the means for updating all synchronization and</span>
<span class="cm">     * coordination state after the execution of a given method, and it should be </span>
<span class="cm">     * called after the method is executed.</span>
<span class="cm">     * In this form, the method name is given along with a coordination action.</span>
<span class="cm">     * The synchronization state for self- and mutual-exclusion is </span>
<span class="cm">     * automatically upadted.</span>
<span class="cm">     * The given coordination action is executed.</span>
<span class="cm">     */</span>
<span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">synchronized</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">guardedExit</span><span class="p">(</span><span class="n">String</span><span class="w"> </span><span class="n">methName</span><span class="p">,</span><span class="w"> </span>
<span class="w">					 </span><span class="n">CoordinationAction</span><span class="w"> </span><span class="n">action</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">	</span><span class="n">Method</span><span class="w"> </span><span class="n">aMeth</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">getOrSetMethod</span><span class="p">(</span><span class="n">methName</span><span class="p">);</span>

<span class="w">	</span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">aMeth</span><span class="p">.</span><span class="na">exes</span><span class="p">.</span><span class="na">size</span><span class="p">();</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span>
<span class="w">	    </span><span class="p">((</span><span class="n">Exclusion</span><span class="p">)</span><span class="n">aMeth</span><span class="p">.</span><span class="na">exes</span><span class="p">.</span><span class="na">elementAt</span><span class="p">(</span><span class="n">i</span><span class="p">)).</span><span class="na">exitExclusion</span><span class="p">(</span><span class="n">methName</span><span class="p">);</span>
<span class="w">	</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">action</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">null</span><span class="p">)</span><span class="w"> </span><span class="n">action</span><span class="p">.</span><span class="na">doit</span><span class="p">();</span>
<span class="w">	</span><span class="n">notifyAll</span><span class="p">();</span>
<span class="w">    </span><span class="p">}</span>

<span class="w">    </span><span class="kd">private</span><span class="w"> </span><span class="n">Method</span><span class="w"> </span><span class="nf">getOrSetMethod</span><span class="p">(</span><span class="n">String</span><span class="w"> </span><span class="n">methName</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">	</span><span class="n">Method</span><span class="w"> </span><span class="n">aMeth</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">null</span><span class="p">;</span>
<span class="w">	</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">methods</span><span class="p">.</span><span class="na">containsKey</span><span class="p">(</span><span class="n">methName</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
<span class="w">	    </span><span class="n">methods</span><span class="p">.</span><span class="na">put</span><span class="p">(</span><span class="n">methName</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="n">aMeth</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Method</span><span class="p">(</span><span class="n">methName</span><span class="p">)));</span>
<span class="w">	</span><span class="p">}</span>
<span class="w">	</span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<span class="w">	    </span><span class="n">aMeth</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">Method</span><span class="p">)</span><span class="w"> </span><span class="n">methods</span><span class="p">.</span><span class="na">get</span><span class="p">(</span><span class="n">methName</span><span class="p">);</span>
<span class="w">	</span><span class="p">}</span>
<span class="w">	</span><span class="k">return</span><span class="w"> </span><span class="n">aMeth</span><span class="p">;</span>
<span class="w">    </span><span class="p">}</span>

<span class="w">    </span><span class="kd">private</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">enterMethod</span><span class="p">(</span><span class="n">Method</span><span class="w"> </span><span class="n">aMeth</span><span class="p">,</span><span class="w"> </span><span class="n">CoordinationAction</span><span class="w"> </span><span class="n">action</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">	</span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">aMeth</span><span class="p">.</span><span class="na">exes</span><span class="p">.</span><span class="na">size</span><span class="p">();</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span>
<span class="w">	    </span><span class="p">((</span><span class="n">Exclusion</span><span class="p">)</span><span class="n">aMeth</span><span class="p">.</span><span class="na">exes</span><span class="p">.</span><span class="na">elementAt</span><span class="p">(</span><span class="n">i</span><span class="p">)).</span><span class="na">enterExclusion</span><span class="p">(</span><span class="n">aMeth</span><span class="p">.</span><span class="na">name</span><span class="p">);</span>

<span class="w">	</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">action</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">null</span><span class="p">)</span><span class="w"> </span><span class="n">action</span><span class="p">.</span><span class="na">doit</span><span class="p">();</span>
<span class="w">    </span><span class="p">}</span>



<span class="p">}</span>

<span class="kd">class</span> <span class="nc">Method</span><span class="w"> </span><span class="p">{</span>
<span class="w">  </span><span class="n">String</span><span class="w"> </span><span class="n">name</span><span class="p">;</span>
<span class="w">  </span><span class="n">Vector</span><span class="w"> </span><span class="n">exes</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Vector</span><span class="p">(</span><span class="mi">3</span><span class="p">);</span>

<span class="w">  </span><span class="n">Method</span><span class="p">(</span><span class="n">String</span><span class="w"> </span><span class="n">n</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">    </span><span class="n">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">n</span><span class="p">;</span>
<span class="w">  </span><span class="p">}</span>

<span class="w">  </span><span class="kt">void</span><span class="w"> </span><span class="nf">addExclusion</span><span class="p">(</span><span class="n">Exclusion</span><span class="w"> </span><span class="n">ex</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">    </span><span class="n">exes</span><span class="p">.</span><span class="na">addElement</span><span class="p">(</span><span class="n">ex</span><span class="p">);</span>
<span class="w">  </span><span class="p">}</span>

<span class="w">  </span><span class="kt">void</span><span class="w"> </span><span class="nf">removeExclusion</span><span class="p">(</span><span class="n">Exclusion</span><span class="w"> </span><span class="n">ex</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">    </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">exes</span><span class="p">.</span><span class="na">size</span><span class="p">();</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">      </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">exes</span><span class="p">.</span><span class="na">elementAt</span><span class="p">(</span><span class="n">i</span><span class="p">)</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">ex</span><span class="p">)</span>
<span class="w">	</span><span class="n">exes</span><span class="p">.</span><span class="na">removeElementAt</span><span class="p">(</span><span class="n">i</span><span class="p">);</span>
<span class="w">    </span><span class="p">}</span>
<span class="w">  </span><span class="p">}</span>
<span class="p">}</span>
</pre></div>
</code></pre></td></tr></table>
</div> <!-- class=content -->
<div class='footer'>generated by <a href='https://git.zx2c4.com/cgit/about/'>cgit v1.2.3</a> (<a href='https://git-scm.com/'>git 2.39.1</a>) at 2025-08-10 10:28:59 +0000</div>
</div> <!-- id=cgit -->
</body>
</html>
