<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<id>tag:old.nabble.com,2006:forum-3575</id>
	<title>Nabble - jikesrvm-core</title>
	<updated>2009-11-02T07:46:01Z</updated>
	<link rel="self" type="application/atom+xml" href="http://old.nabble.com/jikesrvm-core-f3575.xml" />
	<link rel="alternate" type="text/html" href="http://old.nabble.com/jikesrvm-core-f3575.html" />
	<subtitle type="html">Mailing list archive for jikesrvm-core</subtitle>
	
<entry>
	<id>tag:old.nabble.com,2006:post-26165913</id>
	<title>Re: [rvm-core] modifiers may not necessary</title>
	<published>2009-11-02T07:46:01Z</published>
	<updated>2009-11-02T07:46:01Z</updated>
	<author>
		<name>vondart</name>
	</author>
	<content type="html">&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;div style=&quot;font-family:arial,helvetica,sans-serif;font-size:12pt&quot;&gt;I will try to write the code first, and finally optimize it.&lt;br&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;span style=&quot;font-weight: bold; font-style: italic; color: rgb(0, 0, 255);&quot;&gt;DaFENG&lt;/span&gt;&lt;br&gt;&lt;span style=&quot;color: rgb(0, 255, 128); font-style: italic;&quot;&gt;Coder&lt;/span&gt;&lt;br style=&quot;color: rgb(0, 255, 128); font-style: italic;&quot;&gt;&lt;span style=&quot;color: rgb(0, 255, 128); font-style: italic;&quot;&gt;Telecommunication &amp;amp;&amp;amp; Network Industry&lt;/span&gt;&lt;br style=&quot;color: rgb(0, 255, 128); font-style: italic;&quot;&gt;&lt;span style=&quot;color: rgb(0, 255, 128); font-style: italic;&quot;&gt;Pudong&lt;/span&gt;&lt;br style=&quot;color: rgb(0, 255, 128); font-style: italic;&quot;&gt;&lt;span style=&quot;color: rgb(0, 255, 128); font-style: italic;&quot;&gt;Shanghai&lt;/span&gt;&lt;br style=&quot;color: rgb(0, 255, 128); font-style: italic;&quot;&gt;&lt;span style=&quot;color: rgb(0, 255, 128); font-style:
 italic;&quot;&gt;China&lt;br&gt;&lt;/span&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div style=&quot;font-family: arial,helvetica,sans-serif; font-size: 12pt;&quot;&gt;&lt;br&gt;&lt;div style=&quot;font-family: arial,helvetica,sans-serif; font-size: 13px;&quot;&gt;&lt;font face=&quot;Tahoma&quot; size=&quot;2&quot;&gt;&lt;hr size=&quot;1&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;From:&lt;/span&gt;&lt;/b&gt; Eliot Moss &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26165913&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;moss@...&lt;/a&gt;&amp;gt;&lt;br&gt;&lt;b&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;To:&lt;/span&gt;&lt;/b&gt; Discussion of day-to-day development and design among JikesRVM core team members &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26165913&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;jikesrvm-core@...&lt;/a&gt;&amp;gt;&lt;br&gt;&lt;b&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Sent:&lt;/span&gt;&lt;/b&gt; Mon, November 2, 2009 2:44:10 AM&lt;br&gt;&lt;b&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Subject:&lt;/span&gt;&lt;/b&gt; Re: [rvm-core] modifiers may not necessary&lt;br&gt;&lt;/font&gt;&lt;br&gt;
Da Feng wrote:&lt;br&gt;&amp;gt; org.mmtk.utility.alloc.BumpPointer;&lt;br&gt;&amp;gt; contains two fields,that I want to reset values. So I put into a &lt;br&gt;&amp;gt; subclass constructor, functions to assign new value to those fields. But &lt;br&gt;&amp;gt; this requires the fields not to be &quot;static final&quot;.&lt;br&gt;&amp;gt; Should the modifiers necessarily be there?&lt;br&gt;&amp;gt; &lt;br&gt;&amp;gt; protected /*static final*/ int LOG_BLOCK_SIZE = LOG_BYTES_IN_PAGE + 3;&lt;br&gt;&amp;gt;&amp;nbsp;  protected /*static final*/ Word BLOCK_MASK = &lt;br&gt;&amp;gt; Word.one().lsh(LOG_BLOCK_SIZE).minus(Word.one());&lt;br&gt;&lt;br&gt;Yes! If you want decent performance these should be static final.&lt;br&gt;I can;t say what the performance hit will be, but possibly&lt;br&gt;substantial. Note that if you want to change them in a subclass,&lt;br&gt;the subclass can use its own static final, and the usual scope&lt;br&gt;rules will give preference to those, in the subclass (IIRC the&lt;br&gt;Java semantics).&lt;br&gt;&lt;br&gt;Do you think you want to change them dynamically? This could
 be&lt;br&gt;confusing and costly.&lt;br&gt;&lt;br&gt;On the other hand, if you just want them to be different from the&lt;br&gt;default, either just change the 3 to some other value, or, it can&lt;br&gt;be a variable AT BUILD TIME that then sets the values when the&lt;br&gt;class is initialized.&lt;br&gt;&lt;br&gt;Hope this helps; I expect others will have more to say ....&lt;br&gt;&lt;br&gt;Best wishes -- Eliot Moss&lt;br&gt;&lt;br&gt;------------------------------------------------------------------------------&lt;br&gt;Come build with us! The BlackBerry(R) Developer Conference in SF, CA&lt;br&gt;is the only developer event you need to attend this year. Jumpstart your&lt;br&gt;developing skills, take BlackBerry mobile applications to market and stay &lt;br&gt;ahead of the curve. Join us from November 9 - 12, 2009. Register now!&lt;br&gt;&lt;span&gt;&lt;a target=&quot;_blank&quot; href=&quot;http://p.sf.net/sfu/devconference&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/devconference&lt;/a&gt;&lt;/span&gt;&lt;br&gt;_______________________________________________&lt;br&gt;Jikesrvm-core mailing list&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26165913&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Jikesrvm-core@...&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&lt;/a&gt;&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br&gt;

      &lt;/body&gt;&lt;/html&gt;&lt;br /&gt;------------------------------------------------------------------------------
&lt;br&gt;Come build with us! The BlackBerry(R) Developer Conference in SF, CA
&lt;br&gt;is the only developer event you need to attend this year. Jumpstart your
&lt;br&gt;developing skills, take BlackBerry mobile applications to market and stay 
&lt;br&gt;ahead of the curve. Join us from November 9 - 12, 2009. Register now!
&lt;br&gt;&lt;a href=&quot;http://p.sf.net/sfu/devconference&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/devconference&lt;/a&gt;&lt;br /&gt;_______________________________________________
&lt;br&gt;Jikesrvm-core mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26165913&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Jikesrvm-core@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-rvm-core--modifiers-may-not-necessary-tp26151894p26165913.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26153798</id>
	<title>Re: [rvm-core] modifiers may not necessary</title>
	<published>2009-11-01T11:07:06Z</published>
	<updated>2009-11-01T11:07:06Z</updated>
	<author>
		<name>Filip Pizlo-2</name>
	</author>
	<content type="html">&lt;html&gt;&lt;body style=&quot;word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; &quot;&gt;Hi Da Feng,&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Though I've not performed a performance study on the implications of making these fields not be static final, I believe that you can do it - and you shouldn't see any performance impact. &amp;nbsp;Note that I'm not an expert on this code, either, so perhaps others will have more to say. &amp;nbsp;I may even be contradicted. :-)&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Here's a little background on why you may have to be concerned about the performance implications: if the fields are static final, then the compiler will evaluate the fields' values (i.e. the expressions &quot;LOG_BYTES_IN_PAGE + 3&quot; and &quot;Word.one().lsh(LOG_BLOCK_SIZE).minus(Word.one())&quot;) before the program even executes. &amp;nbsp;Any expressions over those fields may also be evaluated by the compiler. &amp;nbsp;So the relevant use of the BLOCK_MASK in allocSlowOnce:&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;blockSize = Word.fromIntZeroExtend(bytes).plus(BLOCK_MASK).and(BLOCK_MASK.not()).toExtent();&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;will be optimized to something like:&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;blockSize = (bytes + 32767) &amp;amp; -32768;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Where -32768 is a compile-time constant, reflecting BLOCK_MASK.not(). &amp;nbsp;(Assuming that LOG_BLOCK_SIZE is LOG_BYTES_IN_PAGE+3, and LOG_BYTES_IN_PAGE is 12.)&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;If, on the other hand, the BLOCK_MASK field is not &quot;static final&quot;, then this expression will require an additional load of BLOCK_MASK, and additional arithmetic to bitwise-not the BLOCK_MASK. &amp;nbsp;This may not seem like much but can make a huge difference if this is on the critical path.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;But I do not believe that this method is on the critical path. &amp;nbsp;It's the non-inline slow path for allocation ... if you end up in this method you've already paid the price of a mispredicted branch, a non-inline call, and potentially other stuff. &amp;nbsp;So I would say, go ahead and make these fields instance rather than &quot;static final&quot;, and go ahead and make them dynamically configurable. &amp;nbsp;Of course, you may have to worry about concurrency issues (like, if you change the value while someone else is allocating using the same BumpAllocator), but that may not come up if you are already ensuring that your use of BumpAllocator is thread-local.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;-Filip&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;div&gt;&lt;div&gt;On Nov 1, 2009, at 10:24 , Da Feng wrote:&lt;/div&gt;&lt;br class=&quot;Apple-interchange-newline&quot;&gt;&lt;blockquote type=&quot;cite&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; &quot;&gt;&lt;div&gt;&lt;div style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: arial, helvetica, sans-serif; font-size: 12pt; &quot;&gt;org.mmtk.utility.alloc.BumpPointer;&lt;br&gt;contains two fields,that I want to reset values. So I put into a subclass constructor, functions to assign new value to those fields. But this requires the fields not to be &quot;static final&quot;.&lt;br&gt;Should the modifiers necessarily be there?&lt;br&gt;&lt;br&gt;protected /*static final*/ int LOG_BLOCK_SIZE = LOG_BYTES_IN_PAGE + 3;&lt;br&gt;&amp;nbsp; protected /*static final*/ Word BLOCK_MASK = Word.one().lsh(LOG_BLOCK_SIZE).minus(Word.one());&lt;br&gt;&lt;div style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;span style=&quot;font-weight: bold; font-style: italic; color: rgb(0, 0, 255); &quot;&gt;DaFENG&lt;/span&gt;&lt;br&gt;&lt;span style=&quot;color: rgb(0, 255, 128); font-style: italic; &quot;&gt;Coder&lt;/span&gt;&lt;br style=&quot;color: rgb(0, 255, 128); font-style: italic; &quot;&gt;&lt;span style=&quot;color: rgb(0, 255, 128); font-style: italic; &quot;&gt;Telecommunication &amp;amp;&amp;amp; Network Industry&lt;/span&gt;&lt;br style=&quot;color: rgb(0, 255, 128); font-style: italic; &quot;&gt;&lt;span style=&quot;color: rgb(0, 255, 128); font-style: italic; &quot;&gt;Pudong&lt;/span&gt;&lt;br style=&quot;color: rgb(0, 255, 128); font-style: italic; &quot;&gt;&lt;span style=&quot;color: rgb(0, 255, 128); font-style: italic; &quot;&gt;Shanghai&lt;/span&gt;&lt;br style=&quot;color: rgb(0, 255, 128); font-style: italic; &quot;&gt;&lt;span style=&quot;color: rgb(0, 255, 128); font-style: italic; &quot;&gt;China&lt;br&gt;&lt;/span&gt;&lt;div style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;br&gt;------------------------------------------------------------------------------&lt;br&gt;Come build with us! The BlackBerry(R) Developer Conference in SF, CA&lt;br&gt;is the only developer event you need to attend this year. Jumpstart your&lt;br&gt;developing skills, take BlackBerry mobile applications to market and stay&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;br&gt;ahead of the curve. Join us from November 9 - 12, 2009. Register now!&lt;br&gt;&lt;a href=&quot;http://p.sf.net/sfu/devconference_______________________________________________&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/devconference_______________________________________________&lt;/a&gt;&lt;br&gt;Jikesrvm-core mailing list&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26153798&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Jikesrvm-core@...&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&lt;/a&gt;&lt;br&gt;&lt;/div&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;/body&gt;&lt;/html&gt;&lt;br /&gt;------------------------------------------------------------------------------
&lt;br&gt;Come build with us! The BlackBerry(R) Developer Conference in SF, CA
&lt;br&gt;is the only developer event you need to attend this year. Jumpstart your
&lt;br&gt;developing skills, take BlackBerry mobile applications to market and stay 
&lt;br&gt;ahead of the curve. Join us from November 9 - 12, 2009. Register now!
&lt;br&gt;&lt;a href=&quot;http://p.sf.net/sfu/devconference&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/devconference&lt;/a&gt;&lt;br /&gt;_______________________________________________
&lt;br&gt;Jikesrvm-core mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26153798&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Jikesrvm-core@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-rvm-core--modifiers-may-not-necessary-tp26151894p26153798.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26153578</id>
	<title>Re: [rvm-core] modifiers may not necessary</title>
	<published>2009-11-01T10:44:10Z</published>
	<updated>2009-11-01T10:44:10Z</updated>
	<author>
		<name>Eliot Moss</name>
	</author>
	<content type="html">Da Feng wrote:
&lt;br&gt;&amp;gt; org.mmtk.utility.alloc.BumpPointer;
&lt;br&gt;&amp;gt; contains two fields,that I want to reset values. So I put into a 
&lt;br&gt;&amp;gt; subclass constructor, functions to assign new value to those fields. But 
&lt;br&gt;&amp;gt; this requires the fields not to be &amp;quot;static final&amp;quot;.
&lt;br&gt;&amp;gt; Should the modifiers necessarily be there?
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; protected /*static final*/ int LOG_BLOCK_SIZE = LOG_BYTES_IN_PAGE + 3;
&lt;br&gt;&amp;gt; &amp;nbsp; protected /*static final*/ Word BLOCK_MASK = 
&lt;br&gt;&amp;gt; Word.one().lsh(LOG_BLOCK_SIZE).minus(Word.one());
&lt;br&gt;&lt;br&gt;Yes! If you want decent performance these should be static final.
&lt;br&gt;I can;t say what the performance hit will be, but possibly
&lt;br&gt;substantial. Note that if you want to change them in a subclass,
&lt;br&gt;the subclass can use its own static final, and the usual scope
&lt;br&gt;rules will give preference to those, in the subclass (IIRC the
&lt;br&gt;Java semantics).
&lt;br&gt;&lt;br&gt;Do you think you want to change them dynamically? This could be
&lt;br&gt;confusing and costly.
&lt;br&gt;&lt;br&gt;On the other hand, if you just want them to be different from the
&lt;br&gt;default, either just change the 3 to some other value, or, it can
&lt;br&gt;be a variable AT BUILD TIME that then sets the values when the
&lt;br&gt;class is initialized.
&lt;br&gt;&lt;br&gt;Hope this helps; I expect others will have more to say ....
&lt;br&gt;&lt;br&gt;Best wishes -- Eliot Moss
&lt;br&gt;&lt;br&gt;------------------------------------------------------------------------------
&lt;br&gt;Come build with us! The BlackBerry(R) Developer Conference in SF, CA
&lt;br&gt;is the only developer event you need to attend this year. Jumpstart your
&lt;br&gt;developing skills, take BlackBerry mobile applications to market and stay 
&lt;br&gt;ahead of the curve. Join us from November 9 - 12, 2009. Register now!
&lt;br&gt;&lt;a href=&quot;http://p.sf.net/sfu/devconference&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/devconference&lt;/a&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;Jikesrvm-core mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26153578&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Jikesrvm-core@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-rvm-core--modifiers-may-not-necessary-tp26151894p26153578.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26151894</id>
	<title>[rvm-core] modifiers may not necessary</title>
	<published>2009-11-01T07:24:05Z</published>
	<updated>2009-11-01T07:24:05Z</updated>
	<author>
		<name>vondart</name>
	</author>
	<content type="html">&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;div style=&quot;font-family:arial,helvetica,sans-serif;font-size:12pt&quot;&gt;org.mmtk.utility.alloc.BumpPointer;&lt;br&gt;contains two fields,that I want to reset values. So I put into a subclass constructor, functions to assign new value to those fields. But this requires the fields not to be &quot;static final&quot;.&lt;br&gt;Should the modifiers necessarily be there?&lt;br&gt;&lt;br&gt;protected /*static final*/ int LOG_BLOCK_SIZE = LOG_BYTES_IN_PAGE + 3;&lt;br&gt;&amp;nbsp; protected /*static final*/ Word BLOCK_MASK = Word.one().lsh(LOG_BLOCK_SIZE).minus(Word.one());&lt;br&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;span style=&quot;font-weight: bold; font-style: italic; color: rgb(0, 0, 255);&quot;&gt;DaFENG&lt;/span&gt;&lt;br&gt;&lt;span style=&quot;color: rgb(0, 255, 128); font-style: italic;&quot;&gt;Coder&lt;/span&gt;&lt;br style=&quot;color: rgb(0, 255, 128); font-style: italic;&quot;&gt;&lt;span style=&quot;color: rgb(0, 255, 128); font-style: italic;&quot;&gt;Telecommunication &amp;amp;&amp;amp; Network Industry&lt;/span&gt;&lt;br style=&quot;color: rgb(0, 255, 128); font-style: italic;&quot;&gt;&lt;span style=&quot;color: rgb(0, 255, 128); font-style: italic;&quot;&gt;Pudong&lt;/span&gt;&lt;br style=&quot;color: rgb(0, 255, 128); font-style: italic;&quot;&gt;&lt;span style=&quot;color: rgb(0, 255, 128); font-style: italic;&quot;&gt;Shanghai&lt;/span&gt;&lt;br style=&quot;color: rgb(0, 255, 128); font-style: italic;&quot;&gt;&lt;span style=&quot;color: rgb(0, 255, 128); font-style: italic;&quot;&gt;China&lt;br&gt;&lt;/span&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;
&lt;!-- cg10.c1.mail.mud.yahoo.com compressed/chunked Sun Nov  1 06:52:22 PST 2009 --&gt;
&lt;/div&gt;&lt;br&gt;

      &lt;/body&gt;&lt;/html&gt;&lt;br /&gt;------------------------------------------------------------------------------
&lt;br&gt;Come build with us! The BlackBerry(R) Developer Conference in SF, CA
&lt;br&gt;is the only developer event you need to attend this year. Jumpstart your
&lt;br&gt;developing skills, take BlackBerry mobile applications to market and stay 
&lt;br&gt;ahead of the curve. Join us from November 9 - 12, 2009. Register now!
&lt;br&gt;&lt;a href=&quot;http://p.sf.net/sfu/devconference&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/devconference&lt;/a&gt;&lt;br /&gt;_______________________________________________
&lt;br&gt;Jikesrvm-core mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26151894&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Jikesrvm-core@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-rvm-core--modifiers-may-not-necessary-tp26151894p26151894.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26106580</id>
	<title>Re: [rvm-core] [rvm-issues] JikesRVM: internal error: recursive use of hardware	exception registers (exiting)...</title>
	<published>2009-10-28T21:56:24Z</published>
	<updated>2009-10-28T21:56:24Z</updated>
	<author>
		<name>David P Grove</name>
	</author>
	<content type="html">&lt;html&gt;&lt;body&gt;
&lt;p&gt;&lt;tt&gt;Kelvin Tian &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26106580&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;kevinn.tian@...&lt;/a&gt;&amp;gt; wrote on 10/26/2009 07:03:49 PM:&lt;br&gt;
&amp;gt;&lt;br&gt;
&amp;gt; [rvm-issues] JikesRVM: internal error: recursive use of hardware &lt;br&gt;
&amp;gt; exception registers (exiting)...&lt;/tt&gt;&lt;br&gt;
&lt;tt&gt;&amp;gt; &lt;br&gt;
&amp;gt; Hi,&lt;/tt&gt;&lt;br&gt;
&lt;tt&gt;&amp;gt; &lt;br&gt;
&amp;gt;    When I tried to use JikesRVM 3.0.1 to run a java application. I &lt;br&gt;
&amp;gt; got this error: JikesRVM: internal error: recursive use of hardware &lt;br&gt;
&amp;gt; exception registers (exiting), and show a list of stack info like this &lt;/tt&gt;&lt;br&gt;
&lt;tt&gt;&amp;gt; -- Stack --&lt;/tt&gt;&lt;br&gt;
&lt;tt&gt;&amp;gt;    at [0x70ed1e70, 0x64ea27bd] Lorg/jikesrvm/runtime/&lt;br&gt;
&amp;gt; RuntimeEntrypoints; deliverHardwareException(II)V at line 694&lt;/tt&gt;&lt;br&gt;
&lt;tt&gt;&amp;gt;    at [0x70ed1e8c, 0x64ea27bd] &amp;lt;hardware trap&amp;gt;&lt;/tt&gt;&lt;br&gt;
&lt;tt&gt;&amp;gt;    at [0x70f04d98, 0x64ea3baa] Lorg/jikesrvm/scheduler/ThinLock; &lt;br&gt;
&amp;gt; unlock(Ljava/lang/Object;Lorg/vmmagic/unboxed/Offset;)V&lt;/tt&gt;&lt;br&gt;
&lt;tt&gt;&amp;gt;    at [0x70f04db0, 0x70850106] Lorg/jikesrvm/objectmodel/JavaHeader;&lt;br&gt;
&amp;gt; genericUnlock(Ljava/lang/Object;)V at line 598&lt;/tt&gt;&lt;br&gt;
&lt;tt&gt;&amp;gt;    at [0x70f04db0, 0x70850106] Lorg/jikesrvm/objectmodel/&lt;br&gt;
&amp;gt; ObjectModel; genericUnlock(Ljava/lang/Object;)V at line 478&lt;/tt&gt;&lt;br&gt;
&lt;tt&gt;&amp;gt; &lt;br&gt;
&amp;gt; Just wonder anyone else met with this error info before? Is this a &lt;br&gt;
&amp;gt; possible bug for JikesRVM? Thanks for any suggestions!&lt;/tt&gt;&lt;br&gt;
&lt;tt&gt;&amp;gt; &lt;br&gt;
Hi,&lt;/tt&gt;&lt;br&gt;
&lt;br&gt;
&lt;tt&gt;	typically that kind of stack dump means that we tried to unlock something that wasn't actually an object (or the heap got corrupted somehow). If its reproducible, you may be able to run with the -X:verbose &amp;nbsp;commandline and get a little more information about what's happening when it's crashing (the faulting instruction and machine register state).&lt;/tt&gt;&lt;br&gt;
&lt;br&gt;
&lt;tt&gt;--dave&lt;/tt&gt;&lt;br&gt;
&lt;/body&gt;&lt;/html&gt;&lt;br /&gt;------------------------------------------------------------------------------
&lt;br&gt;Come build with us! The BlackBerry(R) Developer Conference in SF, CA
&lt;br&gt;is the only developer event you need to attend this year. Jumpstart your
&lt;br&gt;developing skills, take BlackBerry mobile applications to market and stay 
&lt;br&gt;ahead of the curve. Join us from November 9 - 12, 2009. Register now!
&lt;br&gt;&lt;a href=&quot;http://p.sf.net/sfu/devconference&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/devconference&lt;/a&gt;&lt;br /&gt;_______________________________________________
&lt;br&gt;Jikesrvm-core mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26106580&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Jikesrvm-core@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Re%3A--rvm-core---rvm-issues--JikesRVM%3A-internal-error%3A-recursive-use-of-hardware%09exception-registers-%28exiting%29...-tp26106580p26106580.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-25484065</id>
	<title>Re: [rvm-core] Wiki Editing Policy?</title>
	<published>2009-09-16T19:11:34Z</published>
	<updated>2009-09-16T19:11:34Z</updated>
	<author>
		<name>David P Grove</name>
	</author>
	<content type="html">&lt;html&gt;&lt;body&gt;
&lt;p&gt;&lt;tt&gt;Laurence Hellyer &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=25484065&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;L.Hellyer@...&lt;/a&gt;&amp;gt; wrote on 09/03/2009 05:55:32 AM:&lt;/tt&gt;&lt;br&gt;
&lt;tt&gt;&amp;gt; &lt;br&gt;
&amp;gt; Just an observation but... I wonder if the current restrictions of &lt;br&gt;
&amp;gt; editing the JikesRVM wiki is perhaps too restrictive and &lt;br&gt;
&amp;gt; discouraging possible contributions of useful nuggets of information&lt;br&gt;
&amp;gt; by non core members? &amp;nbsp;Whilst I understand possible concerns about &lt;br&gt;
&amp;gt; spam and the quality of contributions has any thought been given to &lt;br&gt;
&amp;gt; allowing everyone to edit the wiki by default, perhaps only &lt;br&gt;
&amp;gt; protecting certain key pages such as the front page etc.&lt;/tt&gt;&lt;br&gt;
&lt;tt&gt;&amp;gt; &lt;br&gt;
&amp;gt; A lot of knowledge is only documented in the mail archives, creating&lt;br&gt;
&amp;gt; a special section on the wiki and encouraging users to contribute &lt;br&gt;
&amp;gt; back knowledge might be a nice way to help build the JikesRVM community.&lt;/tt&gt;&lt;br&gt;
&lt;tt&gt;&amp;gt; &lt;/tt&gt;&lt;br&gt;
&lt;br&gt;
&lt;tt&gt;	Sorry for the slow response. &amp;nbsp;I just realized that although we'd discussed this among the Steering Committee almost two weeks ago and quickly come to a unanimous decision to give any community member who asks the ability to edit the wiki, that none of us had actually remembered to respond to this email chain saying that.&lt;/tt&gt;&lt;br&gt;
&lt;br&gt;
&lt;tt&gt;--dave&lt;/tt&gt;&lt;br&gt;
&lt;tt&gt;&lt;br&gt;
&lt;/tt&gt;&lt;/body&gt;&lt;/html&gt;&lt;br /&gt;------------------------------------------------------------------------------
&lt;br&gt;Come build with us! The BlackBerry&amp;reg; Developer Conference in SF, CA
&lt;br&gt;is the only developer event you need to attend this year. Jumpstart your
&lt;br&gt;developing skills, take BlackBerry mobile applications to market and stay 
&lt;br&gt;ahead of the curve. Join us from November 9&amp;#45;12, 2009. Register now&amp;#33;
&lt;br&gt;&lt;a href=&quot;http://p.sf.net/sfu/devconf&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/devconf&lt;/a&gt;&lt;br /&gt;_______________________________________________
&lt;br&gt;Jikesrvm-core mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=25484065&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Jikesrvm-core@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-rvm-core--Wiki-Editing-Policy--tp25272901p25484065.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-25457524</id>
	<title>Running RVM on eclipse</title>
	<published>2009-09-15T09:42:09Z</published>
	<updated>2009-09-15T09:42:09Z</updated>
	<author>
		<name>bitsian</name>
	</author>
	<content type="html">Hi all,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;I'm hoping to implement thread-specific garbage collection as a part of our college project. The official website explains building RVM on eclipse but not running it on eclipse (The tutorial only explains running MMtk on eclipse and not the entire VM) Could somebody kindly give the procedure for doing the same? I'm pretty new to eclipse and hence not well acquainted with its usage.
&lt;br&gt;&lt;br&gt;Thanks in advance.</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Running-RVM-on-eclipse-tp25457524p25457524.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-25275170</id>
	<title>Re: [rvm-core] Wiki Editing Policy?</title>
	<published>2009-09-03T05:27:38Z</published>
	<updated>2009-09-03T05:27:38Z</updated>
	<author>
		<name>David P Grove</name>
	</author>
	<content type="html">&lt;html&gt;&lt;body&gt;
&lt;p&gt;&lt;tt&gt;Laurence Hellyer &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=25275170&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;L.Hellyer@...&lt;/a&gt;&amp;gt; wrote on 09/03/2009 04:55:32 AM:&lt;/tt&gt;&lt;br&gt;
&lt;tt&gt;&amp;gt; &lt;br&gt;
&amp;gt; Just an observation but... I wonder if the current restrictions of &lt;br&gt;
&amp;gt; editing the JikesRVM wiki is perhaps too restrictive and &lt;br&gt;
&amp;gt; discouraging possible contributions of useful nuggets of information&lt;br&gt;
&amp;gt; by non core members? &amp;nbsp;Whilst I understand possible concerns about &lt;br&gt;
&amp;gt; spam and the quality of contributions has any thought been given to &lt;br&gt;
&amp;gt; allowing everyone to edit the wiki by default, perhaps only &lt;br&gt;
&amp;gt; protecting certain key pages such as the front page etc.&lt;/tt&gt;&lt;br&gt;
&lt;tt&gt;&amp;gt; &lt;/tt&gt;&lt;br&gt;
&lt;tt&gt;&lt;br&gt;
My inclination would be to just grant anyone in the community who wants to be able to edit the wiki the rights to do so and just trust them to act responsibly. &amp;nbsp;&lt;/tt&gt;&lt;br&gt;
&lt;br&gt;
&lt;tt&gt;--dave &lt;/tt&gt;&lt;/body&gt;&lt;/html&gt;&lt;br /&gt;------------------------------------------------------------------------------
&lt;br&gt;Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
&lt;br&gt;trial. Simplify your report design, integration and deployment - and focus on 
&lt;br&gt;what you do best, core application coding. Discover what's new with 
&lt;br&gt;Crystal Reports now. &amp;nbsp;&lt;a href=&quot;http://p.sf.net/sfu/bobj-july&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/bobj-july&lt;/a&gt;&lt;br /&gt;_______________________________________________
&lt;br&gt;Jikesrvm-core mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=25275170&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Jikesrvm-core@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-rvm-core--Wiki-Editing-Policy--tp25272901p25275170.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-25272901</id>
	<title>[rvm-core] Wiki Editing Policy?</title>
	<published>2009-09-03T02:55:32Z</published>
	<updated>2009-09-03T02:55:32Z</updated>
	<author>
		<name>Laurence Hellyer</name>
	</author>
	<content type="html">&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body style=&quot;word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; &quot;&gt;Hi,&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Just an observation but...&amp;nbsp;I wonder if the current restrictions of editing the JikesRVM wiki is perhaps too restrictive and discouraging possible contributions of useful nuggets of information by non core members? &amp;nbsp;Whilst I understand possible concerns about spam and the quality of contributions has any thought been given to allowing everyone to edit the wiki by default, perhaps only protecting certain key pages such as the front page etc.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;A lot of knowledge is only documented in the mail archives, creating a special section on the wiki and encouraging users to contribute back knowledge might be a nice way to help build the JikesRVM community.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Anyway just a thought&lt;br&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Kind regards&lt;/div&gt;&lt;div&gt;Laurence&lt;br&gt;&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0; &quot;&gt;&lt;div&gt;&lt;br&gt;Laurence Hellyer&lt;br&gt;Research Student&lt;br&gt;Computing Laboratory&lt;br&gt;University of Kent&lt;br&gt;&lt;br&gt;More info:&amp;nbsp;&lt;a href=&quot;http://www.cs.kent.ac.uk/people/rpg/lh243/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.cs.kent.ac.uk/people/rpg/lh243/&lt;/a&gt;&lt;br&gt;&lt;/div&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;/body&gt;&lt;/html&gt;&lt;br /&gt;------------------------------------------------------------------------------
&lt;br&gt;Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
&lt;br&gt;trial. Simplify your report design, integration and deployment - and focus on 
&lt;br&gt;what you do best, core application coding. Discover what's new with 
&lt;br&gt;Crystal Reports now. &amp;nbsp;&lt;a href=&quot;http://p.sf.net/sfu/bobj-july&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/bobj-july&lt;/a&gt;&lt;br /&gt;_______________________________________________
&lt;br&gt;Jikesrvm-core mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=25272901&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Jikesrvm-core@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-rvm-core--Wiki-Editing-Policy--tp25272901p25272901.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-24999722</id>
	<title>Re: [rvm-core] [rvm-commits] SF.net SVN: jikesrvm:[15767]	rvmroot/trunk</title>
	<published>2009-08-16T17:25:23Z</published>
	<updated>2009-08-16T17:25:23Z</updated>
	<author>
		<name>Robin Garner</name>
	</author>
	<content type="html">Also, the next release of the dacapo benchmarks won't have this problem 
&lt;br&gt;- it uses a custom classloader that gives preference to the benchmark 
&lt;br&gt;classes over the class library/boot classpath.
&lt;br&gt;&lt;br&gt;Robin
&lt;br&gt;&lt;br&gt;Steve Blackburn wrote:
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; Just to be clear....
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; 1. &amp;nbsp;DaCapo xalan desires to use xalan as a benchmark. &amp;nbsp;It is essential &amp;nbsp;
&lt;br&gt;&amp;gt; that all JVMs use the same version when under test. &amp;nbsp; Therefore DaCapo &amp;nbsp;
&lt;br&gt;&amp;gt; asserts that the version provided by the harness is used.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; 2. &amp;nbsp;The IBM JVM and the Harmony JVM are unique in my experience in &amp;nbsp;
&lt;br&gt;&amp;gt; injecting the use of their own bundled version ahead of the supplied &amp;nbsp;
&lt;br&gt;&amp;gt; version. &amp;nbsp;Sun, JRockit and Jikes RVM JVMs have all until now always &amp;nbsp;
&lt;br&gt;&amp;gt; correctly used the provided version in preference to the bundled &amp;nbsp;
&lt;br&gt;&amp;gt; version.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; 3. &amp;nbsp;As far as I am aware, it is an error that Harmony and IBM place &amp;nbsp;
&lt;br&gt;&amp;gt; their bundled version of xalan ahead of the provided one.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; 4. &amp;nbsp;I discussed the above at some length with both IBM and Harmony &amp;nbsp;
&lt;br&gt;&amp;gt; development teams some time ago, and with Kev Jones, who was then at &amp;nbsp;
&lt;br&gt;&amp;gt; Intel and is an expert in this area, and who co-wrote the xalan &amp;nbsp;
&lt;br&gt;&amp;gt; workload for us. &amp;nbsp;To the best of my knowledge the IBM/Harmony behavior &amp;nbsp;
&lt;br&gt;&amp;gt; is incorrect.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; --Steve
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; On 15/08/2009, at 7:19 AM, &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=24999722&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dgrove-oss@...&lt;/a&gt; wrote:
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; 
&lt;br&gt;&amp;gt;&amp;gt; Revision: 15767
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=15767&amp;view=rev&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=15767&amp;view=rev&lt;/a&gt;&lt;br&gt;&amp;gt;&amp;gt; Author: &amp;nbsp; dgrove-oss
&lt;br&gt;&amp;gt;&amp;gt; Date: &amp;nbsp; &amp;nbsp; 2009-08-14 21:19:29 +0000 (Fri, 14 Aug 2009)
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; Log Message:
&lt;br&gt;&amp;gt;&amp;gt; -----------
&lt;br&gt;&amp;gt;&amp;gt; DaCapo xalan requires the VM to use a specific version of xalan,
&lt;br&gt;&amp;gt;&amp;gt; which is not the same version found in modern JVM class libraries.
&lt;br&gt;&amp;gt;&amp;gt; Add plumbing to tests.xml to allow test-specific settings of the
&lt;br&gt;&amp;gt;&amp;gt; VM's bootclasspath and then use this mechanism in the dacapo build.xml
&lt;br&gt;&amp;gt;&amp;gt; to ensure that the xalan code taken from the xalan.jar extracted from
&lt;br&gt;&amp;gt;&amp;gt; dacapo.jar is loaded in preference to whatever xalan version may be
&lt;br&gt;&amp;gt;&amp;gt; built-in to the classlibarary.
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; Modified Paths:
&lt;br&gt;&amp;gt;&amp;gt; --------------
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp;rvmroot/trunk/build/tests.xml
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp;rvmroot/trunk/testing/tests/dacapo/build.xml
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; Modified: rvmroot/trunk/build/tests.xml
&lt;br&gt;&amp;gt;&amp;gt; ===================================================================
&lt;br&gt;&amp;gt;&amp;gt; --- rvmroot/trunk/build/tests.xml	2009-08-12 18:36:49 UTC (rev 15766)
&lt;br&gt;&amp;gt;&amp;gt; +++ rvmroot/trunk/build/tests.xml	2009-08-14 21:19:29 UTC (rev 15767)
&lt;br&gt;&amp;gt;&amp;gt; @@ -409,6 +409,7 @@
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;attribute name=&amp;quot;class&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;attribute name=&amp;quot;args&amp;quot; default=&amp;quot;&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;attribute name=&amp;quot;classpath&amp;quot; default=&amp;quot;&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; + &amp;nbsp; &amp;nbsp;&amp;lt;attribute name=&amp;quot;bootclasspath&amp;quot; default=&amp;quot;&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;attribute name=&amp;quot;processors&amp;quot; default=&amp;quot;&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;attribute name=&amp;quot;initialHeapSize&amp;quot; default=&amp;quot;&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;attribute name=&amp;quot;maxHeapSize&amp;quot; default=&amp;quot;&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; @@ -423,6 +424,7 @@
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; class=&amp;quot;@{class}&amp;quot;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; args=&amp;quot;@{args}&amp;quot;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; classpath=&amp;quot;@{classpath}&amp;quot;
&lt;br&gt;&amp;gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bootclasspath=&amp;quot;@{bootclasspath}&amp;quot;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; processors=&amp;quot;@{processors}&amp;quot;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; initialHeapSize=&amp;quot;@{initialHeapSize}&amp;quot;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; maxHeapSize=&amp;quot;@{maxHeapSize}&amp;quot;
&lt;br&gt;&amp;gt;&amp;gt; @@ -441,6 +443,7 @@
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;attribute name=&amp;quot;class&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;attribute name=&amp;quot;args&amp;quot; default=&amp;quot;&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;attribute name=&amp;quot;classpath&amp;quot; default=&amp;quot;&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; + &amp;nbsp; &amp;nbsp;&amp;lt;attribute name=&amp;quot;bootclasspath&amp;quot; default=&amp;quot;&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;attribute name=&amp;quot;processors&amp;quot; default=&amp;quot;&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;attribute name=&amp;quot;initialHeapSize&amp;quot; default=&amp;quot;&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;attribute name=&amp;quot;maxHeapSize&amp;quot; default=&amp;quot;&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; @@ -474,6 +477,7 @@
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;setTestProperty tag=&amp;quot;@{tag}&amp;quot; key=&amp;quot;extra.args&amp;quot; &amp;nbsp;
&lt;br&gt;&amp;gt;&amp;gt; default=&amp;quot;@{rvmArgs}&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;setTestProperty tag=&amp;quot;@{tag}&amp;quot; key=&amp;quot;extra.rvm.args&amp;quot; default=&amp;quot;&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;setTestProperty tag=&amp;quot;@{tag}&amp;quot; key=&amp;quot;class.path&amp;quot; default=&amp;quot;$ 
&lt;br&gt;&amp;gt;&amp;gt; {default.test.@{tag}.classpath}&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;setTestProperty tag=&amp;quot;@{tag}&amp;quot; key=&amp;quot;bootclass.path&amp;quot; &amp;nbsp;
&lt;br&gt;&amp;gt;&amp;gt; default=&amp;quot;@{bootclasspath}&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;setTestProperty tag=&amp;quot;@{tag}&amp;quot; key=&amp;quot;time.limit&amp;quot; default=&amp;quot;$ 
&lt;br&gt;&amp;gt;&amp;gt; {default.test.@{tag}.timeLimit}&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;setTestProperty tag=&amp;quot;@{tag}&amp;quot; key=&amp;quot;initial.heapsize&amp;quot; default=&amp;quot;$ 
&lt;br&gt;&amp;gt;&amp;gt; {default.test.@{tag}.initialHeapSize}&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;setTestProperty tag=&amp;quot;@{tag}&amp;quot; key=&amp;quot;max.heapsize&amp;quot; default=&amp;quot;$ 
&lt;br&gt;&amp;gt;&amp;gt; {default.test.@{tag}.maxHeapSize}&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; @@ -512,7 +516,7 @@
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;property name=&amp;quot;test.@{tag}.rvm.wrapper-args&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;property name=&amp;quot;test.@{tag}.command&amp;quot;
&lt;br&gt;&amp;gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;value='${rvm.exe} ${test.@{tag}.rvm.args} - 
&lt;br&gt;&amp;gt;&amp;gt; classpath &amp;quot;${test.@{tag}.class.path}&amp;quot; ${test.@{tag}.class} $ 
&lt;br&gt;&amp;gt;&amp;gt; {test.@{tag}.args}'/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;value='${rvm.exe} ${test.@{tag}.rvm.args} $ 
&lt;br&gt;&amp;gt;&amp;gt; {test.@{tag}.bootclass.path} -classpath &amp;quot;${test.@{tag}.class.path}&amp;quot; $ 
&lt;br&gt;&amp;gt;&amp;gt; {test.@{tag}.class} ${test.@{tag}.args}'/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;/sequential&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;lt;/macrodef&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; @@ -557,7 +561,7 @@
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;arg line=&amp;quot;-o ${test.@{tag}.@{execution}.output.file}&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;!-- The RVM execution --&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;arg line=&amp;quot;${rvm.exe} ${test.@{tag}.rvm.args}&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;arg line=&amp;quot;${rvm.exe} ${test.@{tag}.rvm.args} $ 
&lt;br&gt;&amp;gt;&amp;gt; {test.@{tag}.bootclass.path}&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;arg value=&amp;quot;-classpath&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;arg value=&amp;quot;${test.@{tag}.class.path}&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;arg line=&amp;quot;${test.@{tag}.class} ${test.@{tag}.args}&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; @@ -613,6 +617,7 @@
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;attribute name=&amp;quot;tag&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;attribute name=&amp;quot;class&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;attribute name=&amp;quot;classpath&amp;quot; default=&amp;quot;&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; + &amp;nbsp; &amp;nbsp;&amp;lt;attribute name=&amp;quot;bootclasspath&amp;quot; default=&amp;quot;&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;attribute name=&amp;quot;args&amp;quot; default=&amp;quot;&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;attribute name=&amp;quot;execution&amp;quot; default=&amp;quot;default&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;attribute name=&amp;quot;initialHeapSize&amp;quot; default=&amp;quot;&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; @@ -624,6 +629,7 @@
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;class=&amp;quot;@{class}&amp;quot;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;args=&amp;quot;@{args}&amp;quot;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;classpath=&amp;quot;@{classpath}&amp;quot;
&lt;br&gt;&amp;gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; bootclasspath=&amp;quot;@{bootclasspath}&amp;quot;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;initialHeapSize=&amp;quot;@{initialHeapSize}&amp;quot;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;maxHeapSize=&amp;quot;@{maxHeapSize}&amp;quot;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;rvmArgs=&amp;quot;@{rvmArgs}&amp;quot;
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; Modified: rvmroot/trunk/testing/tests/dacapo/build.xml
&lt;br&gt;&amp;gt;&amp;gt; ===================================================================
&lt;br&gt;&amp;gt;&amp;gt; --- rvmroot/trunk/testing/tests/dacapo/build.xml	2009-08-12 18:36:49 &amp;nbsp;
&lt;br&gt;&amp;gt;&amp;gt; UTC (rev 15766)
&lt;br&gt;&amp;gt;&amp;gt; +++ rvmroot/trunk/testing/tests/dacapo/build.xml	2009-08-14 21:19:29 &amp;nbsp;
&lt;br&gt;&amp;gt;&amp;gt; UTC (rev 15767)
&lt;br&gt;&amp;gt;&amp;gt; @@ -25,13 +25,23 @@
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;lt;property name=&amp;quot;test.class.path&amp;quot; value=&amp;quot;${dacapo.jar}&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; + &amp;nbsp;&amp;lt;target name=&amp;quot;extract-xalan-jar&amp;quot; depends=&amp;quot;init&amp;quot;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; + &amp;nbsp; &amp;nbsp;&amp;lt;test-file name=&amp;quot;dacapo.jar&amp;quot; location=&amp;quot;$ 
&lt;br&gt;&amp;gt;&amp;gt; {jikesrvm.dir}/.ant.properties&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; + &amp;nbsp; &amp;nbsp;&amp;lt;unzip src=&amp;quot;${dacapo.jar}&amp;quot; dest=&amp;quot;${build.tests.dir}&amp;quot;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;patternset&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;include name=&amp;quot;xalan.jar&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/patternset&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; + &amp;nbsp; &amp;nbsp;&amp;lt;/unzip&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; + &amp;nbsp;&amp;lt;/target&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; +
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;lt;macrodef name=&amp;quot;dacapo&amp;quot;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;attribute name=&amp;quot;name&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;attribute name=&amp;quot;timeLimit&amp;quot; default=&amp;quot;&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;attribute name=&amp;quot;heapsize&amp;quot; default=&amp;quot;&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;attribute name=&amp;quot;requires-display&amp;quot; default=&amp;quot;false&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; + &amp;nbsp; &amp;nbsp;&amp;lt;attribute name=&amp;quot;bootclasspath&amp;quot; default=&amp;quot;&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;sequential&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;rvm tag=&amp;quot;@{name}&amp;quot; class=&amp;quot;Harness&amp;quot; requires- 
&lt;br&gt;&amp;gt;&amp;gt; display=&amp;quot;@{requires-display}&amp;quot; args=&amp;quot;@{name}&amp;quot; &amp;nbsp;
&lt;br&gt;&amp;gt;&amp;gt; timeLimit=&amp;quot;@{timeLimit}&amp;quot; maxHeapSize=&amp;quot;@{heapsize}&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;rvm tag=&amp;quot;@{name}&amp;quot; class=&amp;quot;Harness&amp;quot; requires- 
&lt;br&gt;&amp;gt;&amp;gt; display=&amp;quot;@{requires-display}&amp;quot; args=&amp;quot;@{name}&amp;quot; &amp;nbsp;
&lt;br&gt;&amp;gt;&amp;gt; timeLimit=&amp;quot;@{timeLimit}&amp;quot; maxHeapSize=&amp;quot;@{heapsize}&amp;quot; &amp;nbsp;
&lt;br&gt;&amp;gt;&amp;gt; bootclasspath=&amp;quot;@{bootclasspath}&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;outputSingleStatisticResults tag=&amp;quot;@{name}&amp;quot; key=&amp;quot;time&amp;quot; &amp;nbsp;
&lt;br&gt;&amp;gt;&amp;gt; pattern=&amp;quot;===== DaCapo @{name} PASSED in (.*) msec =====&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;/sequential&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;lt;/macrodef&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; @@ -42,7 +52,7 @@
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;lt;!-- &amp;nbsp;
&lt;br&gt;&amp;gt;&amp;gt; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;* --&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;lt;!-- &amp;nbsp;
&lt;br&gt;&amp;gt;&amp;gt; **************************************************************************** --&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; - &amp;nbsp;&amp;lt;target name=&amp;quot;test&amp;quot; depends=&amp;quot;init&amp;quot;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; + &amp;nbsp;&amp;lt;target name=&amp;quot;test&amp;quot; depends=&amp;quot;init,extract-xalan-jar&amp;quot;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;test-file name=&amp;quot;dacapo.jar&amp;quot; location=&amp;quot;$ 
&lt;br&gt;&amp;gt;&amp;gt; {jikesrvm.dir}/.ant.properties&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;startResults/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; @@ -58,7 +68,7 @@
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;dacapo name=&amp;quot;luindex&amp;quot; &amp;nbsp;heapsize=&amp;quot;120&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;dacapo name=&amp;quot;lusearch&amp;quot; heapsize=&amp;quot;300&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;dacapo name=&amp;quot;pmd&amp;quot; &amp;nbsp; &amp;nbsp; &amp;nbsp;heapsize=&amp;quot;200&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; - &amp;nbsp; &amp;nbsp;&amp;lt;dacapo name=&amp;quot;xalan&amp;quot; &amp;nbsp; &amp;nbsp;heapsize=&amp;quot;150&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; + &amp;nbsp; &amp;nbsp;&amp;lt;dacapo name=&amp;quot;xalan&amp;quot; &amp;nbsp; &amp;nbsp;heapsize=&amp;quot;150&amp;quot; bootclasspath=&amp;quot;- 
&lt;br&gt;&amp;gt;&amp;gt; Xbootclasspath/p:xalan.jar&amp;quot; /&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;finishResults/&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;lt;/target&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; This was sent by the SourceForge.net collaborative development &amp;nbsp;
&lt;br&gt;&amp;gt;&amp;gt; platform, the world's largest Open Source development site.
&lt;br&gt;&amp;gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; ------------------------------------------------------------------------------
&lt;br&gt;&amp;gt;&amp;gt; Let Crystal Reports handle the reporting - Free Crystal Reports 2008 &amp;nbsp;
&lt;br&gt;&amp;gt;&amp;gt; 30-Day
&lt;br&gt;&amp;gt;&amp;gt; trial. Simplify your report design, integration and deployment - and &amp;nbsp;
&lt;br&gt;&amp;gt;&amp;gt; focus on
&lt;br&gt;&amp;gt;&amp;gt; what you do best, core application coding. Discover what's new with
&lt;br&gt;&amp;gt;&amp;gt; Crystal Reports now. &amp;nbsp;&lt;a href=&quot;http://p.sf.net/sfu/bobj-july&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/bobj-july&lt;/a&gt;&lt;br&gt;&amp;gt;&amp;gt; _______________________________________________
&lt;br&gt;&amp;gt;&amp;gt; Jikesrvm-commits mailing list
&lt;br&gt;&amp;gt;&amp;gt; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=24999722&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Jikesrvm-commits@...&lt;/a&gt;
&lt;br&gt;&amp;gt;&amp;gt; &lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/jikesrvm-commits&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/jikesrvm-commits&lt;/a&gt;&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; ------------------------------------------------------------------------------
&lt;br&gt;&amp;gt; Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
&lt;br&gt;&amp;gt; trial. Simplify your report design, integration and deployment - and focus on 
&lt;br&gt;&amp;gt; what you do best, core application coding. Discover what's new with 
&lt;br&gt;&amp;gt; Crystal Reports now. &amp;nbsp;&lt;a href=&quot;http://p.sf.net/sfu/bobj-july&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/bobj-july&lt;/a&gt;&lt;br&gt;&amp;gt; _______________________________________________
&lt;br&gt;&amp;gt; Jikesrvm-core mailing list
&lt;br&gt;&amp;gt; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=24999722&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Jikesrvm-core@...&lt;/a&gt;
&lt;br&gt;&amp;gt; &lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&lt;/a&gt;&lt;br&gt;&amp;gt; &amp;nbsp; 
&lt;/div&gt;&lt;br&gt;&lt;br&gt;------------------------------------------------------------------------------
&lt;br&gt;Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
&lt;br&gt;trial. Simplify your report design, integration and deployment - and focus on 
&lt;br&gt;what you do best, core application coding. Discover what's new with 
&lt;br&gt;Crystal Reports now. &amp;nbsp;&lt;a href=&quot;http://p.sf.net/sfu/bobj-july&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/bobj-july&lt;/a&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;Jikesrvm-core mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=24999722&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Jikesrvm-core@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Re%3A--rvm-core---rvm-commits--SF.net-SVN%3A-jikesrvm%3A-15767--rvmroot-trunk-tp24979040p24999722.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-24979040</id>
	<title>Re: [rvm-core] [rvm-commits] SF.net SVN: jikesrvm:[15767] rvmroot/trunk</title>
	<published>2009-08-14T14:39:29Z</published>
	<updated>2009-08-14T14:39:29Z</updated>
	<author>
		<name>Steve Blackburn</name>
	</author>
	<content type="html">Just to be clear....
&lt;br&gt;&lt;br&gt;1. &amp;nbsp;DaCapo xalan desires to use xalan as a benchmark. &amp;nbsp;It is essential &amp;nbsp;
&lt;br&gt;that all JVMs use the same version when under test. &amp;nbsp; Therefore DaCapo &amp;nbsp;
&lt;br&gt;asserts that the version provided by the harness is used.
&lt;br&gt;&lt;br&gt;2. &amp;nbsp;The IBM JVM and the Harmony JVM are unique in my experience in &amp;nbsp;
&lt;br&gt;injecting the use of their own bundled version ahead of the supplied &amp;nbsp;
&lt;br&gt;version. &amp;nbsp;Sun, JRockit and Jikes RVM JVMs have all until now always &amp;nbsp;
&lt;br&gt;correctly used the provided version in preference to the bundled &amp;nbsp;
&lt;br&gt;version.
&lt;br&gt;&lt;br&gt;3. &amp;nbsp;As far as I am aware, it is an error that Harmony and IBM place &amp;nbsp;
&lt;br&gt;their bundled version of xalan ahead of the provided one.
&lt;br&gt;&lt;br&gt;4. &amp;nbsp;I discussed the above at some length with both IBM and Harmony &amp;nbsp;
&lt;br&gt;development teams some time ago, and with Kev Jones, who was then at &amp;nbsp;
&lt;br&gt;Intel and is an expert in this area, and who co-wrote the xalan &amp;nbsp;
&lt;br&gt;workload for us. &amp;nbsp;To the best of my knowledge the IBM/Harmony behavior &amp;nbsp;
&lt;br&gt;is incorrect.
&lt;br&gt;&lt;br&gt;--Steve
&lt;br&gt;&lt;br&gt;&lt;br&gt;On 15/08/2009, at 7:19 AM, &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=24979040&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dgrove-oss@...&lt;/a&gt; wrote:
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; Revision: 15767
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=15767&amp;view=rev&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=15767&amp;view=rev&lt;/a&gt;&lt;br&gt;&amp;gt; Author: &amp;nbsp; dgrove-oss
&lt;br&gt;&amp;gt; Date: &amp;nbsp; &amp;nbsp; 2009-08-14 21:19:29 +0000 (Fri, 14 Aug 2009)
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Log Message:
&lt;br&gt;&amp;gt; -----------
&lt;br&gt;&amp;gt; DaCapo xalan requires the VM to use a specific version of xalan,
&lt;br&gt;&amp;gt; which is not the same version found in modern JVM class libraries.
&lt;br&gt;&amp;gt; Add plumbing to tests.xml to allow test-specific settings of the
&lt;br&gt;&amp;gt; VM's bootclasspath and then use this mechanism in the dacapo build.xml
&lt;br&gt;&amp;gt; to ensure that the xalan code taken from the xalan.jar extracted from
&lt;br&gt;&amp;gt; dacapo.jar is loaded in preference to whatever xalan version may be
&lt;br&gt;&amp;gt; built-in to the classlibarary.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Modified Paths:
&lt;br&gt;&amp;gt; --------------
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;rvmroot/trunk/build/tests.xml
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;rvmroot/trunk/testing/tests/dacapo/build.xml
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Modified: rvmroot/trunk/build/tests.xml
&lt;br&gt;&amp;gt; ===================================================================
&lt;br&gt;&amp;gt; --- rvmroot/trunk/build/tests.xml	2009-08-12 18:36:49 UTC (rev 15766)
&lt;br&gt;&amp;gt; +++ rvmroot/trunk/build/tests.xml	2009-08-14 21:19:29 UTC (rev 15767)
&lt;br&gt;&amp;gt; @@ -409,6 +409,7 @@
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;attribute name=&amp;quot;class&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;attribute name=&amp;quot;args&amp;quot; default=&amp;quot;&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;attribute name=&amp;quot;classpath&amp;quot; default=&amp;quot;&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;&amp;lt;attribute name=&amp;quot;bootclasspath&amp;quot; default=&amp;quot;&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;attribute name=&amp;quot;processors&amp;quot; default=&amp;quot;&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;attribute name=&amp;quot;initialHeapSize&amp;quot; default=&amp;quot;&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;attribute name=&amp;quot;maxHeapSize&amp;quot; default=&amp;quot;&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; @@ -423,6 +424,7 @@
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; class=&amp;quot;@{class}&amp;quot;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; args=&amp;quot;@{args}&amp;quot;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; classpath=&amp;quot;@{classpath}&amp;quot;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bootclasspath=&amp;quot;@{bootclasspath}&amp;quot;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; processors=&amp;quot;@{processors}&amp;quot;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; initialHeapSize=&amp;quot;@{initialHeapSize}&amp;quot;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; maxHeapSize=&amp;quot;@{maxHeapSize}&amp;quot;
&lt;br&gt;&amp;gt; @@ -441,6 +443,7 @@
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;attribute name=&amp;quot;class&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;attribute name=&amp;quot;args&amp;quot; default=&amp;quot;&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;attribute name=&amp;quot;classpath&amp;quot; default=&amp;quot;&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;&amp;lt;attribute name=&amp;quot;bootclasspath&amp;quot; default=&amp;quot;&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;attribute name=&amp;quot;processors&amp;quot; default=&amp;quot;&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;attribute name=&amp;quot;initialHeapSize&amp;quot; default=&amp;quot;&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;attribute name=&amp;quot;maxHeapSize&amp;quot; default=&amp;quot;&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; @@ -474,6 +477,7 @@
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;setTestProperty tag=&amp;quot;@{tag}&amp;quot; key=&amp;quot;extra.args&amp;quot; &amp;nbsp;
&lt;br&gt;&amp;gt; default=&amp;quot;@{rvmArgs}&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;setTestProperty tag=&amp;quot;@{tag}&amp;quot; key=&amp;quot;extra.rvm.args&amp;quot; default=&amp;quot;&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;setTestProperty tag=&amp;quot;@{tag}&amp;quot; key=&amp;quot;class.path&amp;quot; default=&amp;quot;$ 
&lt;br&gt;&amp;gt; {default.test.@{tag}.classpath}&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;setTestProperty tag=&amp;quot;@{tag}&amp;quot; key=&amp;quot;bootclass.path&amp;quot; &amp;nbsp;
&lt;br&gt;&amp;gt; default=&amp;quot;@{bootclasspath}&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;setTestProperty tag=&amp;quot;@{tag}&amp;quot; key=&amp;quot;time.limit&amp;quot; default=&amp;quot;$ 
&lt;br&gt;&amp;gt; {default.test.@{tag}.timeLimit}&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;setTestProperty tag=&amp;quot;@{tag}&amp;quot; key=&amp;quot;initial.heapsize&amp;quot; default=&amp;quot;$ 
&lt;br&gt;&amp;gt; {default.test.@{tag}.initialHeapSize}&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;setTestProperty tag=&amp;quot;@{tag}&amp;quot; key=&amp;quot;max.heapsize&amp;quot; default=&amp;quot;$ 
&lt;br&gt;&amp;gt; {default.test.@{tag}.maxHeapSize}&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; @@ -512,7 +516,7 @@
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;property name=&amp;quot;test.@{tag}.rvm.wrapper-args&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;property name=&amp;quot;test.@{tag}.command&amp;quot;
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;value='${rvm.exe} ${test.@{tag}.rvm.args} - 
&lt;br&gt;&amp;gt; classpath &amp;quot;${test.@{tag}.class.path}&amp;quot; ${test.@{tag}.class} $ 
&lt;br&gt;&amp;gt; {test.@{tag}.args}'/&amp;gt;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;value='${rvm.exe} ${test.@{tag}.rvm.args} $ 
&lt;br&gt;&amp;gt; {test.@{tag}.bootclass.path} -classpath &amp;quot;${test.@{tag}.class.path}&amp;quot; $ 
&lt;br&gt;&amp;gt; {test.@{tag}.class} ${test.@{tag}.args}'/&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;/sequential&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;lt;/macrodef&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; @@ -557,7 +561,7 @@
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;arg line=&amp;quot;-o ${test.@{tag}.@{execution}.output.file}&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;!-- The RVM execution --&amp;gt;
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;arg line=&amp;quot;${rvm.exe} ${test.@{tag}.rvm.args}&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;arg line=&amp;quot;${rvm.exe} ${test.@{tag}.rvm.args} $ 
&lt;br&gt;&amp;gt; {test.@{tag}.bootclass.path}&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;arg value=&amp;quot;-classpath&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;arg value=&amp;quot;${test.@{tag}.class.path}&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;arg line=&amp;quot;${test.@{tag}.class} ${test.@{tag}.args}&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; @@ -613,6 +617,7 @@
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;attribute name=&amp;quot;tag&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;attribute name=&amp;quot;class&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;attribute name=&amp;quot;classpath&amp;quot; default=&amp;quot;&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;&amp;lt;attribute name=&amp;quot;bootclasspath&amp;quot; default=&amp;quot;&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;attribute name=&amp;quot;args&amp;quot; default=&amp;quot;&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;attribute name=&amp;quot;execution&amp;quot; default=&amp;quot;default&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;attribute name=&amp;quot;initialHeapSize&amp;quot; default=&amp;quot;&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; @@ -624,6 +629,7 @@
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;class=&amp;quot;@{class}&amp;quot;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;args=&amp;quot;@{args}&amp;quot;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;classpath=&amp;quot;@{classpath}&amp;quot;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; bootclasspath=&amp;quot;@{bootclasspath}&amp;quot;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;initialHeapSize=&amp;quot;@{initialHeapSize}&amp;quot;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;maxHeapSize=&amp;quot;@{maxHeapSize}&amp;quot;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;rvmArgs=&amp;quot;@{rvmArgs}&amp;quot;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Modified: rvmroot/trunk/testing/tests/dacapo/build.xml
&lt;br&gt;&amp;gt; ===================================================================
&lt;br&gt;&amp;gt; --- rvmroot/trunk/testing/tests/dacapo/build.xml	2009-08-12 18:36:49 &amp;nbsp;
&lt;br&gt;&amp;gt; UTC (rev 15766)
&lt;br&gt;&amp;gt; +++ rvmroot/trunk/testing/tests/dacapo/build.xml	2009-08-14 21:19:29 &amp;nbsp;
&lt;br&gt;&amp;gt; UTC (rev 15767)
&lt;br&gt;&amp;gt; @@ -25,13 +25,23 @@
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;lt;property name=&amp;quot;test.class.path&amp;quot; value=&amp;quot;${dacapo.jar}&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; + &amp;nbsp;&amp;lt;target name=&amp;quot;extract-xalan-jar&amp;quot; depends=&amp;quot;init&amp;quot;&amp;gt;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;&amp;lt;test-file name=&amp;quot;dacapo.jar&amp;quot; location=&amp;quot;$ 
&lt;br&gt;&amp;gt; {jikesrvm.dir}/.ant.properties&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;&amp;lt;unzip src=&amp;quot;${dacapo.jar}&amp;quot; dest=&amp;quot;${build.tests.dir}&amp;quot;&amp;gt;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;patternset&amp;gt;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;include name=&amp;quot;xalan.jar&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/patternset&amp;gt;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;&amp;lt;/unzip&amp;gt;
&lt;br&gt;&amp;gt; + &amp;nbsp;&amp;lt;/target&amp;gt;
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;lt;macrodef name=&amp;quot;dacapo&amp;quot;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;attribute name=&amp;quot;name&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;attribute name=&amp;quot;timeLimit&amp;quot; default=&amp;quot;&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;attribute name=&amp;quot;heapsize&amp;quot; default=&amp;quot;&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;attribute name=&amp;quot;requires-display&amp;quot; default=&amp;quot;false&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;&amp;lt;attribute name=&amp;quot;bootclasspath&amp;quot; default=&amp;quot;&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;sequential&amp;gt;
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;rvm tag=&amp;quot;@{name}&amp;quot; class=&amp;quot;Harness&amp;quot; requires- 
&lt;br&gt;&amp;gt; display=&amp;quot;@{requires-display}&amp;quot; args=&amp;quot;@{name}&amp;quot; &amp;nbsp;
&lt;br&gt;&amp;gt; timeLimit=&amp;quot;@{timeLimit}&amp;quot; maxHeapSize=&amp;quot;@{heapsize}&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;rvm tag=&amp;quot;@{name}&amp;quot; class=&amp;quot;Harness&amp;quot; requires- 
&lt;br&gt;&amp;gt; display=&amp;quot;@{requires-display}&amp;quot; args=&amp;quot;@{name}&amp;quot; &amp;nbsp;
&lt;br&gt;&amp;gt; timeLimit=&amp;quot;@{timeLimit}&amp;quot; maxHeapSize=&amp;quot;@{heapsize}&amp;quot; &amp;nbsp;
&lt;br&gt;&amp;gt; bootclasspath=&amp;quot;@{bootclasspath}&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;outputSingleStatisticResults tag=&amp;quot;@{name}&amp;quot; key=&amp;quot;time&amp;quot; &amp;nbsp;
&lt;br&gt;&amp;gt; pattern=&amp;quot;===== DaCapo @{name} PASSED in (.*) msec =====&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;/sequential&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;lt;/macrodef&amp;gt;
&lt;br&gt;&amp;gt; @@ -42,7 +52,7 @@
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;lt;!-- &amp;nbsp;
&lt;br&gt;&amp;gt; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;* --&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;lt;!-- &amp;nbsp;
&lt;br&gt;&amp;gt; **************************************************************************** --&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; - &amp;nbsp;&amp;lt;target name=&amp;quot;test&amp;quot; depends=&amp;quot;init&amp;quot;&amp;gt;
&lt;br&gt;&amp;gt; + &amp;nbsp;&amp;lt;target name=&amp;quot;test&amp;quot; depends=&amp;quot;init,extract-xalan-jar&amp;quot;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;test-file name=&amp;quot;dacapo.jar&amp;quot; location=&amp;quot;$ 
&lt;br&gt;&amp;gt; {jikesrvm.dir}/.ant.properties&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;startResults/&amp;gt;
&lt;br&gt;&amp;gt; @@ -58,7 +68,7 @@
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;dacapo name=&amp;quot;luindex&amp;quot; &amp;nbsp;heapsize=&amp;quot;120&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;dacapo name=&amp;quot;lusearch&amp;quot; heapsize=&amp;quot;300&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;dacapo name=&amp;quot;pmd&amp;quot; &amp;nbsp; &amp;nbsp; &amp;nbsp;heapsize=&amp;quot;200&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp;&amp;lt;dacapo name=&amp;quot;xalan&amp;quot; &amp;nbsp; &amp;nbsp;heapsize=&amp;quot;150&amp;quot;/&amp;gt;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;&amp;lt;dacapo name=&amp;quot;xalan&amp;quot; &amp;nbsp; &amp;nbsp;heapsize=&amp;quot;150&amp;quot; bootclasspath=&amp;quot;- 
&lt;br&gt;&amp;gt; Xbootclasspath/p:xalan.jar&amp;quot; /&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;lt;finishResults/&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;lt;/target&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; This was sent by the SourceForge.net collaborative development &amp;nbsp;
&lt;br&gt;&amp;gt; platform, the world's largest Open Source development site.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; ------------------------------------------------------------------------------
&lt;br&gt;&amp;gt; Let Crystal Reports handle the reporting - Free Crystal Reports 2008 &amp;nbsp;
&lt;br&gt;&amp;gt; 30-Day
&lt;br&gt;&amp;gt; trial. Simplify your report design, integration and deployment - and &amp;nbsp;
&lt;br&gt;&amp;gt; focus on
&lt;br&gt;&amp;gt; what you do best, core application coding. Discover what's new with
&lt;br&gt;&amp;gt; Crystal Reports now. &amp;nbsp;&lt;a href=&quot;http://p.sf.net/sfu/bobj-july&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/bobj-july&lt;/a&gt;&lt;br&gt;&amp;gt; _______________________________________________
&lt;br&gt;&amp;gt; Jikesrvm-commits mailing list
&lt;br&gt;&amp;gt; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=24979040&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Jikesrvm-commits@...&lt;/a&gt;
&lt;br&gt;&amp;gt; &lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/jikesrvm-commits&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/jikesrvm-commits&lt;/a&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;------------------------------------------------------------------------------
&lt;br&gt;Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
&lt;br&gt;trial. Simplify your report design, integration and deployment - and focus on 
&lt;br&gt;what you do best, core application coding. Discover what's new with 
&lt;br&gt;Crystal Reports now. &amp;nbsp;&lt;a href=&quot;http://p.sf.net/sfu/bobj-july&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/bobj-july&lt;/a&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;Jikesrvm-core mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=24979040&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Jikesrvm-core@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Re%3A--rvm-core---rvm-commits--SF.net-SVN%3A-jikesrvm%3A-15767--rvmroot-trunk-tp24979040p24979040.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-24715952</id>
	<title>[rvm-core] Detect which object is accessed</title>
	<published>2009-07-29T02:49:52Z</published>
	<updated>2009-07-29T02:49:52Z</updated>
	<author>
		<name>Silviu ANDRICA</name>
	</author>
	<content type="html">Hello,
&lt;br&gt;&amp;nbsp; &amp;nbsp; I am new-ish to JikesRVM and I apologize if my question is stupid.
&lt;br&gt;&amp;nbsp; &amp;nbsp; I would like to track which data threads access.
&lt;br&gt;&amp;nbsp; &amp;nbsp; I could do that by using AOP techniques, but I'd rather do it in a JVM.
&lt;br&gt;&amp;nbsp; &amp;nbsp; I had a quick look at the API but I could not easily point out which 
&lt;br&gt;I would need.
&lt;br&gt;&amp;nbsp; &amp;nbsp; Can someone provide me with some hints?
&lt;br&gt;&lt;br&gt;Cheers,
&lt;br&gt;&amp;nbsp; &amp;nbsp; Silviu
&lt;br&gt;&lt;br&gt;------------------------------------------------------------------------------
&lt;br&gt;Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
&lt;br&gt;trial. Simplify your report design, integration and deployment - and focus on 
&lt;br&gt;what you do best, core application coding. Discover what's new with 
&lt;br&gt;Crystal Reports now. &amp;nbsp;&lt;a href=&quot;http://p.sf.net/sfu/bobj-july&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/bobj-july&lt;/a&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;Jikesrvm-core mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=24715952&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Jikesrvm-core@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-rvm-core--Detect-which-object-is-accessed-tp24715952p24715952.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-23954017</id>
	<title>[rvm-core] 3.1 status</title>
	<published>2009-06-09T18:17:23Z</published>
	<updated>2009-06-09T18:17:23Z</updated>
	<author>
		<name>David P Grove</name>
	</author>
	<content type="html">&lt;html&gt;&lt;body&gt;
&lt;p&gt;I plan to make the 3.1 release based on r15702 tomorrow; ran out of time to put it together today.&lt;br&gt;
&lt;br&gt;
--dave&lt;br&gt;
&lt;/body&gt;&lt;/html&gt;&lt;br /&gt;------------------------------------------------------------------------------
&lt;br&gt;Crystal Reports - New Free Runtime and 30 Day Trial
&lt;br&gt;Check out the new simplified licensing option that enables unlimited
&lt;br&gt;royalty-free distribution of the report engine for externally facing 
&lt;br&gt;server and web deployment.
&lt;br&gt;&lt;a href=&quot;http://p.sf.net/sfu/businessobjects&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/businessobjects&lt;/a&gt;&lt;br /&gt;_______________________________________________
&lt;br&gt;Jikesrvm-core mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=23954017&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Jikesrvm-core@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-rvm-core--3.1-status-tp23954017p23954017.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-23823001</id>
	<title>Re: [rvm-core] release schedule?</title>
	<published>2009-06-01T14:47:53Z</published>
	<updated>2009-06-01T14:47:53Z</updated>
	<author>
		<name>David P Grove</name>
	</author>
	<content type="html">&lt;html&gt;&lt;body&gt;
&lt;p&gt;&lt;tt&gt;Filip Pizlo &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=23823001&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;pizlo@...&lt;/a&gt;&amp;gt; wrote on 06/01/2009 01:22:50 AM:&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; However, I'm currently tooling around with other optimizations and &amp;nbsp;&lt;br&gt;
&amp;gt; lesser bugs, namely in our handling of arraycopy. &amp;nbsp;The main bug is one &amp;nbsp;&lt;br&gt;
&amp;gt; where a large arraycopy may stall the GC, and the main optimization &amp;nbsp;&lt;br&gt;
&amp;gt; has to do with our inlining strategies for arraycopy. &amp;nbsp;No promises, on &amp;nbsp;&lt;br&gt;
&amp;gt; the performance I'll be able to get; I'm just experimenting. &amp;nbsp;I'll &amp;nbsp;&lt;br&gt;
&amp;gt; probably have both the bugfixing and optimizations done in at most a &amp;nbsp;&lt;br&gt;
&amp;gt; week from now, likely much sooner.&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; So - what's our schedule for release? &amp;nbsp;Will I be able to fit it in for &amp;nbsp;&lt;br&gt;
&amp;gt; the upcoming release, or would it be better if I targeted the next &amp;nbsp;&lt;br&gt;
&amp;gt; release?&lt;br&gt;
&lt;/tt&gt;&lt;br&gt;
&lt;tt&gt;My suggested drop dead date is next Monday (6/8) with the actual release on 6/9. &amp;nbsp;We want to get it out before PLDI, but a few more days probably doesn't matter at this point. &lt;/tt&gt;&lt;br&gt;
&lt;br&gt;
&lt;tt&gt;After this one, I also really want to see us switch back into making smaller releases every 6-8 weeks instead of large releases every 6-8 months...&lt;/tt&gt;&lt;br&gt;
&lt;br&gt;
&lt;tt&gt;--dave&lt;/tt&gt;&lt;/body&gt;&lt;/html&gt;&lt;br /&gt;------------------------------------------------------------------------------
&lt;br&gt;OpenSolaris 2009.06 is a cutting edge operating system for enterprises 
&lt;br&gt;looking to deploy the next generation of Solaris that includes the latest 
&lt;br&gt;innovations from Sun and the OpenSource community. Download a copy and 
&lt;br&gt;enjoy capabilities such as Networking, Storage and Virtualization. 
&lt;br&gt;Go to: &lt;a href=&quot;http://p.sf.net/sfu/opensolaris-get&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/opensolaris-get&lt;/a&gt;&lt;br /&gt;_______________________________________________
&lt;br&gt;Jikesrvm-core mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=23823001&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Jikesrvm-core@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-rvm-core--release-schedule--tp23810075p23823001.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-23810075</id>
	<title>[rvm-core] release schedule?</title>
	<published>2009-05-31T22:22:50Z</published>
	<updated>2009-05-31T22:22:50Z</updated>
	<author>
		<name>Filip Pizlo-2</name>
	</author>
	<content type="html">As far as I can tell, the major blockers have been closed off for the &amp;nbsp;
&lt;br&gt;3.1 release.
&lt;br&gt;&lt;br&gt;However, I'm currently tooling around with other optimizations and &amp;nbsp;
&lt;br&gt;lesser bugs, namely in our handling of arraycopy. &amp;nbsp;The main bug is one &amp;nbsp;
&lt;br&gt;where a large arraycopy may stall the GC, and the main optimization &amp;nbsp;
&lt;br&gt;has to do with our inlining strategies for arraycopy. &amp;nbsp;No promises, on &amp;nbsp;
&lt;br&gt;the performance I'll be able to get; I'm just experimenting. &amp;nbsp;I'll &amp;nbsp;
&lt;br&gt;probably have both the bugfixing and optimizations done in at most a &amp;nbsp;
&lt;br&gt;week from now, likely much sooner.
&lt;br&gt;&lt;br&gt;So - what's our schedule for release? &amp;nbsp;Will I be able to fit it in for &amp;nbsp;
&lt;br&gt;the upcoming release, or would it be better if I targeted the next &amp;nbsp;
&lt;br&gt;release?
&lt;br&gt;&lt;br&gt;-Filip
&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;------------------------------------------------------------------------------
&lt;br&gt;Register Now for Creativity and Technology (CaT), June 3rd, NYC. CaT 
&lt;br&gt;is a gathering of tech-side developers &amp; brand creativity professionals. Meet
&lt;br&gt;the minds behind Google Creative Lab, Visual Complexity, Processing, &amp; 
&lt;br&gt;iPhoneDevCamp as they present alongside digital heavyweights like Barbarian 
&lt;br&gt;Group, R/GA, &amp; Big Spaceship. &lt;a href=&quot;http://p.sf.net/sfu/creativitycat-com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/creativitycat-com&lt;/a&gt;&amp;nbsp;
&lt;br&gt;_______________________________________________
&lt;br&gt;Jikesrvm-core mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=23810075&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Jikesrvm-core@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-rvm-core--release-schedule--tp23810075p23810075.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-23808777</id>
	<title>Re: [rvm-core] http://rvm.codehaus.org/docs/api/</title>
	<published>2009-05-31T18:19:58Z</published>
	<updated>2009-05-31T18:19:58Z</updated>
	<author>
		<name>David P Grove</name>
	</author>
	<content type="html">&lt;html&gt;&lt;body&gt;
&lt;p&gt;&lt;tt&gt;Filip Pizlo &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=23808777&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;pizlo@...&lt;/a&gt;&amp;gt; wrote on 05/30/2009 03:45:58 PM:&lt;/tt&gt;&lt;br&gt;
&lt;tt&gt;&amp;gt; &lt;br&gt;
&amp;gt; How (and when) do we (or should we) update this to reflect the changed &amp;nbsp;&lt;br&gt;
&amp;gt; APIs?&lt;br&gt;
&amp;gt;&lt;/tt&gt;&lt;br&gt;
&lt;br&gt;
&lt;tt&gt;I typically do that as part of making a release. &amp;nbsp;So the online javadoc always corresponds to the most recent release of Jikes RVM.&lt;/tt&gt;&lt;br&gt;
&lt;br&gt;
&lt;tt&gt;--dave&lt;/tt&gt;&lt;br&gt;
&lt;/body&gt;&lt;/html&gt;&lt;br /&gt;------------------------------------------------------------------------------
&lt;br&gt;Register Now for Creativity and Technology (CaT), June 3rd, NYC. CaT 
&lt;br&gt;is a gathering of tech-side developers &amp; brand creativity professionals. Meet
&lt;br&gt;the minds behind Google Creative Lab, Visual Complexity, Processing, &amp; 
&lt;br&gt;iPhoneDevCamp as they present alongside digital heavyweights like Barbarian 
&lt;br&gt;Group, R/GA, &amp; Big Spaceship. &lt;a href=&quot;http://p.sf.net/sfu/creativitycat-com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/creativitycat-com&lt;/a&gt;&amp;nbsp;&lt;br /&gt;_______________________________________________
&lt;br&gt;Jikesrvm-core mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=23808777&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Jikesrvm-core@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-rvm-core--http%3A--rvm.codehaus.org-docs-api--tp23796751p23808777.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-23796751</id>
	<title>[rvm-core] http://rvm.codehaus.org/docs/api/</title>
	<published>2009-05-30T12:45:58Z</published>
	<updated>2009-05-30T12:45:58Z</updated>
	<author>
		<name>Filip Pizlo-2</name>
	</author>
	<content type="html">How (and when) do we (or should we) update this to reflect the changed &amp;nbsp;
&lt;br&gt;APIs?
&lt;br&gt;&lt;br&gt;-Filip
&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;------------------------------------------------------------------------------
&lt;br&gt;Register Now for Creativity and Technology (CaT), June 3rd, NYC. CaT 
&lt;br&gt;is a gathering of tech-side developers &amp; brand creativity professionals. Meet
&lt;br&gt;the minds behind Google Creative Lab, Visual Complexity, Processing, &amp; 
&lt;br&gt;iPhoneDevCamp as they present alongside digital heavyweights like Barbarian 
&lt;br&gt;Group, R/GA, &amp; Big Spaceship. &lt;a href=&quot;http://p.sf.net/sfu/creativitycat-com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/creativitycat-com&lt;/a&gt;&amp;nbsp;
&lt;br&gt;_______________________________________________
&lt;br&gt;Jikesrvm-core mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=23796751&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Jikesrvm-core@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-rvm-core--http%3A--rvm.codehaus.org-docs-api--tp23796751p23796751.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-23638743</id>
	<title>Re: [rvm-core] [rvm-commits] SF.net SVN: jikesrvm:[15692] rvmroot/trunk/libraryInterface/Common/src/java /lang/Class.java</title>
	<published>2009-05-20T09:13:25Z</published>
	<updated>2009-05-20T09:13:25Z</updated>
	<author>
		<name>Ian Rogers (nabble)</name>
	</author>
	<content type="html">Hi,
&lt;br&gt;&lt;br&gt;when taking code from MRP to the RVM (it's great the RVM can catch up
&lt;br&gt;with us) can you make sure that the commit message attribute the code
&lt;br&gt;to MRP. This patch is MRP-2.
&lt;br&gt;&lt;br&gt;Thanks,
&lt;br&gt;Ian
&lt;br&gt;&lt;br&gt;2009/5/19 &amp;nbsp;&amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=23638743&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dframpton-oss@...&lt;/a&gt;&amp;gt;:
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; Revision: 15692
&lt;br&gt;&amp;gt;          &lt;a href=&quot;http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=15692&amp;view=rev&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=15692&amp;view=rev&lt;/a&gt;&lt;br&gt;&amp;gt; Author:   dframpton-oss
&lt;br&gt;&amp;gt; Date:     2009-05-20 04:30:11 +0000 (Wed, 20 May 2009)
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Log Message:
&lt;br&gt;&amp;gt; -----------
&lt;br&gt;&amp;gt; Do not search superclasses for a method unless no method is found.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Modified Paths:
&lt;br&gt;&amp;gt; --------------
&lt;br&gt;&amp;gt;    rvmroot/trunk/libraryInterface/Common/src/java/lang/Class.java
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Modified: rvmroot/trunk/libraryInterface/Common/src/java/lang/Class.java
&lt;br&gt;&amp;gt; ===================================================================
&lt;br&gt;&amp;gt; --- rvmroot/trunk/libraryInterface/Common/src/java/lang/Class.java      2009-05-20 01:46:10 UTC (rev 15691)
&lt;br&gt;&amp;gt; +++ rvmroot/trunk/libraryInterface/Common/src/java/lang/Class.java      2009-05-20 04:30:11 UTC (rev 15692)
&lt;br&gt;&amp;gt; @@ -877,7 +877,7 @@
&lt;br&gt;&amp;gt;   @Pure
&lt;br&gt;&amp;gt;   private RVMMethod getMethodInternal1(Atom aName, Class&amp;lt;?&amp;gt;... parameterTypes) {
&lt;br&gt;&amp;gt;     RVMMethod answer = null;
&lt;br&gt;&amp;gt; -    for (RVMClass current = type.asClass(); current != null; current = current.getSuperClass()) {
&lt;br&gt;&amp;gt; +    for (RVMClass current = type.asClass(); current != null &amp;&amp; answer == null; current = current.getSuperClass()) {
&lt;br&gt;&amp;gt;       RVMMethod[] methods = current.getDeclaredMethods();
&lt;br&gt;&amp;gt;       for (RVMMethod meth : methods) {
&lt;br&gt;&amp;gt;         if (meth.getName() == aName &amp;&amp; meth.isPublic() &amp;&amp;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; ------------------------------------------------------------------------------
&lt;br&gt;&amp;gt; Crystal Reports - New Free Runtime and 30 Day Trial
&lt;br&gt;&amp;gt; Check out the new simplified licensing option that enables
&lt;br&gt;&amp;gt; unlimited royalty-free distribution of the report engine
&lt;br&gt;&amp;gt; for externally facing server and web deployment.
&lt;br&gt;&amp;gt; &lt;a href=&quot;http://p.sf.net/sfu/businessobjects&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/businessobjects&lt;/a&gt;&lt;br&gt;&amp;gt; _______________________________________________
&lt;br&gt;&amp;gt; Jikesrvm-commits mailing list
&lt;br&gt;&amp;gt; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=23638743&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Jikesrvm-commits@...&lt;/a&gt;
&lt;br&gt;&amp;gt; &lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/jikesrvm-commits&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/jikesrvm-commits&lt;/a&gt;&lt;br&gt;&amp;gt;
&lt;/div&gt;&lt;br&gt;------------------------------------------------------------------------------
&lt;br&gt;Crystal Reports - New Free Runtime and 30 Day Trial
&lt;br&gt;Check out the new simplified licensing option that enables 
&lt;br&gt;unlimited royalty-free distribution of the report engine 
&lt;br&gt;for externally facing server and web deployment. 
&lt;br&gt;&lt;a href=&quot;http://p.sf.net/sfu/businessobjects&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/businessobjects&lt;/a&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;Jikesrvm-core mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=23638743&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Jikesrvm-core@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Re%3A--rvm-core---rvm-commits--SF.net-SVN%3A-jikesrvm%3A-15692--rvmroot-trunk-libraryInterface-Common-src-java--lang-Class.java-tp23638743p23638743.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-23633066</id>
	<title>Re: [rvm-core] [Re possible bug]but the value is conveted to long and	int?</title>
	<published>2009-05-20T03:45:13Z</published>
	<updated>2009-05-20T03:45:13Z</updated>
	<author>
		<name>Eliot Moss</name>
	</author>
	<content type="html">Da Feng wrote:
&lt;br&gt;&amp;gt; Does magic treat these setInt, setLong, setByte differently?
&lt;br&gt;&amp;gt; &amp;nbsp;long bits = Magic.getLongAtOffset(obj, offset);
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; then
&lt;br&gt;&amp;gt; Magic.setLongAtOffset(newObj, offset, bits);
&lt;br&gt;&lt;br&gt;Differently from what? They are for fetching and setting
&lt;br&gt;ranges of bytes at specified offsets, and can be used to
&lt;br&gt;index into any kind of object at positive or negative
&lt;br&gt;offsets. If the offset is a constant, and corresponds
&lt;br&gt;to the position of a declared field, then they will act
&lt;br&gt;like a field access (though possibly without any
&lt;br&gt;associated barrier (non-pointer fields do not usually
&lt;br&gt;have a barrier, however)). But you can use these to
&lt;br&gt;access into any structure, and could even read or
&lt;br&gt;update a byte in the middle of a pointer or something,
&lt;br&gt;that is, they are not type safe and therefore need
&lt;br&gt;to be used with care. The offset also need not be a
&lt;br&gt;constant, but can be calculated.
&lt;br&gt;&lt;br&gt;Typically these are appropriate for internal system
&lt;br&gt;components, such as garbage collectors.
&lt;br&gt;&lt;br&gt;Best wishes -- Eliot Moss
&lt;br&gt;&lt;br&gt;------------------------------------------------------------------------------
&lt;br&gt;Crystal Reports - New Free Runtime and 30 Day Trial
&lt;br&gt;Check out the new simplified licensing option that enables 
&lt;br&gt;unlimited royalty-free distribution of the report engine 
&lt;br&gt;for externally facing server and web deployment. 
&lt;br&gt;&lt;a href=&quot;http://p.sf.net/sfu/businessobjects&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/businessobjects&lt;/a&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;Jikesrvm-core mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=23633066&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Jikesrvm-core@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-rvm-core---Re-possible-bug-but-the-value-is-conveted-to-long-and-int--tp23632758p23633066.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-23632758</id>
	<title>[rvm-core] [Re possible bug]but the value is conveted to long and int?</title>
	<published>2009-05-20T03:21:36Z</published>
	<updated>2009-05-20T03:21:36Z</updated>
	<author>
		<name>vondart</name>
	</author>
	<content type="html">&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;div style=&quot;font-family:arial,helvetica,sans-serif;font-size:12pt&quot;&gt;Does magic treat these setInt, setLong, setByte differently?&lt;br&gt;&amp;nbsp;long bits = Magic.getLongAtOffset(obj, offset);&lt;br&gt;&lt;br&gt;then &lt;br&gt;Magic.setLongAtOffset(newObj, offset, bits);&lt;br&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;span style=&quot;font-weight: bold; font-style: italic; color: rgb(0, 0, 255);&quot;&gt;DaFENG&lt;/span&gt;&lt;br&gt;&lt;span style=&quot;color: rgb(0, 255, 128); font-style: italic;&quot;&gt;Coder&lt;/span&gt;&lt;br style=&quot;color: rgb(0, 255, 128); font-style: italic;&quot;&gt;&lt;span style=&quot;color: rgb(0, 255, 128); font-style: italic;&quot;&gt;Telecommunication &amp;amp;&amp;amp; Network Industry&lt;/span&gt;&lt;br style=&quot;color: rgb(0, 255, 128); font-style: italic;&quot;&gt;&lt;span style=&quot;color: rgb(0, 255, 128); font-style: italic;&quot;&gt;Pudong&lt;/span&gt;&lt;br style=&quot;color: rgb(0, 255, 128); font-style: italic;&quot;&gt;&lt;span style=&quot;color: rgb(0, 255, 128); font-style: italic;&quot;&gt;Shanghai&lt;/span&gt;&lt;br style=&quot;color: rgb(0,
 255, 128); font-style: italic;&quot;&gt;&lt;span style=&quot;color: rgb(0, 255, 128); font-style: italic;&quot;&gt;China&lt;br&gt;&lt;/span&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;br&gt;

      &lt;/body&gt;&lt;/html&gt;&lt;br /&gt;------------------------------------------------------------------------------
&lt;br&gt;Crystal Reports - New Free Runtime and 30 Day Trial
&lt;br&gt;Check out the new simplified licensing option that enables 
&lt;br&gt;unlimited royalty-free distribution of the report engine 
&lt;br&gt;for externally facing server and web deployment. 
&lt;br&gt;&lt;a href=&quot;http://p.sf.net/sfu/businessobjects&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/businessobjects&lt;/a&gt;&lt;br /&gt;_______________________________________________
&lt;br&gt;Jikesrvm-core mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=23632758&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Jikesrvm-core@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-rvm-core---Re-possible-bug-but-the-value-is-conveted-to-long-and-int--tp23632758p23632758.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-23620073</id>
	<title>Re: [rvm-core] a possible bug</title>
	<published>2009-05-19T09:41:35Z</published>
	<updated>2009-05-19T09:41:35Z</updated>
	<author>
		<name>Michael Bond</name>
	</author>
	<content type="html">Hi,
&lt;br&gt;&lt;br&gt;The float and double cases are actually covered by the following checks in 
&lt;br&gt;that method:
&lt;br&gt;&lt;br&gt;if (size == BYTES_IN_INT) { /* handles floats */
&lt;br&gt;&lt;br&gt;if (size == BYTES_IN_LONG) { /* handles doubles */
&lt;br&gt;&lt;br&gt;Note that float and int have the same number of bytes (4), and double and 
&lt;br&gt;long have the same number of bytes (8).
&lt;br&gt;&lt;br&gt;cheers,
&lt;br&gt;Mike
&lt;br&gt;&lt;br&gt;&lt;br&gt;On Tue, 19 May 2009, Da Feng wrote:
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; method  private static Object cloneClass2(Object obj, RVMType type) throws OutOfMemoryError , in class
&lt;br&gt;&amp;gt; org.jikesrvm.runtime.RuntimeEntrypoints, didn't consider float and double, is that a possible bug? I didn't
&lt;br&gt;&amp;gt; test it, just a question.
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; DaFENG
&lt;br&gt;&amp;gt; Coder
&lt;br&gt;&amp;gt; Telecommunication &amp;&amp; Network Industry
&lt;br&gt;&amp;gt; Pudong
&lt;br&gt;&amp;gt; Shanghai
&lt;br&gt;&amp;gt; China
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt;&lt;/div&gt;&lt;/div&gt;------------------------------------------------------------------------------
&lt;br&gt;Crystal Reports - New Free Runtime and 30 Day Trial
&lt;br&gt;Check out the new simplified licensing option that enables 
&lt;br&gt;unlimited royalty-free distribution of the report engine 
&lt;br&gt;for externally facing server and web deployment. 
&lt;br&gt;&lt;a href=&quot;http://p.sf.net/sfu/businessobjects&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/businessobjects&lt;/a&gt;&lt;br /&gt;_______________________________________________
&lt;br&gt;Jikesrvm-core mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=23620073&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Jikesrvm-core@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-rvm-core--a-possible-bug-tp23617235p23620073.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-23617235</id>
	<title>[rvm-core] a possible bug</title>
	<published>2009-05-19T07:11:58Z</published>
	<updated>2009-05-19T07:11:58Z</updated>
	<author>
		<name>vondart</name>
	</author>
	<content type="html">&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;div style=&quot;font-family:arial,helvetica,sans-serif;font-size:12pt&quot;&gt;method&amp;nbsp; private static Object cloneClass2(Object obj, RVMType type) throws OutOfMemoryError , in class org.jikesrvm.runtime.RuntimeEntrypoints, didn't consider float and double, is that a possible bug? I didn't test it, just a question.&lt;br&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;span style=&quot;font-weight: bold; font-style: italic; color: rgb(0, 0, 255);&quot;&gt;DaFENG&lt;/span&gt;&lt;br&gt;&lt;span style=&quot;color: rgb(0, 255, 128); font-style: italic;&quot;&gt;Coder&lt;/span&gt;&lt;br style=&quot;color: rgb(0, 255, 128); font-style: italic;&quot;&gt;&lt;span style=&quot;color: rgb(0, 255, 128); font-style: italic;&quot;&gt;Telecommunication &amp;amp;&amp;amp; Network Industry&lt;/span&gt;&lt;br style=&quot;color: rgb(0, 255, 128); font-style: italic;&quot;&gt;&lt;span style=&quot;color: rgb(0, 255, 128); font-style: italic;&quot;&gt;Pudong&lt;/span&gt;&lt;br style=&quot;color: rgb(0, 255, 128); font-style: italic;&quot;&gt;&lt;span style=&quot;color: rgb(0, 255, 128);
 font-style: italic;&quot;&gt;Shanghai&lt;/span&gt;&lt;br style=&quot;color: rgb(0, 255, 128); font-style: italic;&quot;&gt;&lt;span style=&quot;color: rgb(0, 255, 128); font-style: italic;&quot;&gt;China&lt;br&gt;&lt;/span&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;br&gt;



      &lt;/body&gt;&lt;/html&gt;&lt;br /&gt;------------------------------------------------------------------------------
&lt;br&gt;Crystal Reports - New Free Runtime and 30 Day Trial
&lt;br&gt;Check out the new simplified licensing option that enables 
&lt;br&gt;unlimited royalty-free distribution of the report engine 
&lt;br&gt;for externally facing server and web deployment. 
&lt;br&gt;&lt;a href=&quot;http://p.sf.net/sfu/businessobjects&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/businessobjects&lt;/a&gt;&lt;br /&gt;_______________________________________________
&lt;br&gt;Jikesrvm-core mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=23617235&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Jikesrvm-core@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-rvm-core--a-possible-bug-tp23617235p23617235.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-23444460</id>
	<title>Re: [rvm-core] [rvm-commits] SF.net SVN: jikesrvm:[15685]	rvmroot/trunk</title>
	<published>2009-05-08T04:35:59Z</published>
	<updated>2009-05-08T04:35:59Z</updated>
	<author>
		<name>David P Grove</name>
	</author>
	<content type="html">&lt;html&gt;&lt;body&gt;
&lt;p&gt;and of course this morning it works for me too (after another svn update to pick up harmony fixes).  Wonder if somehow eclipse let me pick up a partial version of 15685 when I did the update last night.&lt;br&gt;
&lt;br&gt;
sorry for the false alarm.&lt;br&gt;
&lt;br&gt;
--dave&lt;br&gt;
&lt;/body&gt;&lt;/html&gt;&lt;br /&gt;------------------------------------------------------------------------------
&lt;br&gt;The NEW KODAK i700 Series Scanners deliver under ANY circumstances! Your
&lt;br&gt;production scanning environment may not be a perfect world - but thanks to
&lt;br&gt;Kodak, there's a perfect scanner to get the job done! With the NEW KODAK i700
&lt;br&gt;Series Scanner you'll get full speed at 300 dpi even with all image 
&lt;br&gt;processing features enabled. &lt;a href=&quot;http://p.sf.net/sfu/kodak-com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/kodak-com&lt;/a&gt;&lt;br /&gt;_______________________________________________
&lt;br&gt;Jikesrvm-core mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=23444460&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Jikesrvm-core@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Re%3A--rvm-core---rvm-commits--SF.net-SVN%3A-jikesrvm%3A-15685--rvmroot-trunk-tp23439089p23444460.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-23441104</id>
	<title>[rvm-core] Biased locking</title>
	<published>2009-05-08T00:02:39Z</published>
	<updated>2009-05-08T00:02:39Z</updated>
	<author>
		<name>Steve Blackburn</name>
	</author>
	<content type="html">For those who hadn't noticed, this change brings a very nice win to &amp;nbsp;
&lt;br&gt;our bottom line. &amp;nbsp; Thanks very much Filip for your hard work on this!
&lt;br&gt;&lt;br&gt;See here: &amp;nbsp;&lt;a href=&quot;http://jikesrvm.anu.edu.au/cattrack/results/habanero.anu.edu.au/perf/9128/performance_report&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://jikesrvm.anu.edu.au/cattrack/results/habanero.anu.edu.au/perf/9128/performance_report&lt;/a&gt;&lt;br&gt;&lt;br&gt;This is easily the best performance boost we've had since we've &amp;nbsp;
&lt;br&gt;started doing perf regressions. &amp;nbsp;Yay!!!
&lt;br&gt;&lt;br&gt;--Steve
&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;On 08/05/2009, at 8:40 AM, &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=23441104&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;pizlo@...&lt;/a&gt; wrote:
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; Revision: 15685
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=15685&amp;view=rev&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=15685&amp;view=rev&lt;/a&gt;&lt;br&gt;&amp;gt; Author: &amp;nbsp; pizlo
&lt;br&gt;&amp;gt; Date: &amp;nbsp; &amp;nbsp; 2009-05-07 22:40:00 +0000 (Thu, 07 May 2009)
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Log Message:
&lt;br&gt;&amp;gt; -----------
&lt;br&gt;&amp;gt; Merging biased locking support. &amp;nbsp;Biased locking is on by default and &amp;nbsp;
&lt;br&gt;&amp;gt; there is currently no way to disable it (except potentially by some &amp;nbsp;
&lt;br&gt;&amp;gt; small hacks in the code). &amp;nbsp;On DaCapo, we see no performance &amp;nbsp;
&lt;br&gt;&amp;gt; degradation on any benchmark; instead we see a 6% performance boost &amp;nbsp;
&lt;br&gt;&amp;gt; in the geomean.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Modified Paths:
&lt;br&gt;&amp;gt; --------------
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;rvmroot/trunk/build/primordials/RVM.txt
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;rvmroot/trunk/rvm/src/org/jikesrvm/VM.java
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/bc2ir/BC2IR.java
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/JavaHeader.java
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ObjectModel.java
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ 
&lt;br&gt;&amp;gt; ThinLockConstants.java
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Lock.java
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/RVMThread.java
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Synchronization.java
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/ThinLock.java
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Modified: rvmroot/trunk/build/primordials/RVM.txt
&lt;br&gt;&amp;gt; ===================================================================
&lt;br&gt;&amp;gt; --- rvmroot/trunk/build/primordials/RVM.txt	2009-05-07 20:08:18 UTC &amp;nbsp;
&lt;br&gt;&amp;gt; (rev 15684)
&lt;br&gt;&amp;gt; +++ rvmroot/trunk/build/primordials/RVM.txt	2009-05-07 22:40:00 UTC &amp;nbsp;
&lt;br&gt;&amp;gt; (rev 15685)
&lt;br&gt;&amp;gt; @@ -54,6 +54,8 @@
&lt;br&gt;&amp;gt; [[Lorg/jikesrvm/scheduler/RVMThread;
&lt;br&gt;&amp;gt; [Lorg/jikesrvm/scheduler/RVMThread$BlockAdapter;
&lt;br&gt;&amp;gt; [[Lorg/jikesrvm/scheduler/RVMThread$BlockAdapter;
&lt;br&gt;&amp;gt; +Lorg/jikesrvm/scheduler/ThinLock;
&lt;br&gt;&amp;gt; +Lorg/jikesrvm/scheduler/Lock;
&lt;br&gt;&amp;gt; [Lorg/jikesrvm/scheduler/Lock;
&lt;br&gt;&amp;gt; [[Lorg/jikesrvm/scheduler/Lock;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/VM.java
&lt;br&gt;&amp;gt; ===================================================================
&lt;br&gt;&amp;gt; --- rvmroot/trunk/rvm/src/org/jikesrvm/VM.java	2009-05-07 20:08:18 &amp;nbsp;
&lt;br&gt;&amp;gt; UTC (rev 15684)
&lt;br&gt;&amp;gt; +++ rvmroot/trunk/rvm/src/org/jikesrvm/VM.java	2009-05-07 22:40:00 &amp;nbsp;
&lt;br&gt;&amp;gt; UTC (rev 15685)
&lt;br&gt;&amp;gt; @@ -2058,6 +2058,25 @@
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; swUnlock();
&lt;br&gt;&amp;gt; &amp;nbsp; }
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; + &amp;nbsp;@NoInline
&lt;br&gt;&amp;gt; + &amp;nbsp;public static void sysWriteln(String s0, Address a1, String s1, &amp;nbsp;
&lt;br&gt;&amp;gt; Word w1, String s2, int i1, String s3, int i2, String s4, Word w2, &amp;nbsp;
&lt;br&gt;&amp;gt; String s5, int i3) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;swLock();
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;write(s0);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;write(a1);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;write(s1);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;write(w1);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;write(s2);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;write(i1);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;write(s3);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;write(i2);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;write(s4);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;write(w2);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;write(s5);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;write(i3);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;writeln();
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;swUnlock();
&lt;br&gt;&amp;gt; + &amp;nbsp;}
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; &amp;nbsp; private static void showThread() {
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; write(&amp;quot;Thread &amp;quot;);
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; write(RVMThread.getCurrentThread().getThreadSlot());
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/bc2ir/ 
&lt;br&gt;&amp;gt; BC2IR.java
&lt;br&gt;&amp;gt; ===================================================================
&lt;br&gt;&amp;gt; --- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/bc2ir/ 
&lt;br&gt;&amp;gt; BC2IR.java	2009-05-07 20:08:18 UTC (rev 15684)
&lt;br&gt;&amp;gt; +++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/bc2ir/ 
&lt;br&gt;&amp;gt; BC2IR.java	2009-05-07 22:40:00 UTC (rev 15685)
&lt;br&gt;&amp;gt; @@ -3635,6 +3635,7 @@
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;*/
&lt;br&gt;&amp;gt; &amp;nbsp; public boolean do_NullCheck(Operand ref) {
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; if (gc.noNullChecks()) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;setCurrentGuard(new TrueGuardOperand());
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; return false;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; if (ref.isDefinitelyNull()) {
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ 
&lt;br&gt;&amp;gt; JavaHeader.java
&lt;br&gt;&amp;gt; ===================================================================
&lt;br&gt;&amp;gt; --- rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/JavaHeader.java	 
&lt;br&gt;&amp;gt; 2009-05-07 20:08:18 UTC (rev 15684)
&lt;br&gt;&amp;gt; +++ rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/JavaHeader.java	 
&lt;br&gt;&amp;gt; 2009-05-07 22:40:00 UTC (rev 15685)
&lt;br&gt;&amp;gt; @@ -492,6 +492,7 @@
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;* Get the hash code of an object.
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;*/
&lt;br&gt;&amp;gt; &amp;nbsp; @Inline
&lt;br&gt;&amp;gt; + &amp;nbsp;@Interruptible
&lt;br&gt;&amp;gt; &amp;nbsp; public static int getObjectHashCode(Object o) {
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; if (ADDRESS_BASED_HASHING) {
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (MemoryManagerConstants.MOVES_OBJECTS) {
&lt;br&gt;&amp;gt; @@ -513,10 +514,18 @@
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } else {
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // UNHASHED
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word tmp;
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;do {
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tmp = Magic.prepareWord(o, STATUS_OFFSET);
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} while (!Magic.attemptWord(o, STATUS_OFFSET, tmp, &amp;nbsp;
&lt;br&gt;&amp;gt; tmp.or(HASH_STATE_HASHED)));
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;boolean lhr=ThinLock.lockHeader(o, STATUS_OFFSET);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (lhr) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.setWordAtOffset(
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;o, STATUS_OFFSET,
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.getWordAtOffset(o, &amp;nbsp;
&lt;br&gt;&amp;gt; STATUS_OFFSET).or(HASH_STATE_HASHED));
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word tmp;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;do {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tmp = Magic.prepareWord(o, STATUS_OFFSET);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} while (!Magic.attemptWord(o, STATUS_OFFSET, tmp, &amp;nbsp;
&lt;br&gt;&amp;gt; tmp.or(HASH_STATE_HASHED)));
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ThinLock.unlockHeader(o, STATUS_OFFSET, lhr);
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (ObjectModel.HASH_STATS) ObjectModel.hashTransition1++;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return getObjectHashCode(o);
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;gt; @@ -534,20 +543,35 @@
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; /** Install a new hashcode (only used if !ADDRESS_BASED_HASHING) */
&lt;br&gt;&amp;gt; &amp;nbsp; @NoInline
&lt;br&gt;&amp;gt; + &amp;nbsp;@Interruptible
&lt;br&gt;&amp;gt; &amp;nbsp; protected static int installHashCode(Object o) {
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; Word hashCode;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; do {
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; hashCodeGenerator = &amp;nbsp;
&lt;br&gt;&amp;gt; hashCodeGenerator.plus(Word.one().lsh(HASH_CODE_SHIFT));
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; hashCode = hashCodeGenerator.and(HASH_CODE_MASK);
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; } while (hashCode.isZero());
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp;while (true) {
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;Word statusWord = Magic.prepareWord(o, STATUS_OFFSET);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;if (ThinLock.lockHeader(o, STATUS_OFFSET)) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Word statusWord = Magic.getWordAtOffset(o, STATUS_OFFSET);
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (!(statusWord.and(HASH_CODE_MASK).isZero())) // some other &amp;nbsp;
&lt;br&gt;&amp;gt; thread installed a hashcode
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ThinLock.unlockHeader(o, STATUS_OFFSET, true);
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return &amp;nbsp;
&lt;br&gt;&amp;gt; statusWord.and(HASH_CODE_MASK).rshl(HASH_CODE_SHIFT).toInt();
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Magic.attemptWord(o, STATUS_OFFSET, statusWord, &amp;nbsp;
&lt;br&gt;&amp;gt; statusWord.or(hashCode))) {
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return hashCode.rshl(HASH_CODE_SHIFT).toInt(); &amp;nbsp;// we &amp;nbsp;
&lt;br&gt;&amp;gt; installed the hash code
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.setWordAtOffset(o, STATUS_OFFSET, &amp;nbsp;
&lt;br&gt;&amp;gt; statusWord.or(hashCode));
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;ThinLock.unlockHeader(o, STATUS_OFFSET, true);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;return hashCode.rshl(HASH_CODE_SHIFT).toInt(); &amp;nbsp;// we &amp;nbsp;
&lt;br&gt;&amp;gt; installed the hash code
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;while (true) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word statusWord = Magic.prepareWord(o, STATUS_OFFSET);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!(statusWord.and(HASH_CODE_MASK).isZero())) // some &amp;nbsp;
&lt;br&gt;&amp;gt; other thread installed a hashcode
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ThinLock.unlockHeader(o, STATUS_OFFSET, false);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return &amp;nbsp;
&lt;br&gt;&amp;gt; statusWord.and(HASH_CODE_MASK).rshl(HASH_CODE_SHIFT).toInt();
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Magic.attemptWord(o, STATUS_OFFSET, statusWord, &amp;nbsp;
&lt;br&gt;&amp;gt; statusWord.or(hashCode))) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ThinLock.unlockHeader(o, STATUS_OFFSET, false);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return hashCode.rshl(HASH_CODE_SHIFT).toInt(); &amp;nbsp;// we &amp;nbsp;
&lt;br&gt;&amp;gt; installed the hash code
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;gt; &amp;nbsp; }
&lt;br&gt;&amp;gt; @@ -677,6 +701,7 @@
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;* Freeze the other bits in the byte containing the available bits
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;* so that it is safe to update them using setAvailableBits.
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;*/
&lt;br&gt;&amp;gt; + &amp;nbsp;@Interruptible
&lt;br&gt;&amp;gt; &amp;nbsp; public static void initializeAvailableByte(Object o) {
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; if (!ADDRESS_BASED_HASHING) getObjectHashCode(o);
&lt;br&gt;&amp;gt; &amp;nbsp; }
&lt;br&gt;&amp;gt; @@ -685,6 +710,8 @@
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;* A prepare on the word containing the available bits
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;*/
&lt;br&gt;&amp;gt; &amp;nbsp; public static Word prepareAvailableBits(Object o) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.worldStopped() || ThinLock.allowHeaderCAS(o, &amp;nbsp;
&lt;br&gt;&amp;gt; STATUS_OFFSET));
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; return Magic.prepareWord(o, STATUS_OFFSET);
&lt;br&gt;&amp;gt; &amp;nbsp; }
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; @@ -692,6 +719,8 @@
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;* An attempt on the word containing the available bits
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;*/
&lt;br&gt;&amp;gt; &amp;nbsp; public static boolean attemptAvailableBits(Object o, Word oldVal, &amp;nbsp;
&lt;br&gt;&amp;gt; Word newVal) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.worldStopped() || ThinLock.allowHeaderCAS(o, &amp;nbsp;
&lt;br&gt;&amp;gt; STATUS_OFFSET));
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; return Magic.attemptWord(o, STATUS_OFFSET, oldVal, newVal);
&lt;br&gt;&amp;gt; &amp;nbsp; }
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ 
&lt;br&gt;&amp;gt; ObjectModel.java
&lt;br&gt;&amp;gt; ===================================================================
&lt;br&gt;&amp;gt; --- rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ObjectModel.java	 
&lt;br&gt;&amp;gt; 2009-05-07 20:08:18 UTC (rev 15684)
&lt;br&gt;&amp;gt; +++ rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ObjectModel.java	 
&lt;br&gt;&amp;gt; 2009-05-07 22:40:00 UTC (rev 15685)
&lt;br&gt;&amp;gt; @@ -432,6 +432,7 @@
&lt;br&gt;&amp;gt; &amp;nbsp; /**
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;* Get the hash code of an object.
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;*/
&lt;br&gt;&amp;gt; + &amp;nbsp;@Interruptible
&lt;br&gt;&amp;gt; &amp;nbsp; public static int getObjectHashCode(Object o) {
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; if (HASH_STATS) hashRequests++;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; return JavaHeader.getObjectHashCode(o);
&lt;br&gt;&amp;gt; @@ -547,6 +548,7 @@
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;* Freeze the other bits in the byte containing the available bits
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;* so that it is safe to update them using setAvailableBits.
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;*/
&lt;br&gt;&amp;gt; + &amp;nbsp;@Interruptible
&lt;br&gt;&amp;gt; &amp;nbsp; public static void initializeAvailableByte(Object o) {
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; JavaHeader.initializeAvailableByte(o);
&lt;br&gt;&amp;gt; &amp;nbsp; }
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ 
&lt;br&gt;&amp;gt; ThinLockConstants.java
&lt;br&gt;&amp;gt; ===================================================================
&lt;br&gt;&amp;gt; --- rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ 
&lt;br&gt;&amp;gt; ThinLockConstants.java	2009-05-07 20:08:18 UTC (rev 15684)
&lt;br&gt;&amp;gt; +++ rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ 
&lt;br&gt;&amp;gt; ThinLockConstants.java	2009-05-07 22:40:00 UTC (rev 15685)
&lt;br&gt;&amp;gt; @@ -35,21 +35,32 @@
&lt;br&gt;&amp;gt; &amp;nbsp;*/
&lt;br&gt;&amp;gt; public interface ThinLockConstants extends SizeConstants {
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; - &amp;nbsp;int NUM_BITS_TID = RVMThread.LOG_MAX_THREADS;
&lt;br&gt;&amp;gt; - &amp;nbsp;int NUM_BITS_RC = JavaHeader.NUM_THIN_LOCK_BITS - NUM_BITS_TID;
&lt;br&gt;&amp;gt; + &amp;nbsp;// biased locking / thin locking status bits:
&lt;br&gt;&amp;gt; + &amp;nbsp;// 00 -&amp;gt; thin biasable, and biased if TID is non-zero
&lt;br&gt;&amp;gt; + &amp;nbsp;// 01 -&amp;gt; thin unbiasable
&lt;br&gt;&amp;gt; + &amp;nbsp;// 10 -&amp;gt; fat unbiasable
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; + &amp;nbsp;int TL_NUM_BITS_STAT = 2;
&lt;br&gt;&amp;gt; + &amp;nbsp;int TL_NUM_BITS_TID = RVMThread.LOG_MAX_THREADS;
&lt;br&gt;&amp;gt; + &amp;nbsp;int TL_NUM_BITS_RC = JavaHeader.NUM_THIN_LOCK_BITS - &amp;nbsp;
&lt;br&gt;&amp;gt; TL_NUM_BITS_TID - TL_NUM_BITS_STAT;
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; &amp;nbsp; int TL_LOCK_COUNT_SHIFT = JavaHeader.THIN_LOCK_SHIFT;
&lt;br&gt;&amp;gt; - &amp;nbsp;int TL_THREAD_ID_SHIFT = TL_LOCK_COUNT_SHIFT + NUM_BITS_RC;
&lt;br&gt;&amp;gt; + &amp;nbsp;int TL_THREAD_ID_SHIFT = TL_LOCK_COUNT_SHIFT + TL_NUM_BITS_RC;
&lt;br&gt;&amp;gt; + &amp;nbsp;int TL_STAT_SHIFT = TL_THREAD_ID_SHIFT + TL_NUM_BITS_TID;
&lt;br&gt;&amp;gt; &amp;nbsp; int TL_LOCK_ID_SHIFT = JavaHeader.THIN_LOCK_SHIFT;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; int TL_LOCK_COUNT_UNIT = 1 &amp;lt;&amp;lt; TL_LOCK_COUNT_SHIFT;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; - &amp;nbsp;Word TL_LOCK_COUNT_MASK = &amp;nbsp;
&lt;br&gt;&amp;gt; Word.fromIntSignExtend(-1).rshl(BITS_IN_ADDRESS - &amp;nbsp;
&lt;br&gt;&amp;gt; NUM_BITS_RC).lsh(TL_LOCK_COUNT_SHIFT);
&lt;br&gt;&amp;gt; - &amp;nbsp;Word TL_THREAD_ID_MASK = &amp;nbsp;
&lt;br&gt;&amp;gt; Word.fromIntSignExtend(-1).rshl(BITS_IN_ADDRESS - &amp;nbsp;
&lt;br&gt;&amp;gt; NUM_BITS_TID).lsh(TL_THREAD_ID_SHIFT);
&lt;br&gt;&amp;gt; + &amp;nbsp;Word TL_LOCK_COUNT_MASK = &amp;nbsp;
&lt;br&gt;&amp;gt; Word.fromIntSignExtend(-1).rshl(BITS_IN_ADDRESS - &amp;nbsp;
&lt;br&gt;&amp;gt; TL_NUM_BITS_RC).lsh(TL_LOCK_COUNT_SHIFT);
&lt;br&gt;&amp;gt; + &amp;nbsp;Word TL_THREAD_ID_MASK = &amp;nbsp;
&lt;br&gt;&amp;gt; Word.fromIntSignExtend(-1).rshl(BITS_IN_ADDRESS - &amp;nbsp;
&lt;br&gt;&amp;gt; TL_NUM_BITS_TID).lsh(TL_THREAD_ID_SHIFT);
&lt;br&gt;&amp;gt; &amp;nbsp; Word TL_LOCK_ID_MASK =
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;Word.fromIntSignExtend(-1).rshl(BITS_IN_ADDRESS - &amp;nbsp;
&lt;br&gt;&amp;gt; (NUM_BITS_RC + NUM_BITS_TID - 1)).lsh(TL_LOCK_ID_SHIFT);
&lt;br&gt;&amp;gt; - &amp;nbsp;Word TL_FAT_LOCK_MASK = Word.one().lsh(JavaHeader.THIN_LOCK_SHIFT &amp;nbsp;
&lt;br&gt;&amp;gt; + NUM_BITS_RC + NUM_BITS_TID - 1);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Word.fromIntSignExtend(-1).rshl(BITS_IN_ADDRESS - &amp;nbsp;
&lt;br&gt;&amp;gt; (TL_NUM_BITS_RC + TL_NUM_BITS_TID)).lsh(TL_LOCK_ID_SHIFT);
&lt;br&gt;&amp;gt; + &amp;nbsp;Word TL_STAT_MASK = &amp;nbsp;
&lt;br&gt;&amp;gt; Word.fromIntSignExtend(-1).rshl(BITS_IN_ADDRESS - &amp;nbsp;
&lt;br&gt;&amp;gt; TL_NUM_BITS_TID).lsh(TL_STAT_SHIFT);
&lt;br&gt;&amp;gt; &amp;nbsp; Word TL_UNLOCK_MASK = &amp;nbsp;
&lt;br&gt;&amp;gt; Word.fromIntSignExtend(-1).rshl(BITS_IN_ADDRESS - JavaHeader
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; .NUM_THIN_LOCK_BITS).lsh(JavaHeader.THIN_LOCK_SHIFT).not();
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; + &amp;nbsp;Word TL_STAT_BIASABLE = &amp;nbsp;
&lt;br&gt;&amp;gt; Word.fromIntSignExtend(0).lsh(TL_STAT_SHIFT);
&lt;br&gt;&amp;gt; + &amp;nbsp;Word TL_STAT_THIN = Word.fromIntSignExtend(1).lsh(TL_STAT_SHIFT);
&lt;br&gt;&amp;gt; + &amp;nbsp;Word TL_STAT_FAT = Word.fromIntSignExtend(2).lsh(TL_STAT_SHIFT);
&lt;br&gt;&amp;gt; }
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Lock.java
&lt;br&gt;&amp;gt; ===================================================================
&lt;br&gt;&amp;gt; --- rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Lock.java	 
&lt;br&gt;&amp;gt; 2009-05-07 20:08:18 UTC (rev 15684)
&lt;br&gt;&amp;gt; +++ rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Lock.java	 
&lt;br&gt;&amp;gt; 2009-05-07 22:40:00 UTC (rev 15685)
&lt;br&gt;&amp;gt; @@ -115,7 +115,7 @@
&lt;br&gt;&amp;gt; &amp;nbsp;*/
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; @Uninterruptible
&lt;br&gt;&amp;gt; -public class Lock implements Constants {
&lt;br&gt;&amp;gt; +public final class Lock implements Constants {
&lt;br&gt;&amp;gt; &amp;nbsp; / 
&lt;br&gt;&amp;gt; ****************************************************************************
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;* Constants
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;*/
&lt;br&gt;&amp;gt; @@ -311,7 +311,7 @@
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; VM._assert(waiting.isEmpty());
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; if (STATS) deflations++;
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp;ThinLock.deflate(o, lockOffset, this);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;ThinLock.markDeflated(o, lockOffset, index);
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; lockedObject = null;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; free(this);
&lt;br&gt;&amp;gt; &amp;nbsp; }
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/RVMThread.java
&lt;br&gt;&amp;gt; ===================================================================
&lt;br&gt;&amp;gt; --- rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/RVMThread.java	 
&lt;br&gt;&amp;gt; 2009-05-07 20:08:18 UTC (rev 15684)
&lt;br&gt;&amp;gt; +++ rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/RVMThread.java	 
&lt;br&gt;&amp;gt; 2009-05-07 22:40:00 UTC (rev 15685)
&lt;br&gt;&amp;gt; @@ -2097,7 +2097,9 @@
&lt;br&gt;&amp;gt; &amp;nbsp; }
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; @Unpreemptible
&lt;br&gt;&amp;gt; - &amp;nbsp;final int safeBlock(BlockAdapter ba, boolean asynchronous) {
&lt;br&gt;&amp;gt; + &amp;nbsp;private int safeBlock(BlockAdapter ba, boolean asynchronous) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions)
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;VM._assert(getCurrentThread() != this);
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; beginPairWithCurrent();
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; int result=block(ba,asynchronous);
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; endPairWithCurrent();
&lt;br&gt;&amp;gt; @@ -2106,14 +2108,16 @@
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; @Unpreemptible
&lt;br&gt;&amp;gt; &amp;nbsp; public final int safeAsyncBlock(BlockAdapter ba) {
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions)
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;VM._assert(getCurrentThread() != this);
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; return safeBlock(ba, true);
&lt;br&gt;&amp;gt; &amp;nbsp; }
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; @Unpreemptible
&lt;br&gt;&amp;gt; &amp;nbsp; public final int safeBlock(BlockAdapter ba) {
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp;return safeBlock(ba, false);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;if (getCurrentThread()==this) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;return block(ba,false);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;return safeBlock(ba, false);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; &amp;nbsp; }
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; @Unpreemptible
&lt;br&gt;&amp;gt; @@ -2821,22 +2825,20 @@
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;*/
&lt;br&gt;&amp;gt; &amp;nbsp; @UnpreemptibleNoWarn(&amp;quot;Exceptions may possibly cause yields&amp;quot;)
&lt;br&gt;&amp;gt; &amp;nbsp; public final void suspend() {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;if (false) VM.sysWriteln(&amp;quot;Thread #&amp;quot;,getCurrentThreadSlot(),&amp;quot; &amp;nbsp;
&lt;br&gt;&amp;gt; suspending Thread #&amp;quot;,getThreadSlot());
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; ObjectModel.genericUnlock(thread);
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; Throwable rethrow = null;
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp;monitor().lockNoHandshake();
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; try {
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; observeExecStatus();
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (execStatus != IN_JAVA &amp;&amp; execStatus != IN_JAVA_TO_BLOCK &amp;&amp;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; execStatus != IN_NATIVE &amp;&amp; execStatus != BLOCKED_IN_NATIVE &amp;nbsp;
&lt;br&gt;&amp;gt; &amp;&amp;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; execStatus != BLOCKED_IN_JNI &amp;&amp; execStatus != IN_JNI) {
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; throw new IllegalThreadStateException(
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;Cannot suspend a thread that is not running.&amp;quot;);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;Cannot suspend a thread that is not running.&amp;quot;);
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;safeBlock(suspendBlockAdapter);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;block(suspendBlockAdapter);
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; } catch (Throwable t) {
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; rethrow = t;
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp;} finally {
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;monitor().unlock();
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; ObjectModel.genericLock(thread);
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; if (rethrow != null)
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/ 
&lt;br&gt;&amp;gt; Synchronization.java
&lt;br&gt;&amp;gt; ===================================================================
&lt;br&gt;&amp;gt; --- rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/ 
&lt;br&gt;&amp;gt; Synchronization.java	2009-05-07 20:08:18 UTC (rev 15684)
&lt;br&gt;&amp;gt; +++ rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/ 
&lt;br&gt;&amp;gt; Synchronization.java	2009-05-07 22:40:00 UTC (rev 15685)
&lt;br&gt;&amp;gt; @@ -19,6 +19,7 @@
&lt;br&gt;&amp;gt; import org.vmmagic.pragma.Inline;
&lt;br&gt;&amp;gt; import org.vmmagic.pragma.Uninterruptible;
&lt;br&gt;&amp;gt; import org.vmmagic.unboxed.Address;
&lt;br&gt;&amp;gt; +import org.vmmagic.unboxed.Word;
&lt;br&gt;&amp;gt; import org.vmmagic.unboxed.Offset;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; /**
&lt;br&gt;&amp;gt; @@ -74,6 +75,24 @@
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;* @return true =&amp;gt; successful swap, false =&amp;gt; field not equal to &amp;nbsp;
&lt;br&gt;&amp;gt; testValue
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;*/
&lt;br&gt;&amp;gt; &amp;nbsp; @Inline
&lt;br&gt;&amp;gt; + &amp;nbsp;public static boolean tryCompareAndSwap(Object base, Offset &amp;nbsp;
&lt;br&gt;&amp;gt; offset, Word testValue, Word newValue) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;Word oldValue;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;do {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;oldValue = Magic.prepareWord(base, offset);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (oldValue != testValue) return false;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;} while (!Magic.attemptWord(base, offset, oldValue, newValue));
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;return true;
&lt;br&gt;&amp;gt; + &amp;nbsp;}
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; + &amp;nbsp;/**
&lt;br&gt;&amp;gt; + &amp;nbsp; * Atomically swap test value to new value in the specified &amp;nbsp;
&lt;br&gt;&amp;gt; object and the specified field
&lt;br&gt;&amp;gt; + &amp;nbsp; * @param base object containing field
&lt;br&gt;&amp;gt; + &amp;nbsp; * @param offset position of field
&lt;br&gt;&amp;gt; + &amp;nbsp; * @param testValue expected value of field
&lt;br&gt;&amp;gt; + &amp;nbsp; * @param newValue new value of field
&lt;br&gt;&amp;gt; + &amp;nbsp; * @return true =&amp;gt; successful swap, false =&amp;gt; field not equal to &amp;nbsp;
&lt;br&gt;&amp;gt; testValue
&lt;br&gt;&amp;gt; + &amp;nbsp; */
&lt;br&gt;&amp;gt; + &amp;nbsp;@Inline
&lt;br&gt;&amp;gt; &amp;nbsp; public static boolean tryCompareAndSwap(Object base, Offset &amp;nbsp;
&lt;br&gt;&amp;gt; offset, Object testValue, Object newValue) {
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; if (MemoryManagerConstants.NEEDS_WRITE_BARRIER) {
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; return MemoryManager.tryCompareAndSwapWriteBarrier(base, &amp;nbsp;
&lt;br&gt;&amp;gt; offset, testValue, newValue);
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/ThinLock.java
&lt;br&gt;&amp;gt; ===================================================================
&lt;br&gt;&amp;gt; --- rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/ThinLock.java	 
&lt;br&gt;&amp;gt; 2009-05-07 20:08:18 UTC (rev 15684)
&lt;br&gt;&amp;gt; +++ rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/ThinLock.java	 
&lt;br&gt;&amp;gt; 2009-05-07 22:40:00 UTC (rev 15685)
&lt;br&gt;&amp;gt; @@ -14,16 +14,13 @@
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; import org.jikesrvm.VM;
&lt;br&gt;&amp;gt; import org.jikesrvm.Services;
&lt;br&gt;&amp;gt; -import org.jikesrvm.classloader.RVMMethod;
&lt;br&gt;&amp;gt; -import org.jikesrvm.compilers.common.CompiledMethods;
&lt;br&gt;&amp;gt; import org.jikesrvm.objectmodel.ThinLockConstants;
&lt;br&gt;&amp;gt; import org.jikesrvm.runtime.Magic;
&lt;br&gt;&amp;gt; -import org.vmmagic.pragma.Entrypoint;
&lt;br&gt;&amp;gt; import org.vmmagic.pragma.Inline;
&lt;br&gt;&amp;gt; import org.vmmagic.pragma.NoInline;
&lt;br&gt;&amp;gt; +import org.vmmagic.pragma.NoNullCheck;
&lt;br&gt;&amp;gt; import org.vmmagic.pragma.Uninterruptible;
&lt;br&gt;&amp;gt; import org.vmmagic.pragma.Unpreemptible;
&lt;br&gt;&amp;gt; -import org.vmmagic.unboxed.Address;
&lt;br&gt;&amp;gt; import org.vmmagic.unboxed.Offset;
&lt;br&gt;&amp;gt; import org.vmmagic.unboxed.Word;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; @@ -33,10 +30,218 @@
&lt;br&gt;&amp;gt; @Uninterruptible
&lt;br&gt;&amp;gt; public final class ThinLock implements ThinLockConstants {
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; - &amp;nbsp;////////////////////////////////////////
&lt;br&gt;&amp;gt; - &amp;nbsp;/// Support for light-weight locking ///
&lt;br&gt;&amp;gt; - &amp;nbsp;////////////////////////////////////////
&lt;br&gt;&amp;gt; + &amp;nbsp;@Inline
&lt;br&gt;&amp;gt; + &amp;nbsp;@NoNullCheck
&lt;br&gt;&amp;gt; + &amp;nbsp;@Unpreemptible
&lt;br&gt;&amp;gt; + &amp;nbsp;public static void inlineLock(Object o, Offset lockOffset) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;Word old = Magic.prepareWord(o, lockOffset); // FIXME: bad for &amp;nbsp;
&lt;br&gt;&amp;gt; PPC?
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;Word id = old.and(TL_THREAD_ID_MASK.or(TL_STAT_MASK));
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;Word tid = &amp;nbsp;
&lt;br&gt;&amp;gt; Word.fromIntSignExtend(RVMThread.getCurrentThread().getLockingId());
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;if (id.EQ(tid)) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Word changed = &amp;nbsp;
&lt;br&gt;&amp;gt; old.toAddress().plus(TL_LOCK_COUNT_UNIT).toWord();
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!changed.and(TL_LOCK_COUNT_MASK).isZero()) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.setWordAtOffset(o, lockOffset, changed);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;} else if (id.EQ(TL_STAT_THIN)) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;// lock is thin and not held by anyone
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Magic.attemptWord(o, lockOffset, old, old.or(tid))) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.isync();
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;lock(o, lockOffset);
&lt;br&gt;&amp;gt; + &amp;nbsp;}
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; + &amp;nbsp;@Inline
&lt;br&gt;&amp;gt; + &amp;nbsp;@NoNullCheck
&lt;br&gt;&amp;gt; + &amp;nbsp;@Unpreemptible
&lt;br&gt;&amp;gt; + &amp;nbsp;public static void inlineUnlock(Object o, Offset lockOffset) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;Word old = Magic.prepareWord(o, lockOffset); // FIXME: bad for &amp;nbsp;
&lt;br&gt;&amp;gt; PPC?
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;Word id = old.and(TL_THREAD_ID_MASK.or(TL_STAT_MASK));
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;Word tid = &amp;nbsp;
&lt;br&gt;&amp;gt; Word.fromIntSignExtend(RVMThread.getCurrentThread().getLockingId());
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;if (id.EQ(tid)) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!old.and(TL_LOCK_COUNT_MASK).isZero()) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.setWordAtOffset(
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;o, lockOffset,
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;old.toAddress().minus(TL_LOCK_COUNT_UNIT).toWord());
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;} else if &amp;nbsp;
&lt;br&gt;&amp;gt; (old 
&lt;br&gt;&amp;gt; .xor 
&lt;br&gt;&amp;gt; (tid 
&lt;br&gt;&amp;gt; ).rshl 
&lt;br&gt;&amp;gt; (TL_LOCK_COUNT_SHIFT).EQ(TL_STAT_THIN.rshl(TL_LOCK_COUNT_SHIFT))) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.sync();
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Magic.attemptWord(o, lockOffset, old, &amp;nbsp;
&lt;br&gt;&amp;gt; old.and(TL_UNLOCK_MASK).or(TL_STAT_THIN))) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;unlock(o, lockOffset);
&lt;br&gt;&amp;gt; + &amp;nbsp;}
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; + &amp;nbsp;@NoInline
&lt;br&gt;&amp;gt; + &amp;nbsp;@NoNullCheck
&lt;br&gt;&amp;gt; + &amp;nbsp;@Unpreemptible
&lt;br&gt;&amp;gt; + &amp;nbsp;public static void lock(Object o, Offset lockOffset) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;if (STATS) fastLocks++;
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;Word threadId = &amp;nbsp;
&lt;br&gt;&amp;gt; Word.fromIntZeroExtend(RVMThread.getCurrentThread().getLockingId());
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;for (int cnt=0;;cnt++) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Word old = Magic.getWordAtOffset(o, lockOffset);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Word stat = old.and(TL_STAT_MASK);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;boolean tryToInflate=false;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (stat.EQ(TL_STAT_BIASABLE)) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word id = old.and(TL_THREAD_ID_MASK);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (id.isZero()) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// lock is unbiased, bias it in our favor and grab it
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Synchronization.tryCompareAndSwap(
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;o, lockOffset,
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;old,
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;gt; old.or(threadId).toAddress().plus(TL_LOCK_COUNT_UNIT).toWord())) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.isync();
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (id.EQ(threadId)) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// lock is biased in our favor
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word changed = &amp;nbsp;
&lt;br&gt;&amp;gt; old.toAddress().plus(TL_LOCK_COUNT_UNIT).toWord();
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!changed.and(TL_LOCK_COUNT_MASK).isZero()) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.setWordAtOffset(o, lockOffset, changed);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tryToInflate=true;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (casFromBiased(o, lockOffset, old, &amp;nbsp;
&lt;br&gt;&amp;gt; biasBitsToThinBits(old), cnt)) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;continue; // don't spin, since it's thin now
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (stat.EQ(TL_STAT_THIN)) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word id = old.and(TL_THREAD_ID_MASK);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (id.isZero()) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Synchronization.tryCompareAndSwap(
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;o, lockOffset, old, old.or(threadId))) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.isync();
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (id.EQ(threadId)) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word changed = &amp;nbsp;
&lt;br&gt;&amp;gt; old.toAddress().plus(TL_LOCK_COUNT_UNIT).toWord();
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (changed.and(TL_LOCK_COUNT_MASK).isZero()) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tryToInflate=true;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (Synchronization.tryCompareAndSwap(
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; o, lockOffset, old, changed)) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.isync();
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (cnt&amp;gt;retryLimit) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tryToInflate=true;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(stat.EQ(TL_STAT_FAT));
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// lock is fat. &amp;nbsp;contend on it.
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Lock.getLock(getLockIndex(old)).lockHeavy(o)) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (tryToInflate) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (STATS) slowLocks++;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// the lock is not fat, is owned by someone else, or else &amp;nbsp;
&lt;br&gt;&amp;gt; the count wrapped.
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// attempt to inflate it (this may fail, in which case &amp;nbsp;
&lt;br&gt;&amp;gt; we'll just harmlessly
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// loop around) and lock it (may also fail, if we get the &amp;nbsp;
&lt;br&gt;&amp;gt; wrong lock). &amp;nbsp;if it
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// succeeds, we're done.
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// NB: this calls into our attemptToMarkInflated() method, &amp;nbsp;
&lt;br&gt;&amp;gt; which will do the
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Right Thing if the lock is biased to someone else.
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (inflateAndLock(o, lockOffset)) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.yield();
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; + &amp;nbsp;}
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; + &amp;nbsp;@NoInline
&lt;br&gt;&amp;gt; + &amp;nbsp;@NoNullCheck
&lt;br&gt;&amp;gt; + &amp;nbsp;@Unpreemptible
&lt;br&gt;&amp;gt; + &amp;nbsp;public static void unlock(Object o, Offset lockOffset) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;Word threadId = &amp;nbsp;
&lt;br&gt;&amp;gt; Word.fromIntZeroExtend(RVMThread.getCurrentThread().getLockingId());
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;for (int cnt=0;;cnt++) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Word old = Magic.getWordAtOffset(o, lockOffset);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Word stat = old.and(TL_STAT_MASK);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (stat.EQ(TL_STAT_BIASABLE)) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word id = old.and(TL_THREAD_ID_MASK);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (id.EQ(threadId)) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (old.and(TL_LOCK_COUNT_MASK).isZero()) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.raiseIllegalMonitorStateException(&amp;quot;biased &amp;nbsp;
&lt;br&gt;&amp;gt; unlocking: we own this object but the count is already zero&amp;quot;, o);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.setWordAtOffset(o, lockOffset,
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;gt; old.toAddress().minus(TL_LOCK_COUNT_UNIT).toWord());
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.raiseIllegalMonitorStateException(&amp;quot;biased &amp;nbsp;
&lt;br&gt;&amp;gt; unlocking: we don't own this object&amp;quot;, o);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (stat.EQ(TL_STAT_THIN)) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.sync();
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word id = old.and(TL_THREAD_ID_MASK);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (id.EQ(threadId)) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word changed;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (old.and(TL_LOCK_COUNT_MASK).isZero()) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;changed=old.and(TL_UNLOCK_MASK).or(TL_STAT_THIN);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;gt; changed=old.toAddress().minus(TL_LOCK_COUNT_UNIT).toWord();
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Synchronization.tryCompareAndSwap(
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;o, lockOffset, old, changed)) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (false) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;VM.sysWriteln(&amp;quot;threadId = &amp;quot;,threadId);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;VM.sysWriteln(&amp;quot;id = &amp;quot;,id);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.raiseIllegalMonitorStateException(&amp;quot;thin &amp;nbsp;
&lt;br&gt;&amp;gt; unlocking: we don't own this object&amp;quot;, o);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(stat.EQ(TL_STAT_FAT));
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// fat unlock
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Lock.getLock(getLockIndex(old)).unlockHeavy(o);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; + &amp;nbsp;}
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; + &amp;nbsp;@Uninterruptible
&lt;br&gt;&amp;gt; + &amp;nbsp;@NoNullCheck
&lt;br&gt;&amp;gt; + &amp;nbsp;public static boolean holdsLock(Object o, Offset lockOffset, &amp;nbsp;
&lt;br&gt;&amp;gt; RVMThread thread) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;for (int cnt=0;;++cnt) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;int tid = thread.getLockingId();
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Word bits = Magic.getWordAtOffset(o, lockOffset);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (bits.and(TL_STAT_MASK).EQ(TL_STAT_BIASABLE)) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// if locked, then it is locked with a thin lock
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bits.and(TL_THREAD_ID_MASK).toInt() == tid &amp;&amp;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!bits.and(TL_LOCK_COUNT_MASK).isZero();
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (bits.and(TL_STAT_MASK).EQ(TL_STAT_THIN)) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return bits.and(TL_THREAD_ID_MASK).toInt()==tid;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) &amp;nbsp;
&lt;br&gt;&amp;gt; VM._assert(bits.and(TL_STAT_MASK).EQ(TL_STAT_FAT));
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// if locked, then it is locked with a fat lock
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Lock l=Lock.getLock(getLockIndex(bits));
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (l!=null) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;l.mutex.lock();
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;boolean result = (l.getOwnerId()==tid &amp;&amp; &amp;nbsp;
&lt;br&gt;&amp;gt; l.getLockedObject()==o);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;l.mutex.unlock();
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return result;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.yield();
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; + &amp;nbsp;}
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; + &amp;nbsp;@Inline
&lt;br&gt;&amp;gt; + &amp;nbsp;@Uninterruptible
&lt;br&gt;&amp;gt; + &amp;nbsp;public static boolean isFat(Word lockWord) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;return lockWord.and(TL_STAT_MASK).EQ(TL_STAT_FAT);
&lt;br&gt;&amp;gt; + &amp;nbsp;}
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; &amp;nbsp; /**
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;* Return the lock index for a given lock word. &amp;nbsp;Assert valid index
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;* ranges, that the fat lock bit is set, and that the lock entry
&lt;br&gt;&amp;gt; @@ -46,7 +251,8 @@
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;* @return the lock index corresponding to the lock workd.
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;*/
&lt;br&gt;&amp;gt; &amp;nbsp; @Inline
&lt;br&gt;&amp;gt; - &amp;nbsp;private static int getLockIndex(Word lockWord) {
&lt;br&gt;&amp;gt; + &amp;nbsp;@Uninterruptible
&lt;br&gt;&amp;gt; + &amp;nbsp;public static int getLockIndex(Word lockWord) {
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; int index = &amp;nbsp;
&lt;br&gt;&amp;gt; lockWord.and(TL_LOCK_ID_MASK).rshl(TL_LOCK_ID_SHIFT).toInt();
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; if (VM.VerifyAssertions) {
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (!(index &amp;gt; 0 &amp;&amp; index &amp;lt; Lock.numLocks())) {
&lt;br&gt;&amp;gt; @@ -56,180 +262,288 @@
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; VM.sysWriteln();
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; VM._assert(index &amp;gt; 0 &amp;&amp; index &amp;lt; Lock.numLocks()); &amp;nbsp;// index is &amp;nbsp;
&lt;br&gt;&amp;gt; in range
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;VM._assert(! 
&lt;br&gt;&amp;gt; lockWord.and(TL_FAT_LOCK_MASK).isZero()); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// fat lock bit is &amp;nbsp;
&lt;br&gt;&amp;gt; set
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;VM._assert(Lock.getLock(index) != null); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // the &amp;nbsp;
&lt;br&gt;&amp;gt; lock is actually there
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;gt; VM._assert(lockWord.and(TL_STAT_MASK).EQ(TL_STAT_FAT)); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// &amp;nbsp;
&lt;br&gt;&amp;gt; fat lock bit is set
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; return index;
&lt;br&gt;&amp;gt; &amp;nbsp; }
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; - &amp;nbsp;/**
&lt;br&gt;&amp;gt; - &amp;nbsp; * Obtains a lock on the indicated object. &amp;nbsp;Abbreviated light- 
&lt;br&gt;&amp;gt; weight
&lt;br&gt;&amp;gt; - &amp;nbsp; * locking sequence inlined by the optimizing compiler for the
&lt;br&gt;&amp;gt; - &amp;nbsp; * prologue of synchronized methods and for the
&lt;br&gt;&amp;gt; - &amp;nbsp; * &amp;lt;code&amp;gt;monitorenter&amp;lt;/code&amp;gt; bytecode.
&lt;br&gt;&amp;gt; - &amp;nbsp; *
&lt;br&gt;&amp;gt; - &amp;nbsp; * @param o the object to be locked
&lt;br&gt;&amp;gt; - &amp;nbsp; * @param lockOffset the offset of the thin lock word in the &amp;nbsp;
&lt;br&gt;&amp;gt; object.
&lt;br&gt;&amp;gt; - &amp;nbsp; * @see org.jikesrvm.compilers.opt.hir2lir.ExpandRuntimeServices
&lt;br&gt;&amp;gt; - &amp;nbsp; */
&lt;br&gt;&amp;gt; &amp;nbsp; @Inline
&lt;br&gt;&amp;gt; - &amp;nbsp;@Entrypoint
&lt;br&gt;&amp;gt; - &amp;nbsp;@Unpreemptible(&amp;quot;Become another thread when lock is contended, &amp;nbsp;
&lt;br&gt;&amp;gt; don't preempt in other cases&amp;quot;)
&lt;br&gt;&amp;gt; - &amp;nbsp;static void inlineLock(Object o, Offset lockOffset) {
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp;Word old = Magic.prepareWord(o, lockOffset);
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp;if (old.rshl(TL_THREAD_ID_SHIFT).isZero()) {
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;// implies that fatbit == 0 &amp; threadid == 0
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;int threadId = RVMThread.getCurrentThread().getLockingId();
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Magic.attemptWord(o, lockOffset, old, &amp;nbsp;
&lt;br&gt;&amp;gt; old.or(Word.fromIntZeroExtend(threadId)))) {
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.isync(); // don't use stale prefetched data in monitor
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (STATS) fastLocks++;
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // common case: o is now locked
&lt;br&gt;&amp;gt; + &amp;nbsp;@Uninterruptible
&lt;br&gt;&amp;gt; + &amp;nbsp;public static int getLockOwner(Word lockWord) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(!isFat(lockWord));
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;if (lockWord.and(TL_STAT_MASK).EQ(TL_STAT_BIASABLE)) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (lockWord.and(TL_LOCK_COUNT_MASK).isZero()) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return 0;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return lockWord.and(TL_THREAD_ID_MASK).toInt();
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;return lockWord.and(TL_THREAD_ID_MASK).toInt();
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp;lock(o, lockOffset); // uncommon case: default to out-of-line &amp;nbsp;
&lt;br&gt;&amp;gt; lock()
&lt;br&gt;&amp;gt; &amp;nbsp; }
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; - &amp;nbsp;/**
&lt;br&gt;&amp;gt; - &amp;nbsp; * Releases the lock on the indicated object. &amp;nbsp;Abreviated
&lt;br&gt;&amp;gt; - &amp;nbsp; * light-weight unlocking sequence inlined by the optimizing
&lt;br&gt;&amp;gt; - &amp;nbsp; * compiler for the epilogue of synchronized methods and for the
&lt;br&gt;&amp;gt; - &amp;nbsp; * &amp;lt;code&amp;gt;monitorexit&amp;lt;/code&amp;gt; bytecode.
&lt;br&gt;&amp;gt; - &amp;nbsp; *
&lt;br&gt;&amp;gt; - &amp;nbsp; * @param o the object to be unlocked
&lt;br&gt;&amp;gt; - &amp;nbsp; * @param lockOffset the offset of the thin lock word in the &amp;nbsp;
&lt;br&gt;&amp;gt; object.
&lt;br&gt;&amp;gt; - &amp;nbsp; * @see org.jikesrvm.compilers.opt.hir2lir.ExpandRuntimeServices
&lt;br&gt;&amp;gt; - &amp;nbsp; */
&lt;br&gt;&amp;gt; &amp;nbsp; @Inline
&lt;br&gt;&amp;gt; - &amp;nbsp;@Entrypoint
&lt;br&gt;&amp;gt; - &amp;nbsp;@Unpreemptible(&amp;quot;No preemption normally, but may raise exceptions&amp;quot;)
&lt;br&gt;&amp;gt; - &amp;nbsp;static void inlineUnlock(Object o, Offset lockOffset) {
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp;Word old = Magic.prepareWord(o, lockOffset);
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp;Word threadId = &amp;nbsp;
&lt;br&gt;&amp;gt; Word.fromIntZeroExtend(RVMThread.getCurrentThread().getLockingId());
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp;if (old.xor(threadId).rshl(TL_LOCK_COUNT_SHIFT).isZero()) { // &amp;nbsp;
&lt;br&gt;&amp;gt; implies that fatbit == 0 &amp;&amp; count == 0 &amp;&amp; lockid == me
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.sync(); // memory barrier: subsequent locker will see &amp;nbsp;
&lt;br&gt;&amp;gt; previous writes
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Magic.attemptWord(o, lockOffset, old, &amp;nbsp;
&lt;br&gt;&amp;gt; old.and(TL_UNLOCK_MASK))) {
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return; // common case: o is now unlocked
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; + &amp;nbsp;@Uninterruptible
&lt;br&gt;&amp;gt; + &amp;nbsp;public static int getRecCount(Word lockWord) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(getLockOwner(lockWord)!=0);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;if (lockWord.and(TL_STAT_MASK).EQ(TL_STAT_BIASABLE)) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;return &amp;nbsp;
&lt;br&gt;&amp;gt; lockWord.and(TL_LOCK_COUNT_MASK).rshl(TL_LOCK_COUNT_SHIFT).toInt();
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;return &amp;nbsp;
&lt;br&gt;&amp;gt; lockWord.and(TL_LOCK_COUNT_MASK).rshl(TL_LOCK_COUNT_SHIFT).toInt()+1;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp;unlock(o, lockOffset); &amp;nbsp;// uncommon case: default to non &amp;nbsp;
&lt;br&gt;&amp;gt; inlined unlock()
&lt;br&gt;&amp;gt; &amp;nbsp; }
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; - &amp;nbsp;/**
&lt;br&gt;&amp;gt; - &amp;nbsp; * Obtains a lock on the indicated object. &amp;nbsp;Light-weight locking
&lt;br&gt;&amp;gt; - &amp;nbsp; * sequence for the prologue of synchronized methods and for the
&lt;br&gt;&amp;gt; - &amp;nbsp; * &amp;lt;code&amp;gt;monitorenter&amp;lt;/code&amp;gt; bytecode.
&lt;br&gt;&amp;gt; - &amp;nbsp; *
&lt;br&gt;&amp;gt; - &amp;nbsp; * @param o the object to be locked
&lt;br&gt;&amp;gt; - &amp;nbsp; * @param lockOffset the offset of the thin lock word in the &amp;nbsp;
&lt;br&gt;&amp;gt; object.
&lt;br&gt;&amp;gt; - &amp;nbsp; */
&lt;br&gt;&amp;gt; &amp;nbsp; @NoInline
&lt;br&gt;&amp;gt; - &amp;nbsp;@Unpreemptible(&amp;quot;Become another thread when lock is contended, &amp;nbsp;
&lt;br&gt;&amp;gt; don't preempt in other cases&amp;quot;)
&lt;br&gt;&amp;gt; - &amp;nbsp;public static void lock(Object o, Offset lockOffset) {
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp;major:
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp;while (true) { // repeat only if attempt to lock a promoted &amp;nbsp;
&lt;br&gt;&amp;gt; lock fails
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;int retries = retryLimit;
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;Word threadId = &amp;nbsp;
&lt;br&gt;&amp;gt; Word.fromIntZeroExtend(RVMThread.getCurrentThread().getLockingId());
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;while (0 != retries--) { // repeat if there is contention for &amp;nbsp;
&lt;br&gt;&amp;gt; thin lock
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word old = Magic.prepareWord(o, lockOffset);
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word id = old.and(TL_THREAD_ID_MASK.or(TL_FAT_LOCK_MASK));
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (id.isZero()) { // o isn't locked
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Magic.attemptWord(o, lockOffset, old, &amp;nbsp;
&lt;br&gt;&amp;gt; old.or(threadId))) {
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.isync(); // don't use stale prefetched data in &amp;nbsp;
&lt;br&gt;&amp;gt; monitor
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (STATS) slowLocks++;
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break major; &amp;nbsp;// lock succeeds
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;continue; // contention, possibly spurious, try again
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (id.EQ(threadId)) { // this thread has o locked already
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word changed = &amp;nbsp;
&lt;br&gt;&amp;gt; old.toAddress().plus(TL_LOCK_COUNT_UNIT).toWord(); // update count
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (changed.and(TL_LOCK_COUNT_MASK).isZero()) { // count &amp;nbsp;
&lt;br&gt;&amp;gt; wrapped around (most unlikely), make heavy lock
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;while (!inflateAndLock(o, lockOffset)) { // wait for a &amp;nbsp;
&lt;br&gt;&amp;gt; lock to become available
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.yield();
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break major; &amp;nbsp;// lock succeeds (note that lockHeavy has &amp;nbsp;
&lt;br&gt;&amp;gt; issued an isync)
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Magic.attemptWord(o, lockOffset, old, changed)) {
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.isync(); // don't use stale prefetched data in &amp;nbsp;
&lt;br&gt;&amp;gt; monitor !!TODO: is this isync required?
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (STATS) slowLocks++;
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break major; &amp;nbsp;// lock succeeds
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;continue; // contention, probably spurious, try again &amp;nbsp;
&lt;br&gt;&amp;gt; (TODO!! worry about this)
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; + &amp;nbsp;@Unpreemptible
&lt;br&gt;&amp;gt; + &amp;nbsp;public static boolean casFromBiased(Object o, Offset lockOffset,
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word oldLockWord, Word changed,
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int cnt) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;RVMThread me=RVMThread.getCurrentThread();
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;Word id=oldLockWord.and(TL_THREAD_ID_MASK);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;if (id.isZero()) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (false) VM.sysWriteln(&amp;quot;id is zero - easy case.&amp;quot;);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;return Synchronization.tryCompareAndSwap(o, lockOffset, &amp;nbsp;
&lt;br&gt;&amp;gt; oldLockWord, changed);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (false) VM.sysWriteln(&amp;quot;id = &amp;quot;,id);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;int slot=id.toInt()&amp;gt;&amp;gt;TL_THREAD_ID_SHIFT;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (false) VM.sysWriteln(&amp;quot;slot = &amp;quot;,slot);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread owner=RVMThread.threadBySlot[slot];
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (owner==me /* I own it, so I can unbias it trivially. &amp;nbsp; 
&lt;br&gt;&amp;gt; This occurs
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; when we are inflating due to, for example, &amp;nbsp;
&lt;br&gt;&amp;gt; wait() */ ||
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;owner==null /* the thread that owned it is dead, so it's &amp;nbsp;
&lt;br&gt;&amp;gt; safe to
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; unbias. */) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// note that we use a CAS here, but it's only needed in the &amp;nbsp;
&lt;br&gt;&amp;gt; case
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// that owner==null, since in that case some other thread &amp;nbsp;
&lt;br&gt;&amp;gt; may also
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// be unbiasing.
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return Synchronization.tryCompareAndSwap(
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;o, lockOffset, oldLockWord, changed);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;boolean result=false;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!(old.and(TL_FAT_LOCK_MASK).isZero())) { // o has a &amp;nbsp;
&lt;br&gt;&amp;gt; heavy lock
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int index = getLockIndex(old);
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Lock.getLock(index).lockHeavy(o)) {
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break major; // lock succeeds (note that lockHeavy has &amp;nbsp;
&lt;br&gt;&amp;gt; issued an isync)
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// heavy lock failed (deflated or contention for system &amp;nbsp;
&lt;br&gt;&amp;gt; lock)
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.yield();
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;continue major; &amp;nbsp; &amp;nbsp;// try again
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// real contention: wait (hope other thread unlocks o), try &amp;nbsp;
&lt;br&gt;&amp;gt; again
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (traceContention) { // for performance tuning only (see &amp;nbsp;
&lt;br&gt;&amp;gt; section 5)
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Address fp = Magic.getFramePointer();
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fp = Magic.getCallerFramePointer(fp);
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int mid = Magic.getCompiledMethodID(fp);
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMMethod m1 = &amp;nbsp;
&lt;br&gt;&amp;gt; CompiledMethods.getCompiledMethod(mid).getMethod();
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fp = Magic.getCallerFramePointer(fp);
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mid = Magic.getCompiledMethodID(fp);
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMMethod m2 = &amp;nbsp;
&lt;br&gt;&amp;gt; CompiledMethods.getCompiledMethod(mid).getMethod();
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String s = m1.getDeclaringClass() + &amp;quot;.&amp;quot; + m1.getName() + &amp;nbsp;
&lt;br&gt;&amp;gt; &amp;quot; &amp;quot; + m2.getDeclaringClass() + &amp;quot;.&amp;quot; + m2.getName();
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.trace(Magic.getObjectType(o).toString(), s, -2 &amp;nbsp;
&lt;br&gt;&amp;gt; - retries);
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (0 != retries) {
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.yield(); // wait, hope o gets unlocked
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// NB. this may stop a thread other than the one that had &amp;nbsp;
&lt;br&gt;&amp;gt; the bias,
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// if that thread died and some other thread took its &amp;nbsp;
&lt;br&gt;&amp;gt; slot. &amp;nbsp;that's
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// why we do a CAS below. &amp;nbsp;it's only needed if some other &amp;nbsp;
&lt;br&gt;&amp;gt; thread
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// had seen the owner be null (which may happen if we came &amp;nbsp;
&lt;br&gt;&amp;gt; here after
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// a new thread took the slot while someone else came here &amp;nbsp;
&lt;br&gt;&amp;gt; when the
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// slot was still null). &amp;nbsp;if it was the case that everyone &amp;nbsp;
&lt;br&gt;&amp;gt; else had
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// seen a non-null owner, then the pair handshake would &amp;nbsp;
&lt;br&gt;&amp;gt; serve as
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// sufficient synchronization (the id would identify the &amp;nbsp;
&lt;br&gt;&amp;gt; set of threads
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// that shared that id's communicationLock). &amp;nbsp;oddly, that &amp;nbsp;
&lt;br&gt;&amp;gt; means that
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// this whole thing could be &amp;quot;simplified&amp;quot; to acquire the
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// communicationLock even if the owner was null. &amp;nbsp;but that &amp;nbsp;
&lt;br&gt;&amp;gt; would be
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// goofy.
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (false) VM.sysWriteln(&amp;quot;entering pair handshake&amp;quot;);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;owner.beginPairHandshake();
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (false) VM.sysWriteln(&amp;quot;done with that&amp;quot;);
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word newLockWord=Magic.getWordAtOffset(o, lockOffset);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result=Synchronization.tryCompareAndSwap(
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;o, lockOffset, oldLockWord, changed);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;owner.endPairHandshake();
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (false) VM.sysWriteln(&amp;quot;that worked.&amp;quot;);
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return result;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;// create a heavy lock for o and lock it
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;if (inflateAndLock(o, lockOffset)) break;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp;// o has been locked, must return before an exception can be &amp;nbsp;
&lt;br&gt;&amp;gt; thrown
&lt;br&gt;&amp;gt; &amp;nbsp; }
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; + &amp;nbsp;@Inline
&lt;br&gt;&amp;gt; + &amp;nbsp;@Unpreemptible
&lt;br&gt;&amp;gt; + &amp;nbsp;public static boolean attemptToMarkInflated(Object o, Offset &amp;nbsp;
&lt;br&gt;&amp;gt; lockOffset,
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word oldLockWord,
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int lockId,
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int cnt) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) &amp;nbsp;
&lt;br&gt;&amp;gt; VM._assert(oldLockWord.and(TL_STAT_MASK).NE(TL_STAT_FAT));
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;if (false) VM.sysWriteln(&amp;quot;attemptToMarkInflated with &amp;nbsp;
&lt;br&gt;&amp;gt; oldLockWord = &amp;quot;,oldLockWord);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;// what this needs to do:
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;// 1) if the lock is thin, it's just a CAS
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;// 2) if the lock is unbiased, CAS in the inflation
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;// 3) if the lock is biased in our favor, store the lock &amp;nbsp;
&lt;br&gt;&amp;gt; without CAS
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;// 4) if the lock is biased but to someone else, enter the pair &amp;nbsp;
&lt;br&gt;&amp;gt; handshake
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;// &amp;nbsp; &amp;nbsp;to unbias it and install the inflated lock
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;Word changed=
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;gt; TL_STAT_FAT.or(Word.fromIntZeroExtend(lockId).lsh(TL_LOCK_ID_SHIFT))
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;.or(oldLockWord.and(TL_UNLOCK_MASK));
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;if (false &amp;&amp; oldLockWord.and(TL_STAT_MASK).EQ(TL_STAT_THIN))
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;VM.sysWriteln(&amp;quot;obj = &amp;quot;,Magic.objectAsAddress(o),
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;, old = &amp;quot;,oldLockWord,
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;, owner = &amp;quot;,getLockOwner(oldLockWord),
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;, rec = &amp;quot;,getLockOwner(oldLockWord)==0? 
&lt;br&gt;&amp;gt; 0:getRecCount(oldLockWord),
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;, changed = &amp;quot;,changed,
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;, lockId = &amp;quot;,lockId);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;if (false) VM.sysWriteln(&amp;quot;changed = &amp;quot;,changed);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;if (oldLockWord.and(TL_STAT_MASK).EQ(TL_STAT_THIN)) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (false) VM.sysWriteln(&amp;quot;it's thin, inflating the easy way.&amp;quot;);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;return Synchronization.tryCompareAndSwap(
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;o, lockOffset, oldLockWord, changed);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;return casFromBiased(o, lockOffset, oldLockWord, changed, cnt);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; + &amp;nbsp;}
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; &amp;nbsp; /**
&lt;br&gt;&amp;gt; - &amp;nbsp; * Releases the lock on the indicated object. &amp;nbsp; Light-weight &amp;nbsp;
&lt;br&gt;&amp;gt; unlocking
&lt;br&gt;&amp;gt; - &amp;nbsp; * sequence for the epilogue of synchronized methods and for the
&lt;br&gt;&amp;gt; - &amp;nbsp; * &amp;lt;code&amp;gt;monitorexit&amp;lt;/code&amp;gt; bytecode.
&lt;br&gt;&amp;gt; + &amp;nbsp; * Promotes a light-weight lock to a heavy-weight lock. &amp;nbsp;If this &amp;nbsp;
&lt;br&gt;&amp;gt; returns the lock
&lt;br&gt;&amp;gt; + &amp;nbsp; * that you gave it, its mutex will be locked; otherwise, its &amp;nbsp;
&lt;br&gt;&amp;gt; mutex will be unlocked.
&lt;br&gt;&amp;gt; + &amp;nbsp; * Hence, calls to this method should always be followed by a &amp;nbsp;
&lt;br&gt;&amp;gt; condition lock() or
&lt;br&gt;&amp;gt; + &amp;nbsp; * unlock() call.
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;*
&lt;br&gt;&amp;gt; - &amp;nbsp; * @param o the object to be locked
&lt;br&gt;&amp;gt; + &amp;nbsp; * @param o the object to get a heavy-weight lock
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;* @param lockOffset the offset of the thin lock word in the object.
&lt;br&gt;&amp;gt; + &amp;nbsp; * @return the inflated lock; either the one you gave, or another &amp;nbsp;
&lt;br&gt;&amp;gt; one, if the lock
&lt;br&gt;&amp;gt; + &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; was inflated by some other thread.
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;*/
&lt;br&gt;&amp;gt; - &amp;nbsp;@NoInline
&lt;br&gt;&amp;gt; - &amp;nbsp;@Unpreemptible(&amp;quot;No preemption normally, but may raise exceptions&amp;quot;)
&lt;br&gt;&amp;gt; - &amp;nbsp;public static void unlock(Object o, Offset lockOffset) {
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp;Magic.sync(); // prevents stale data from being seen by next &amp;nbsp;
&lt;br&gt;&amp;gt; owner of the lock
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp;while (true) { // spurious contention detected
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;Word old = Magic.prepareWord(o, lockOffset);
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;Word id = old.and(TL_THREAD_ID_MASK.or(TL_FAT_LOCK_MASK));
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;Word threadId = &amp;nbsp;
&lt;br&gt;&amp;gt; Word.fromIntZeroExtend(RVMThread.getCurrentThread().getLockingId());
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;if (id.NE(threadId)) { // not normal case
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!(old.and(TL_FAT_LOCK_MASK).isZero())) { // o has a &amp;nbsp;
&lt;br&gt;&amp;gt; heavy lock
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Lock.getLock(getLockIndex(old)).unlockHeavy(o);
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// note that unlockHeavy has issued a sync
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;
&lt;br&gt;&amp;gt; + &amp;nbsp;@NoNullCheck
&lt;br&gt;&amp;gt; + &amp;nbsp;@Unpreemptible
&lt;br&gt;&amp;gt; + &amp;nbsp;protected static Lock attemptToInflate(Object o,
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Offset lockOffset,
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Lock l) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;if (false) VM.sysWriteln(&amp;quot;l = &amp;quot;,Magic.objectAsAddress(l));
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;l.mutex.lock();
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;for (int cnt=0;;++cnt) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Word bits = Magic.getWordAtOffset(o, lockOffset);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;// check to see if another thread has already created a fat &amp;nbsp;
&lt;br&gt;&amp;gt; lock
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (isFat(bits)) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (trace) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;VM.sysWriteln(&amp;quot;Thread #&amp;quot;,RVMThread.getCurrentThreadSlot(),
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;: freeing lock &amp;quot;,Magic.objectAsAddress(l),
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot; because we had a double-inflate&amp;quot;);
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.trace(&amp;quot;Lock&amp;quot;, &amp;quot;unlock error: thin lock word = &amp;quot;, &amp;nbsp;
&lt;br&gt;&amp;gt; old.toAddress());
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.trace(&amp;quot;Lock&amp;quot;, &amp;quot;unlock error: thin lock word = &amp;quot;, &amp;nbsp;
&lt;br&gt;&amp;gt; Magic.objectAsAddress(o));
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// RVMThread.trace(&amp;quot;Lock&amp;quot;, &amp;nbsp;
&lt;br&gt;&amp;gt; RVMThread.getCurrentThread().toString(), 0);
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.raiseIllegalMonitorStateException(&amp;quot;thin &amp;nbsp;
&lt;br&gt;&amp;gt; unlocking&amp;quot;, o);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Lock result = Lock.getLock(getLockIndex(bits));
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (result==null ||
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result.lockedObject!=o) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;continue; /* this is nasty. &amp;nbsp;this will happen when a lock
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; is deflated. */
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Lock.free(l);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;l.mutex.unlock();
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return result;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;if (old.and(TL_LOCK_COUNT_MASK).isZero()) { // get count, 0 &amp;nbsp;
&lt;br&gt;&amp;gt; is the last lock
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word changed = old.and(TL_UNLOCK_MASK);
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Magic.attemptWord(o, lockOffset, old, changed)) {
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return; // unlock succeeds
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(l!=null);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (attemptToMarkInflated(
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;o, lockOffset, bits, l.index, cnt)) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;l.setLockedObject(o);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;l.setOwnerId(getLockOwner(bits));
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (l.getOwnerId() != 0) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;l.setRecursionCount(getRecCount(bits));
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) &amp;nbsp;
&lt;br&gt;&amp;gt; VM._assert(l.getRecursionCount()==0);
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;continue;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return l;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;// more than one lock
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;// decrement recursion count
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;Word changed = &amp;nbsp;
&lt;br&gt;&amp;gt; old.toAddress().minus(TL_LOCK_COUNT_UNIT).toWord();
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Magic.attemptWord(o, lockOffset, old, changed)) {
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return; // unlock succeeds
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;// contention detected, try again
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; + &amp;nbsp;}
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; + &amp;nbsp;@Inline
&lt;br&gt;&amp;gt; + &amp;nbsp;@Uninterruptible
&lt;br&gt;&amp;gt; + &amp;nbsp;private static Word biasBitsToThinBits(Word bits) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;int lockOwner=getLockOwner(bits);
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;Word changed=bits.and(TL_UNLOCK_MASK).or(TL_STAT_THIN);
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;if (lockOwner!=0) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;int recCount=getRecCount(bits);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;changed=changed
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.or(Word.fromIntZeroExtend(lockOwner))
&lt;br&gt;&amp;gt; + 
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .or 
&lt;br&gt;&amp;gt; (Word.fromIntZeroExtend(recCount-1).lsh(TL_LOCK_COUNT_SHIFT));
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;return changed;
&lt;br&gt;&amp;gt; + &amp;nbsp;}
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; + &amp;nbsp;@Inline
&lt;br&gt;&amp;gt; + &amp;nbsp;@Uninterruptible
&lt;br&gt;&amp;gt; + &amp;nbsp;public static boolean attemptToMarkDeflated(Object o, Offset &amp;nbsp;
&lt;br&gt;&amp;gt; lockOffset,
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word oldLockWord) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;// we allow concurrent modification of the lock word when it's &amp;nbsp;
&lt;br&gt;&amp;gt; thin or fat.
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;Word changed=oldLockWord.and(TL_UNLOCK_MASK).or(TL_STAT_THIN);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(getLockOwner(changed)==0);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;return Synchronization.tryCompareAndSwap(
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;o, lockOffset, oldLockWord, changed);
&lt;br&gt;&amp;gt; + &amp;nbsp;}
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; + &amp;nbsp;@Uninterruptible
&lt;br&gt;&amp;gt; + &amp;nbsp;public static void markDeflated(Object o, Offset lockOffset, int &amp;nbsp;
&lt;br&gt;&amp;gt; id) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;for (;;) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Word bits=Magic.getWordAtOffset(o, lockOffset);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(isFat(bits));
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(getLockIndex(bits)==id);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (attemptToMarkDeflated(o, lockOffset, bits)) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;gt; &amp;nbsp; }
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; + &amp;nbsp;@NoNullCheck
&lt;br&gt;&amp;gt; + &amp;nbsp;@Unpreemptible
&lt;br&gt;&amp;gt; + &amp;nbsp;public static boolean lockHeader(Object o, Offset lockOffset) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;// what this should do:
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;// 1) take advantage of the fact that if a lock is fat it can &amp;nbsp;
&lt;br&gt;&amp;gt; only go back to
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;// &amp;nbsp; &amp;nbsp;being thin, so concurrent modification of the lock word &amp;nbsp;
&lt;br&gt;&amp;gt; is allowed.
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;// 2) if it's biased, we own it anyway so we can &amp;quot;lock&amp;quot; it by &amp;nbsp;
&lt;br&gt;&amp;gt; incrementing the
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;// &amp;nbsp; &amp;nbsp;count.
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;Word threadId = &amp;nbsp;
&lt;br&gt;&amp;gt; Word.fromIntZeroExtend(RVMThread.getCurrentThread().getLockingId());
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;for (;;) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;boolean attemptToInflate=false;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Word old=Magic.getWordAtOffset(o,lockOffset);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (old.and(TL_STAT_MASK).NE(TL_STAT_BIASABLE)) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) &amp;nbsp;
&lt;br&gt;&amp;gt; VM._assert(old.and(TL_STAT_MASK).EQ(TL_STAT_THIN) ||
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;gt; old.and(TL_STAT_MASK).EQ(TL_STAT_FAT));
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return false;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word id = old.and(TL_THREAD_ID_MASK);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// what do we do here? &amp;nbsp;if we have the bias, then it's &amp;nbsp;
&lt;br&gt;&amp;gt; easy. &amp;nbsp;but what
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// if we don't? &amp;nbsp;in that case we need to be ultra-careful. &amp;nbsp; 
&lt;br&gt;&amp;gt; what we can
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// do:
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// 1) if the lock is biased in our favor, then lock it
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// 2) if the lock is unbiased, then bias it in our favor an &amp;nbsp;
&lt;br&gt;&amp;gt; lock it
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// 3) if the lock is biased in someone else's favor, &amp;nbsp;
&lt;br&gt;&amp;gt; inflate it (so we can go above)
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (id.isZero()) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// lock is unbiased, bias it in our favor and grab it
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Synchronization.tryCompareAndSwap(
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;o, lockOffset,
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;old,
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;gt; old.or(threadId).toAddress().plus(TL_LOCK_COUNT_UNIT).toWord())) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.isync();
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return true;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (id.EQ(threadId)) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// lock is biased in our favor, so grab it
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word changed = &amp;nbsp;
&lt;br&gt;&amp;gt; old.toAddress().plus(TL_LOCK_COUNT_UNIT).toWord();
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!changed.and(TL_LOCK_COUNT_MASK).isZero()) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.setWordAtOffset(o, lockOffset, changed);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return true;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;attemptToInflate=true;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;attemptToInflate=true;
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (attemptToInflate) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;inflate(o,lockOffset);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; + &amp;nbsp;}
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; + &amp;nbsp;@NoNullCheck
&lt;br&gt;&amp;gt; + &amp;nbsp;@Unpreemptible
&lt;br&gt;&amp;gt; + &amp;nbsp;public static void unlockHeader(Object o, Offset &amp;nbsp;
&lt;br&gt;&amp;gt; lockOffset,boolean lockHeaderResult) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;// what to do here?
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;// 1) if lockHeaderResult is false, we're done
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;// 2) if lockHeaderResult is true, release the lock.
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;if (lockHeaderResult) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;unlock(o, lockOffset);
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; + &amp;nbsp;}
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; + &amp;nbsp;@Inline
&lt;br&gt;&amp;gt; + &amp;nbsp;@Uninterruptible
&lt;br&gt;&amp;gt; + &amp;nbsp;public static boolean allowHeaderCAS(Object o, Offset lockOffset) {
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;return &amp;nbsp;
&lt;br&gt;&amp;gt; Magic 
&lt;br&gt;&amp;gt; .getWordAtOffset(o,lockOffset).and(TL_STAT_MASK).NE(TL_STAT_BIASABLE);
&lt;br&gt;&amp;gt; + &amp;nbsp;}
&lt;br&gt;&amp;gt; +
&lt;br&gt;&amp;gt; &amp;nbsp; ////////////////////////////////////////////////////////////////
&lt;br&gt;&amp;gt; &amp;nbsp; /// Support for inflating (and deflating) heavy-weight locks ///
&lt;br&gt;&amp;gt; &amp;nbsp; ////////////////////////////////////////////////////////////////
&lt;br&gt;&amp;gt; @@ -246,11 +560,6 @@
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;*/
&lt;br&gt;&amp;gt; &amp;nbsp; @Unpreemptible
&lt;br&gt;&amp;gt; &amp;nbsp; private static Lock inflate(Object o, Offset lockOffset) {
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) {
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;VM._assert(holdsLock(o, lockOffset, &amp;nbsp;
&lt;br&gt;&amp;gt; RVMThread.getCurrentThread()));
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;// this assertions is just plain wrong.
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;//VM._assert((Magic.getWordAtOffset(o, &amp;nbsp;
&lt;br&gt;&amp;gt; lockOffset).and(TL_FAT_LOCK_MASK).isZero()));
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; Lock l = Lock.allocate();
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; if (VM.VerifyAssertions) {
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; VM._assert(l != null); // inflate called by wait (or notify) &amp;nbsp;
&lt;br&gt;&amp;gt; which shouldn't be called during GC
&lt;br&gt;&amp;gt; @@ -283,86 +592,6 @@
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; return l.lockHeavyLocked(o);
&lt;br&gt;&amp;gt; &amp;nbsp; }
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; - &amp;nbsp;/**
&lt;br&gt;&amp;gt; - &amp;nbsp; * Promotes a light-weight lock to a heavy-weight lock.
&lt;br&gt;&amp;gt; - &amp;nbsp; *
&lt;br&gt;&amp;gt; - &amp;nbsp; * @param o the object to get a heavy-weight lock
&lt;br&gt;&amp;gt; - &amp;nbsp; * @param lockOffset the offset of the thin lock word in the &amp;nbsp;
&lt;br&gt;&amp;gt; object.
&lt;br&gt;&amp;gt; - &amp;nbsp; * @return whether the object was successfully locked
&lt;br&gt;&amp;gt; - &amp;nbsp; */
&lt;br&gt;&amp;gt; - &amp;nbsp;private static Lock attemptToInflate(Object o, Offset lockOffset, &amp;nbsp;
&lt;br&gt;&amp;gt; Lock l) {
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp;Word old;
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp;l.mutex.lock();
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp;do {
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;old = Magic.prepareWord(o, lockOffset);
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;// check to see if another thread has already created a fat &amp;nbsp;
&lt;br&gt;&amp;gt; lock
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!(old.and(TL_FAT_LOCK_MASK).isZero())) { // already a fat &amp;nbsp;
&lt;br&gt;&amp;gt; lock in place
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Lock.trace) {
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;VM.sysWriteln(&amp;quot;Thread #&amp;quot;,RVMThread.getCurrentThreadSlot(),
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;: freeing lock &amp;quot;,Magic.objectAsAddress(l),
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot; because we had a double-inflate&amp;quot;);
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Lock.free(l);
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;l.mutex.unlock();
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;l = Lock.getLock(getLockIndex(old));
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return l;
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;Word locked = &amp;nbsp;
&lt;br&gt;&amp;gt; TL_FAT_LOCK_MASK 
&lt;br&gt;&amp;gt; .or(Word.fromIntZeroExtend(l.index).lsh(TL_LOCK_ID_SHIFT));
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;Word changed = locked.or(old.and(TL_UNLOCK_MASK));
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(getLockIndex(changed) == &amp;nbsp;
&lt;br&gt;&amp;gt; l.index);
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Magic.attemptWord(o, lockOffset, old, changed)) {
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;l.setLockedObject(o);
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;l.setOwnerId(old.and(TL_THREAD_ID_MASK).toInt());
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (l.getOwnerId() != 0) {
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;gt; l 
&lt;br&gt;&amp;gt; .setRecursionCount 
&lt;br&gt;&amp;gt; (old.and(TL_LOCK_COUNT_MASK).rshl(TL_LOCK_COUNT_SHIFT).toInt() + 1);
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return l;
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;// contention detected, try again
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp;} while (true);
&lt;br&gt;&amp;gt; - &amp;nbsp;}
&lt;br&gt;&amp;gt; -
&lt;br&gt;&amp;gt; - &amp;nbsp;public static void deflate(Object o, Offset lockOffset, Lock l) {
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) {
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;Word old = Magic.getWordAtOffset(o, lockOffset);
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;VM._assert(!(old.and(TL_FAT_LOCK_MASK).isZero()));
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;VM._assert(l == Lock.getLock(getLockIndex(old)));
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp;Word old;
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp;do {
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;old = Magic.prepareWord(o, lockOffset);
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp;} while (!Magic.attemptWord(o, lockOffset, old, &amp;nbsp;
&lt;br&gt;&amp;gt; old.and(TL_UNLOCK_MASK)));
&lt;br&gt;&amp;gt; - &amp;nbsp;}
&lt;br&gt;&amp;gt; -
&lt;br&gt;&amp;gt; - &amp;nbsp;/**
&lt;br&gt;&amp;gt; - &amp;nbsp; * @param obj an object
&lt;br&gt;&amp;gt; - &amp;nbsp; * @param lockOffset the offset of the thin lock word in the &amp;nbsp;
&lt;br&gt;&amp;gt; object.
&lt;br&gt;&amp;gt; - &amp;nbsp; * @param thread a thread
&lt;br&gt;&amp;gt; - &amp;nbsp; * @return &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if the lock on obj at offset &amp;nbsp;
&lt;br&gt;&amp;gt; lockOffset is currently owned
&lt;br&gt;&amp;gt; - &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; by thread &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; if it is not.
&lt;br&gt;&amp;gt; - &amp;nbsp; */
&lt;br&gt;&amp;gt; - &amp;nbsp;public static boolean holdsLock(Object obj, Offset lockOffset, &amp;nbsp;
&lt;br&gt;&amp;gt; RVMThread thread) {
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp;int tid = thread.getLockingId();
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp;Word bits = Magic.getWordAtOffset(obj, lockOffset);
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp;if (bits.and(TL_FAT_LOCK_MASK).isZero()) {
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;// if locked, then it is locked with a thin lock
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;return (bits.and(ThinLockConstants.TL_THREAD_ID_MASK).toInt() &amp;nbsp;
&lt;br&gt;&amp;gt; == tid);
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;// if locked, then it is locked with a fat lock
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;// but, if it's locked by someone else, the fat lock may get &amp;nbsp;
&lt;br&gt;&amp;gt; deflated,
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;// and then reinflated on this thread's behalf. &amp;nbsp;so we need &amp;nbsp;
&lt;br&gt;&amp;gt; to be careful.
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;int index = getLockIndex(bits);
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;Lock l = Lock.getLock(index);
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;boolean result=false;
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;if (l!=null) {
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;l.mutex.lock();
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result = (l.getOwnerId()==tid &amp;&amp; l.getLockedObject()==obj);
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;l.mutex.unlock();
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;return result;
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;gt; - &amp;nbsp;}
&lt;br&gt;&amp;gt; -
&lt;br&gt;&amp;gt; &amp;nbsp; ////////////////////////////////////////////////////////////////////////////
&lt;br&gt;&amp;gt; &amp;nbsp; /// Get heavy-weight lock for an object; if thin, inflate it.
&lt;br&gt;&amp;gt; &amp;nbsp; ////////////////////////////////////////////////////////////////////////////
&lt;br&gt;&amp;gt; @@ -380,14 +609,13 @@
&lt;br&gt;&amp;gt; &amp;nbsp; @Unpreemptible
&lt;br&gt;&amp;gt; &amp;nbsp; public static Lock getHeavyLock(Object o, Offset lockOffset, &amp;nbsp;
&lt;br&gt;&amp;gt; boolean create) {
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; Word old = Magic.getWordAtOffset(o, lockOffset);
&lt;br&gt;&amp;gt; - &amp;nbsp; &amp;nbsp;if (!(old.and(TL_FAT_LOCK_MASK).isZero())) { // already a fat &amp;nbsp;
&lt;br&gt;&amp;gt; lock in place
&lt;br&gt;&amp;gt; + &amp;nbsp; &amp;nbsp;if (isFat(old)) { // already a fat lock in place
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; return Lock.getLock(getLockIndex(old));
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; } else if (create) {
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; return inflate(o, lockOffset);
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; } else {
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; return null;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;gt; -
&lt;br&gt;&amp;gt; &amp;nbsp; }
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; ///////////////////////////////////////////////////////////////
&lt;br&gt;&amp;gt; @@ -397,22 +625,16 @@
&lt;br&gt;&amp;gt; &amp;nbsp; /**
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;* Number of times a thread yields before inflating the lock on a
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;* object to a heavy-weight lock. &amp;nbsp;The current value was for the
&lt;br&gt;&amp;gt; - &amp;nbsp; * portBOB benchmark on a 12-way SMP (AIX) in the Fall of '99. &amp;nbsp; 
&lt;br&gt;&amp;gt; This
&lt;br&gt;&amp;gt; - &amp;nbsp; * is almost certainly not the optimal value.
&lt;br&gt;&amp;gt; + &amp;nbsp; * portBOB benchmark on a 12-way SMP (AIX) in the Fall of '99. &amp;nbsp;FP
&lt;br&gt;&amp;gt; + &amp;nbsp; * confirmed that it's still optimal for JBB and DaCapo on 4-, 8-,
&lt;br&gt;&amp;gt; + &amp;nbsp; * and 16-way SMPs (Linux/ia32) in Spring '09.
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;*/
&lt;br&gt;&amp;gt; - &amp;nbsp;private static final int retryLimit = 40; // (-1 is effectively &amp;nbsp;
&lt;br&gt;&amp;gt; infinity)
&lt;br&gt;&amp;gt; + &amp;nbsp;private static final int retryLimit = 40;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; - &amp;nbsp;/**
&lt;br&gt;&amp;gt; - &amp;nbsp; * Should we trace lockContention to enable debugging?
&lt;br&gt;&amp;gt; - &amp;nbsp; */
&lt;br&gt;&amp;gt; - &amp;nbsp;private static final boolean traceContention = false;
&lt;br&gt;&amp;gt; + &amp;nbsp;static final boolean STATS = Lock.STATS;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; - &amp;nbsp;//////////////////////////////////////////////
&lt;br&gt;&amp;gt; - &amp;nbsp;// &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Statistics &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //
&lt;br&gt;&amp;gt; - &amp;nbsp;//////////////////////////////////////////////
&lt;br&gt;&amp;gt; + &amp;nbsp;static final boolean trace = false;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; - &amp;nbsp;static final boolean STATS = Lock.STATS;
&lt;br&gt;&amp;gt; -
&lt;br&gt;&amp;gt; &amp;nbsp; static int fastLocks;
&lt;br&gt;&amp;gt; &amp;nbsp; static int slowLocks;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; This was sent by the SourceForge.net collaborative development &amp;nbsp;
&lt;br&gt;&amp;gt; platform, the world's largest Open Source development site.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; ------------------------------------------------------------------------------
&lt;br&gt;&amp;gt; The NEW KODAK i700 Series Scanners deliver under ANY circumstances! &amp;nbsp;
&lt;br&gt;&amp;gt; Your
&lt;br&gt;&amp;gt; production scanning environment may not be a perfect world - but &amp;nbsp;
&lt;br&gt;&amp;gt; thanks to
&lt;br&gt;&amp;gt; Kodak, there's a perfect scanner to get the job done! With the NEW &amp;nbsp;
&lt;br&gt;&amp;gt; KODAK i700
&lt;br&gt;&amp;gt; Series Scanner you'll get full speed at 300 dpi even with all image
&lt;br&gt;&amp;gt; processing features enabled. &lt;a href=&quot;http://p.sf.net/sfu/kodak-com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/kodak-com&lt;/a&gt;&lt;br&gt;&amp;gt; _______________________________________________
&lt;br&gt;&amp;gt; Jikesrvm-commits mailing list
&lt;br&gt;&amp;gt; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=23441104&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Jikesrvm-commits@...&lt;/a&gt;
&lt;br&gt;&amp;gt; &lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/jikesrvm-commits&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/jikesrvm-commits&lt;/a&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;------------------------------------------------------------------------------
&lt;br&gt;The NEW KODAK i700 Series Scanners deliver under ANY circumstances! Your
&lt;br&gt;production scanning environment may not be a perfect world - but thanks to
&lt;br&gt;Kodak, there's a perfect scanner to get the job done! With the NEW KODAK i700
&lt;br&gt;Series Scanner you'll get full speed at 300 dpi even with all image 
&lt;br&gt;processing features enabled. &lt;a href=&quot;http://p.sf.net/sfu/kodak-com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/kodak-com&lt;/a&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;Jikesrvm-core mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=23441104&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Jikesrvm-core@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-rvm-core--Biased-locking-tp23441104p23441104.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-23441089</id>
	<title>Re: [rvm-core] [rvm-commits] SF.net SVN: jikesrvm:[15685]	rvmroot/trunk</title>
	<published>2009-05-08T00:00:16Z</published>
	<updated>2009-05-08T00:00:16Z</updated>
	<author>
		<name>Steve Blackburn</name>
	</author>
	<content type="html">&lt;html&gt;&lt;body style=&quot;word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; &quot;&gt;Strange. &amp;nbsp;I didn't see any problems either.&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;--Steve&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;div&gt;&lt;div&gt;On 08/05/2009, at 1:02 PM, Filip Pizlo wrote:&lt;/div&gt;&lt;br class=&quot;Apple-interchange-newline&quot;&gt;&lt;blockquote type=&quot;cite&quot;&gt;&lt;div style=&quot;word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; &quot;&gt;Hi Dave,&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;I just did a clean checkout of trunk and tried building prototype and FullAdaptiveGenMS on vole.anu.edu.au, and FullAdaptiveGenMS on my Fedora 9 box, and my Ubuntu box. &amp;nbsp;It worked on all of them. &amp;nbsp; No compile errors.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;I'm building with buildit. &amp;nbsp;Should I be worried about some other way of building that you're using?&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;-Filip&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;div&gt;&lt;div&gt;On May 7, 2009, at 10:36 PM, David P Grove wrote:&lt;/div&gt;&lt;br class=&quot;Apple-interchange-newline&quot;&gt;&lt;blockquote type=&quot;cite&quot;&gt;&lt;div&gt;&lt;p&gt;svn head doesn't compile.  Please fix.  &lt;br&gt; &lt;br&gt; thanks,&lt;br&gt; &lt;br&gt; --dave&lt;br&gt; &lt;br&gt; do-checkstyle:&lt;br&gt; &lt;br&gt; compile:&lt;br&gt;    [mkdir] Created dir: /home/dgrove/rvm-trunk/target/prototype_ia32-linux/classes&lt;br&gt;    [javac] Compiling 88 source files to /home/dgrove/rvm-trunk/target/prototype_ia32-linux/classes&lt;br&gt;    [javac] /home/dgrove/rvm-trunk/rvm/src/org/jikesrvm/scheduler/Lock.java:315: cannot find symbol&lt;br&gt;    [javac] symbol  : method markDeflated(java.lang.Object,org.vmmagic.unboxed.Offset,int)&lt;br&gt;    [javac] location: class org.jikesrvm.scheduler.ThinLock&lt;br&gt;    [javac]     ThinLock.markDeflated(o, lockOffset, index);&lt;br&gt;    [javac]             ^&lt;br&gt;    [javac] Note: * uses or overrides a deprecated API.&lt;br&gt;    [javac] Note: Recompile with -Xlint:deprecation for details.&lt;br&gt;    [javac] Note: Some input files use unchecked or unsafe operations.&lt;br&gt;    [javac] Note: Recompile with -Xlint:unchecked for details.&lt;br&gt;    [javac] 1 error&lt;br&gt; &lt;br&gt; BUILD FAILED&lt;br&gt; /home/dgrove/rvm-trunk/build.xml:1079: The following error occurred while executing this line:&lt;br&gt; /home/dgrove/rvm-trunk/build.xml:1092: Compile failed; see the compiler error output for details.&lt;br&gt; &lt;br&gt; &lt;br&gt; &lt;span&gt;&amp;lt;graycol.gif&gt;&lt;/span&gt;&lt;font color=&quot;#424282&quot;&gt;pizlo---05/07/2009 06:40:28 PM---Revision: 15685           &lt;a href=&quot;http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=15685&amp;amp;view=rev&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=15685&amp;amp;view=rev&lt;/a&gt;&lt;/font&gt;&lt;br&gt; &lt;br&gt; &lt;table width=&quot;100%&quot; border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt; &lt;tbody&gt;&lt;tr valign=&quot;top&quot;&gt;&lt;td width=&quot;1%&quot;&gt;&lt;span&gt;&amp;lt;ecblank.gif&gt;&lt;/span&gt;&lt;br&gt; &lt;font size=&quot;2&quot; color=&quot;#5F5F5F&quot;&gt;From:&lt;/font&gt;&lt;/td&gt;&lt;td width=&quot;100%&quot;&gt;&lt;span&gt;&amp;lt;ecblank.gif&gt;&lt;/span&gt;&lt;br&gt; &lt;font size=&quot;2&quot;&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=23441089&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;pizlo@...&lt;/a&gt;&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr valign=&quot;top&quot;&gt;&lt;td width=&quot;1%&quot;&gt;&lt;span&gt;&amp;lt;ecblank.gif&gt;&lt;/span&gt;&lt;br&gt; &lt;font size=&quot;2&quot; color=&quot;#5F5F5F&quot;&gt;To:&lt;/font&gt;&lt;/td&gt;&lt;td width=&quot;100%&quot;&gt;&lt;span&gt;&amp;lt;ecblank.gif&gt;&lt;/span&gt;&lt;br&gt; &lt;font size=&quot;2&quot;&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=23441089&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;jikesrvm-commits@...&lt;/a&gt;&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr valign=&quot;top&quot;&gt;&lt;td width=&quot;1%&quot;&gt;&lt;span&gt;&amp;lt;ecblank.gif&gt;&lt;/span&gt;&lt;br&gt; &lt;font size=&quot;2&quot; color=&quot;#5F5F5F&quot;&gt;Date:&lt;/font&gt;&lt;/td&gt;&lt;td width=&quot;100%&quot;&gt;&lt;span&gt;&amp;lt;ecblank.gif&gt;&lt;/span&gt;&lt;br&gt; &lt;font size=&quot;2&quot;&gt;05/07/2009 06:40 PM&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr valign=&quot;top&quot;&gt;&lt;td width=&quot;1%&quot;&gt;&lt;span&gt;&amp;lt;ecblank.gif&gt;&lt;/span&gt;&lt;br&gt; &lt;font size=&quot;2&quot; color=&quot;#5F5F5F&quot;&gt;Subject:&lt;/font&gt;&lt;/td&gt;&lt;td width=&quot;100%&quot;&gt;&lt;span&gt;&amp;lt;ecblank.gif&gt;&lt;/span&gt;&lt;br&gt; &lt;font size=&quot;2&quot;&gt;[rvm-commits] SF.net SVN: jikesrvm:[15685] rvmroot/trunk&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;&lt;hr width=&quot;100%&quot; size=&quot;2&quot; align=&quot;left&quot; noshade=&quot;&quot; style=&quot;color:#8091A5; &quot;&gt;&lt;br&gt; &lt;br&gt; &lt;br&gt; &lt;tt&gt;Revision: 15685&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/tt&gt;&lt;tt&gt;&lt;a href=&quot;http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=15685&amp;amp;view=rev&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=15685&amp;amp;view=rev&lt;/a&gt;&lt;/tt&gt;&lt;tt&gt;&lt;br&gt; Author: &amp;nbsp; pizlo&lt;br&gt; Date: &amp;nbsp; &amp;nbsp; 2009-05-07 22:40:00 +0000 (Thu, 07 May 2009)&lt;br&gt; &lt;br&gt; Log Message:&lt;br&gt; -----------&lt;br&gt; Merging biased locking support. &amp;nbsp;Biased locking is on by default and there is currently no way to disable it (except potentially by some small hacks in the code). &amp;nbsp;On DaCapo, we see no performance degradation on any benchmark; instead we see a 6% performance boost in the geomean.&lt;br&gt; &lt;br&gt; Modified Paths:&lt;br&gt; --------------&lt;br&gt; &amp;nbsp; &amp;nbsp;rvmroot/trunk/build/primordials/RVM.txt&lt;br&gt; &amp;nbsp; &amp;nbsp;rvmroot/trunk/rvm/src/org/jikesrvm/VM.java&lt;br&gt; &amp;nbsp; &amp;nbsp;rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/bc2ir/BC2IR.java&lt;br&gt; &amp;nbsp; &amp;nbsp;rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/JavaHeader.java&lt;br&gt; &amp;nbsp; &amp;nbsp;rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ObjectModel.java&lt;br&gt; &amp;nbsp; &amp;nbsp;rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ThinLockConstants.java&lt;br&gt; &amp;nbsp; &amp;nbsp;rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Lock.java&lt;br&gt; &amp;nbsp; &amp;nbsp;rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/RVMThread.java&lt;br&gt; &amp;nbsp; &amp;nbsp;rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Synchronization.java&lt;br&gt; &amp;nbsp; &amp;nbsp;rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/ThinLock.java&lt;br&gt; &lt;br&gt; Modified: rvmroot/trunk/build/primordials/RVM.txt&lt;br&gt; ===================================================================&lt;br&gt; --- rvmroot/trunk/build/primordials/RVM.txt		 2009-05-07 20:08:18 UTC (rev 15684)&lt;br&gt; +++ rvmroot/trunk/build/primordials/RVM.txt		 2009-05-07 22:40:00 UTC (rev 15685)&lt;br&gt; @@ -54,6 +54,8 @@&lt;br&gt; [[Lorg/jikesrvm/scheduler/RVMThread;&lt;br&gt; [Lorg/jikesrvm/scheduler/RVMThread$BlockAdapter;&lt;br&gt; [[Lorg/jikesrvm/scheduler/RVMThread$BlockAdapter;&lt;br&gt; +Lorg/jikesrvm/scheduler/ThinLock;&lt;br&gt; +Lorg/jikesrvm/scheduler/Lock;&lt;br&gt; [Lorg/jikesrvm/scheduler/Lock;&lt;br&gt; [[Lorg/jikesrvm/scheduler/Lock;&lt;br&gt; &lt;br&gt; &lt;br&gt; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/VM.java&lt;br&gt; ===================================================================&lt;br&gt; --- rvmroot/trunk/rvm/src/org/jikesrvm/VM.java		 2009-05-07 20:08:18 UTC (rev 15684)&lt;br&gt; +++ rvmroot/trunk/rvm/src/org/jikesrvm/VM.java		 2009-05-07 22:40:00 UTC (rev 15685)&lt;br&gt; @@ -2058,6 +2058,25 @@&lt;br&gt; &amp;nbsp; &amp;nbsp; swUnlock();&lt;br&gt; &amp;nbsp; }&lt;br&gt; &lt;br&gt; + &amp;nbsp;@NoInline&lt;br&gt; + &amp;nbsp;public static void sysWriteln(String s0, Address a1, String s1, Word w1, String s2, int i1, String s3, int i2, String s4, Word w2, String s5, int i3) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;swLock();&lt;br&gt; + &amp;nbsp; &amp;nbsp;write(s0);&lt;br&gt; + &amp;nbsp; &amp;nbsp;write(a1);&lt;br&gt; + &amp;nbsp; &amp;nbsp;write(s1);&lt;br&gt; + &amp;nbsp; &amp;nbsp;write(w1);&lt;br&gt; + &amp;nbsp; &amp;nbsp;write(s2);&lt;br&gt; + &amp;nbsp; &amp;nbsp;write(i1);&lt;br&gt; + &amp;nbsp; &amp;nbsp;write(s3);&lt;br&gt; + &amp;nbsp; &amp;nbsp;write(i2);&lt;br&gt; + &amp;nbsp; &amp;nbsp;write(s4);&lt;br&gt; + &amp;nbsp; &amp;nbsp;write(w2);&lt;br&gt; + &amp;nbsp; &amp;nbsp;write(s5);&lt;br&gt; + &amp;nbsp; &amp;nbsp;write(i3);&lt;br&gt; + &amp;nbsp; &amp;nbsp;writeln();&lt;br&gt; + &amp;nbsp; &amp;nbsp;swUnlock();&lt;br&gt; + &amp;nbsp;}&lt;br&gt; +&lt;br&gt; &amp;nbsp; private static void showThread() {&lt;br&gt; &amp;nbsp; &amp;nbsp; write(&quot;Thread &quot;);&lt;br&gt; &amp;nbsp; &amp;nbsp; write(RVMThread.getCurrentThread().getThreadSlot());&lt;br&gt; &lt;br&gt; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/bc2ir/BC2IR.java&lt;br&gt; ===================================================================&lt;br&gt; --- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/bc2ir/BC2IR.java		 2009-05-07 20:08:18 UTC (rev 15684)&lt;br&gt; +++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/bc2ir/BC2IR.java		 2009-05-07 22:40:00 UTC (rev 15685)&lt;br&gt; @@ -3635,6 +3635,7 @@&lt;br&gt; &amp;nbsp; &amp;nbsp;*/&lt;br&gt; &amp;nbsp; public boolean do_NullCheck(Operand ref) {&lt;br&gt; &amp;nbsp; &amp;nbsp; if (gc.noNullChecks()) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;setCurrentGuard(new TrueGuardOperand());&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; return false;&lt;br&gt; &amp;nbsp; &amp;nbsp; }&lt;br&gt; &amp;nbsp; &amp;nbsp; if (ref.isDefinitelyNull()) {&lt;br&gt; &lt;br&gt; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/JavaHeader.java&lt;br&gt; ===================================================================&lt;br&gt; --- rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/JavaHeader.java		 2009-05-07 20:08:18 UTC (rev 15684)&lt;br&gt; +++ rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/JavaHeader.java		 2009-05-07 22:40:00 UTC (rev 15685)&lt;br&gt; @@ -492,6 +492,7 @@&lt;br&gt; &amp;nbsp; &amp;nbsp;* Get the hash code of an object.&lt;br&gt; &amp;nbsp; &amp;nbsp;*/&lt;br&gt; &amp;nbsp; @Inline&lt;br&gt; + &amp;nbsp;@Interruptible&lt;br&gt; &amp;nbsp; public static int getObjectHashCode(Object o) {&lt;br&gt; &amp;nbsp; &amp;nbsp; if (ADDRESS_BASED_HASHING) {&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (MemoryManagerConstants.MOVES_OBJECTS) {&lt;br&gt; @@ -513,10 +514,18 @@&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } else {&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // UNHASHED&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word tmp;&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;do {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tmp = Magic.prepareWord(o, STATUS_OFFSET);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} while (!Magic.attemptWord(o, STATUS_OFFSET, tmp, tmp.or(HASH_STATE_HASHED)));&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;boolean lhr=ThinLock.lockHeader(o, STATUS_OFFSET);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (lhr) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.setWordAtOffset(&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;o, STATUS_OFFSET,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.getWordAtOffset(o, STATUS_OFFSET).or(HASH_STATE_HASHED));&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word tmp;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;do {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tmp = Magic.prepareWord(o, STATUS_OFFSET);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} while (!Magic.attemptWord(o, STATUS_OFFSET, tmp, tmp.or(HASH_STATE_HASHED)));&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ThinLock.unlockHeader(o, STATUS_OFFSET, lhr);&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (ObjectModel.HASH_STATS) ObjectModel.hashTransition1++;&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return getObjectHashCode(o);&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt; @@ -534,20 +543,35 @@&lt;br&gt; &lt;br&gt; &amp;nbsp; /** Install a new hashcode (only used if !ADDRESS_BASED_HASHING) */&lt;br&gt; &amp;nbsp; @NoInline&lt;br&gt; + &amp;nbsp;@Interruptible&lt;br&gt; &amp;nbsp; protected static int installHashCode(Object o) {&lt;br&gt; &amp;nbsp; &amp;nbsp; Word hashCode;&lt;br&gt; &amp;nbsp; &amp;nbsp; do {&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; hashCodeGenerator = hashCodeGenerator.plus(Word.one().lsh(HASH_CODE_SHIFT));&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; hashCode = hashCodeGenerator.and(HASH_CODE_MASK);&lt;br&gt; &amp;nbsp; &amp;nbsp; } while (hashCode.isZero());&lt;br&gt; - &amp;nbsp; &amp;nbsp;while (true) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;Word statusWord = Magic.prepareWord(o, STATUS_OFFSET);&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (ThinLock.lockHeader(o, STATUS_OFFSET)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Word statusWord = Magic.getWordAtOffset(o, STATUS_OFFSET);&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (!(statusWord.and(HASH_CODE_MASK).isZero())) // some other thread installed a hashcode&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ThinLock.unlockHeader(o, STATUS_OFFSET, true);&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return statusWord.and(HASH_CODE_MASK).rshl(HASH_CODE_SHIFT).toInt();&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Magic.attemptWord(o, STATUS_OFFSET, statusWord, statusWord.or(hashCode))) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return hashCode.rshl(HASH_CODE_SHIFT).toInt(); &amp;nbsp;// we installed the hash code&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.setWordAtOffset(o, STATUS_OFFSET, statusWord.or(hashCode));&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;ThinLock.unlockHeader(o, STATUS_OFFSET, true);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;return hashCode.rshl(HASH_CODE_SHIFT).toInt(); &amp;nbsp;// we installed the hash code&lt;br&gt; + &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;while (true) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word statusWord = Magic.prepareWord(o, STATUS_OFFSET);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!(statusWord.and(HASH_CODE_MASK).isZero())) // some other thread installed a hashcode&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ThinLock.unlockHeader(o, STATUS_OFFSET, false);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return statusWord.and(HASH_CODE_MASK).rshl(HASH_CODE_SHIFT).toInt();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Magic.attemptWord(o, STATUS_OFFSET, statusWord, statusWord.or(hashCode))) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ThinLock.unlockHeader(o, STATUS_OFFSET, false);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return hashCode.rshl(HASH_CODE_SHIFT).toInt(); &amp;nbsp;// we installed the hash code&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt; &amp;nbsp; &amp;nbsp; }&lt;br&gt; &amp;nbsp; }&lt;br&gt; @@ -677,6 +701,7 @@&lt;br&gt; &amp;nbsp; &amp;nbsp;* Freeze the other bits in the byte containing the available bits&lt;br&gt; &amp;nbsp; &amp;nbsp;* so that it is safe to update them using setAvailableBits.&lt;br&gt; &amp;nbsp; &amp;nbsp;*/&lt;br&gt; + &amp;nbsp;@Interruptible&lt;br&gt; &amp;nbsp; public static void initializeAvailableByte(Object o) {&lt;br&gt; &amp;nbsp; &amp;nbsp; if (!ADDRESS_BASED_HASHING) getObjectHashCode(o);&lt;br&gt; &amp;nbsp; }&lt;br&gt; @@ -685,6 +710,8 @@&lt;br&gt; &amp;nbsp; &amp;nbsp;* A prepare on the word containing the available bits&lt;br&gt; &amp;nbsp; &amp;nbsp;*/&lt;br&gt; &amp;nbsp; public static Word prepareAvailableBits(Object o) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.worldStopped() || ThinLock.allowHeaderCAS(o, STATUS_OFFSET));&lt;br&gt; &amp;nbsp; &amp;nbsp; return Magic.prepareWord(o, STATUS_OFFSET);&lt;br&gt; &amp;nbsp; }&lt;br&gt; &lt;br&gt; @@ -692,6 +719,8 @@&lt;br&gt; &amp;nbsp; &amp;nbsp;* An attempt on the word containing the available bits&lt;br&gt; &amp;nbsp; &amp;nbsp;*/&lt;br&gt; &amp;nbsp; public static boolean attemptAvailableBits(Object o, Word oldVal, Word newVal) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.worldStopped() || ThinLock.allowHeaderCAS(o, STATUS_OFFSET));&lt;br&gt; &amp;nbsp; &amp;nbsp; return Magic.attemptWord(o, STATUS_OFFSET, oldVal, newVal);&lt;br&gt; &amp;nbsp; }&lt;br&gt; &lt;br&gt; &lt;br&gt; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ObjectModel.java&lt;br&gt; ===================================================================&lt;br&gt; --- rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ObjectModel.java		 2009-05-07 20:08:18 UTC (rev 15684)&lt;br&gt; +++ rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ObjectModel.java		 2009-05-07 22:40:00 UTC (rev 15685)&lt;br&gt; @@ -432,6 +432,7 @@&lt;br&gt; &amp;nbsp; /**&lt;br&gt; &amp;nbsp; &amp;nbsp;* Get the hash code of an object.&lt;br&gt; &amp;nbsp; &amp;nbsp;*/&lt;br&gt; + &amp;nbsp;@Interruptible&lt;br&gt; &amp;nbsp; public static int getObjectHashCode(Object o) {&lt;br&gt; &amp;nbsp; &amp;nbsp; if (HASH_STATS) hashRequests++;&lt;br&gt; &amp;nbsp; &amp;nbsp; return JavaHeader.getObjectHashCode(o);&lt;br&gt; @@ -547,6 +548,7 @@&lt;br&gt; &amp;nbsp; &amp;nbsp;* Freeze the other bits in the byte containing the available bits&lt;br&gt; &amp;nbsp; &amp;nbsp;* so that it is safe to update them using setAvailableBits.&lt;br&gt; &amp;nbsp; &amp;nbsp;*/&lt;br&gt; + &amp;nbsp;@Interruptible&lt;br&gt; &amp;nbsp; public static void initializeAvailableByte(Object o) {&lt;br&gt; &amp;nbsp; &amp;nbsp; JavaHeader.initializeAvailableByte(o);&lt;br&gt; &amp;nbsp; }&lt;br&gt; &lt;br&gt; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ThinLockConstants.java&lt;br&gt; ===================================================================&lt;br&gt; --- rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ThinLockConstants.java		 2009-05-07 20:08:18 UTC (rev 15684)&lt;br&gt; +++ rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ThinLockConstants.java		 2009-05-07 22:40:00 UTC (rev 15685)&lt;br&gt; @@ -35,21 +35,32 @@&lt;br&gt; &amp;nbsp;*/&lt;br&gt; public interface ThinLockConstants extends SizeConstants {&lt;br&gt; &lt;br&gt; - &amp;nbsp;int NUM_BITS_TID = RVMThread.LOG_MAX_THREADS;&lt;br&gt; - &amp;nbsp;int NUM_BITS_RC = JavaHeader.NUM_THIN_LOCK_BITS - NUM_BITS_TID;&lt;br&gt; + &amp;nbsp;// biased locking / thin locking status bits:&lt;br&gt; + &amp;nbsp;// 00 -&gt; thin biasable, and biased if TID is non-zero&lt;br&gt; + &amp;nbsp;// 01 -&gt; thin unbiasable&lt;br&gt; + &amp;nbsp;// 10 -&gt; fat unbiasable&lt;br&gt; &lt;br&gt; + &amp;nbsp;int TL_NUM_BITS_STAT = 2;&lt;br&gt; + &amp;nbsp;int TL_NUM_BITS_TID = RVMThread.LOG_MAX_THREADS;&lt;br&gt; + &amp;nbsp;int TL_NUM_BITS_RC = JavaHeader.NUM_THIN_LOCK_BITS - TL_NUM_BITS_TID - TL_NUM_BITS_STAT;&lt;br&gt; +&lt;br&gt; &amp;nbsp; int TL_LOCK_COUNT_SHIFT = JavaHeader.THIN_LOCK_SHIFT;&lt;br&gt; - &amp;nbsp;int TL_THREAD_ID_SHIFT = TL_LOCK_COUNT_SHIFT + NUM_BITS_RC;&lt;br&gt; + &amp;nbsp;int TL_THREAD_ID_SHIFT = TL_LOCK_COUNT_SHIFT + TL_NUM_BITS_RC;&lt;br&gt; + &amp;nbsp;int TL_STAT_SHIFT = TL_THREAD_ID_SHIFT + TL_NUM_BITS_TID;&lt;br&gt; &amp;nbsp; int TL_LOCK_ID_SHIFT = JavaHeader.THIN_LOCK_SHIFT;&lt;br&gt; &lt;br&gt; &amp;nbsp; int TL_LOCK_COUNT_UNIT = 1 &amp;lt;&amp;lt; TL_LOCK_COUNT_SHIFT;&lt;br&gt; &lt;br&gt; - &amp;nbsp;Word TL_LOCK_COUNT_MASK = Word.fromIntSignExtend(-1).rshl(BITS_IN_ADDRESS - NUM_BITS_RC).lsh(TL_LOCK_COUNT_SHIFT);&lt;br&gt; - &amp;nbsp;Word TL_THREAD_ID_MASK = Word.fromIntSignExtend(-1).rshl(BITS_IN_ADDRESS - NUM_BITS_TID).lsh(TL_THREAD_ID_SHIFT);&lt;br&gt; + &amp;nbsp;Word TL_LOCK_COUNT_MASK = Word.fromIntSignExtend(-1).rshl(BITS_IN_ADDRESS - TL_NUM_BITS_RC).lsh(TL_LOCK_COUNT_SHIFT);&lt;br&gt; + &amp;nbsp;Word TL_THREAD_ID_MASK = Word.fromIntSignExtend(-1).rshl(BITS_IN_ADDRESS - TL_NUM_BITS_TID).lsh(TL_THREAD_ID_SHIFT);&lt;br&gt; &amp;nbsp; Word TL_LOCK_ID_MASK =&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;Word.fromIntSignExtend(-1).rshl(BITS_IN_ADDRESS - (NUM_BITS_RC + NUM_BITS_TID - 1)).lsh(TL_LOCK_ID_SHIFT);&lt;br&gt; - &amp;nbsp;Word TL_FAT_LOCK_MASK = Word.one().lsh(JavaHeader.THIN_LOCK_SHIFT + NUM_BITS_RC + NUM_BITS_TID - 1);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Word.fromIntSignExtend(-1).rshl(BITS_IN_ADDRESS - (TL_NUM_BITS_RC + TL_NUM_BITS_TID)).lsh(TL_LOCK_ID_SHIFT);&lt;br&gt; + &amp;nbsp;Word TL_STAT_MASK = Word.fromIntSignExtend(-1).rshl(BITS_IN_ADDRESS - TL_NUM_BITS_TID).lsh(TL_STAT_SHIFT);&lt;br&gt; &amp;nbsp; Word TL_UNLOCK_MASK = Word.fromIntSignExtend(-1).rshl(BITS_IN_ADDRESS - JavaHeader&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; .NUM_THIN_LOCK_BITS).lsh(JavaHeader.THIN_LOCK_SHIFT).not();&lt;br&gt; +&lt;br&gt; + &amp;nbsp;Word TL_STAT_BIASABLE = Word.fromIntSignExtend(0).lsh(TL_STAT_SHIFT);&lt;br&gt; + &amp;nbsp;Word TL_STAT_THIN = Word.fromIntSignExtend(1).lsh(TL_STAT_SHIFT);&lt;br&gt; + &amp;nbsp;Word TL_STAT_FAT = Word.fromIntSignExtend(2).lsh(TL_STAT_SHIFT);&lt;br&gt; }&lt;br&gt; &lt;br&gt; &lt;br&gt; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Lock.java&lt;br&gt; ===================================================================&lt;br&gt; --- rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Lock.java		 2009-05-07 20:08:18 UTC (rev 15684)&lt;br&gt; +++ rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Lock.java		 2009-05-07 22:40:00 UTC (rev 15685)&lt;br&gt; @@ -115,7 +115,7 @@&lt;br&gt; &amp;nbsp;*/&lt;br&gt; &lt;br&gt; @Uninterruptible&lt;br&gt; -public class Lock implements Constants {&lt;br&gt; +public final class Lock implements Constants {&lt;br&gt; &amp;nbsp; /****************************************************************************&lt;br&gt; &amp;nbsp; &amp;nbsp;* Constants&lt;br&gt; &amp;nbsp; &amp;nbsp;*/&lt;br&gt; @@ -311,7 +311,7 @@&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; VM._assert(waiting.isEmpty());&lt;br&gt; &amp;nbsp; &amp;nbsp; }&lt;br&gt; &amp;nbsp; &amp;nbsp; if (STATS) deflations++;&lt;br&gt; - &amp;nbsp; &amp;nbsp;ThinLock.deflate(o, lockOffset, this);&lt;br&gt; + &amp;nbsp; &amp;nbsp;ThinLock.markDeflated(o, lockOffset, index);&lt;br&gt; &amp;nbsp; &amp;nbsp; lockedObject = null;&lt;br&gt; &amp;nbsp; &amp;nbsp; free(this);&lt;br&gt; &amp;nbsp; }&lt;br&gt; &lt;br&gt; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/RVMThread.java&lt;br&gt; ===================================================================&lt;br&gt; --- rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/RVMThread.java		 2009-05-07 20:08:18 UTC (rev 15684)&lt;br&gt; +++ rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/RVMThread.java		 2009-05-07 22:40:00 UTC (rev 15685)&lt;br&gt; @@ -2097,7 +2097,9 @@&lt;br&gt; &amp;nbsp; }&lt;br&gt; &lt;br&gt; &amp;nbsp; @Unpreemptible&lt;br&gt; - &amp;nbsp;final int safeBlock(BlockAdapter ba, boolean asynchronous) {&lt;br&gt; + &amp;nbsp;private int safeBlock(BlockAdapter ba, boolean asynchronous) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions)&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;VM._assert(getCurrentThread() != this);&lt;br&gt; &amp;nbsp; &amp;nbsp; beginPairWithCurrent();&lt;br&gt; &amp;nbsp; &amp;nbsp; int result=block(ba,asynchronous);&lt;br&gt; &amp;nbsp; &amp;nbsp; endPairWithCurrent();&lt;br&gt; @@ -2106,14 +2108,16 @@&lt;br&gt; &lt;br&gt; &amp;nbsp; @Unpreemptible&lt;br&gt; &amp;nbsp; public final int safeAsyncBlock(BlockAdapter ba) {&lt;br&gt; - &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions)&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;VM._assert(getCurrentThread() != this);&lt;br&gt; &amp;nbsp; &amp;nbsp; return safeBlock(ba, true);&lt;br&gt; &amp;nbsp; }&lt;br&gt; &lt;br&gt; &amp;nbsp; @Unpreemptible&lt;br&gt; &amp;nbsp; public final int safeBlock(BlockAdapter ba) {&lt;br&gt; - &amp;nbsp; &amp;nbsp;return safeBlock(ba, false);&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (getCurrentThread()==this) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;return block(ba,false);&lt;br&gt; + &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;return safeBlock(ba, false);&lt;br&gt; + &amp;nbsp; &amp;nbsp;}&lt;br&gt; &amp;nbsp; }&lt;br&gt; &lt;br&gt; &amp;nbsp; @Unpreemptible&lt;br&gt; @@ -2821,22 +2825,20 @@&lt;br&gt; &amp;nbsp; &amp;nbsp;*/&lt;br&gt; &amp;nbsp; @UnpreemptibleNoWarn(&quot;Exceptions may possibly cause yields&quot;)&lt;br&gt; &amp;nbsp; public final void suspend() {&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (false) VM.sysWriteln(&quot;Thread #&quot;,getCurrentThreadSlot(),&quot; suspending Thread #&quot;,getThreadSlot());&lt;br&gt; &amp;nbsp; &amp;nbsp; ObjectModel.genericUnlock(thread);&lt;br&gt; &amp;nbsp; &amp;nbsp; Throwable rethrow = null;&lt;br&gt; - &amp;nbsp; &amp;nbsp;monitor().lockNoHandshake();&lt;br&gt; &amp;nbsp; &amp;nbsp; try {&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; observeExecStatus();&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (execStatus != IN_JAVA &amp;amp;&amp;amp; execStatus != IN_JAVA_TO_BLOCK &amp;amp;&amp;amp;&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; execStatus != IN_NATIVE &amp;amp;&amp;amp; execStatus != BLOCKED_IN_NATIVE &amp;amp;&amp;amp;&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; execStatus != BLOCKED_IN_JNI &amp;amp;&amp;amp; execStatus != IN_JNI) {&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; throw new IllegalThreadStateException(&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&quot;Cannot suspend a thread that is not running.&quot;);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&quot;Cannot suspend a thread that is not running.&quot;);&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;safeBlock(suspendBlockAdapter);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;block(suspendBlockAdapter);&lt;br&gt; &amp;nbsp; &amp;nbsp; } catch (Throwable t) {&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; rethrow = t;&lt;br&gt; - &amp;nbsp; &amp;nbsp;} finally {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;monitor().unlock();&lt;br&gt; &amp;nbsp; &amp;nbsp; }&lt;br&gt; &amp;nbsp; &amp;nbsp; ObjectModel.genericLock(thread);&lt;br&gt; &amp;nbsp; &amp;nbsp; if (rethrow != null)&lt;br&gt; &lt;br&gt; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Synchronization.java&lt;br&gt; ===================================================================&lt;br&gt; --- rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Synchronization.java		 2009-05-07 20:08:18 UTC (rev 15684)&lt;br&gt; +++ rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Synchronization.java		 2009-05-07 22:40:00 UTC (rev 15685)&lt;br&gt; @@ -19,6 +19,7 @@&lt;br&gt; import org.vmmagic.pragma.Inline;&lt;br&gt; import org.vmmagic.pragma.Uninterruptible;&lt;br&gt; import org.vmmagic.unboxed.Address;&lt;br&gt; +import org.vmmagic.unboxed.Word;&lt;br&gt; import org.vmmagic.unboxed.Offset;&lt;br&gt; &lt;br&gt; /**&lt;br&gt; @@ -74,6 +75,24 @@&lt;br&gt; &amp;nbsp; &amp;nbsp;* @return true =&gt; successful swap, false =&gt; field not equal to testValue&lt;br&gt; &amp;nbsp; &amp;nbsp;*/&lt;br&gt; &amp;nbsp; @Inline&lt;br&gt; + &amp;nbsp;public static boolean tryCompareAndSwap(Object base, Offset offset, Word testValue, Word newValue) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;Word oldValue;&lt;br&gt; + &amp;nbsp; &amp;nbsp;do {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;oldValue = Magic.prepareWord(base, offset);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (oldValue != testValue) return false;&lt;br&gt; + &amp;nbsp; &amp;nbsp;} while (!Magic.attemptWord(base, offset, oldValue, newValue));&lt;br&gt; + &amp;nbsp; &amp;nbsp;return true;&lt;br&gt; + &amp;nbsp;}&lt;br&gt; +&lt;br&gt; + &amp;nbsp;/**&lt;br&gt; + &amp;nbsp; * Atomically swap test value to new value in the specified object and the specified field&lt;br&gt; + &amp;nbsp; * @param base object containing field&lt;br&gt; + &amp;nbsp; * @param offset position of field&lt;br&gt; + &amp;nbsp; * @param testValue expected value of field&lt;br&gt; + &amp;nbsp; * @param newValue new value of field&lt;br&gt; + &amp;nbsp; * @return true =&gt; successful swap, false =&gt; field not equal to testValue&lt;br&gt; + &amp;nbsp; */&lt;br&gt; + &amp;nbsp;@Inline&lt;br&gt; &amp;nbsp; public static boolean tryCompareAndSwap(Object base, Offset offset, Object testValue, Object newValue) {&lt;br&gt; &amp;nbsp; &amp;nbsp; if (MemoryManagerConstants.NEEDS_WRITE_BARRIER) {&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; return MemoryManager.tryCompareAndSwapWriteBarrier(base, offset, testValue, newValue);&lt;br&gt; &lt;br&gt; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/ThinLock.java&lt;br&gt; ===================================================================&lt;br&gt; --- rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/ThinLock.java		 2009-05-07 20:08:18 UTC (rev 15684)&lt;br&gt; +++ rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/ThinLock.java		 2009-05-07 22:40:00 UTC (rev 15685)&lt;br&gt; @@ -14,16 +14,13 @@&lt;br&gt; &lt;br&gt; import org.jikesrvm.VM;&lt;br&gt; import org.jikesrvm.Services;&lt;br&gt; -import org.jikesrvm.classloader.RVMMethod;&lt;br&gt; -import org.jikesrvm.compilers.common.CompiledMethods;&lt;br&gt; import org.jikesrvm.objectmodel.ThinLockConstants;&lt;br&gt; import org.jikesrvm.runtime.Magic;&lt;br&gt; -import org.vmmagic.pragma.Entrypoint;&lt;br&gt; import org.vmmagic.pragma.Inline;&lt;br&gt; import org.vmmagic.pragma.NoInline;&lt;br&gt; +import org.vmmagic.pragma.NoNullCheck;&lt;br&gt; import org.vmmagic.pragma.Uninterruptible;&lt;br&gt; import org.vmmagic.pragma.Unpreemptible;&lt;br&gt; -import org.vmmagic.unboxed.Address;&lt;br&gt; import org.vmmagic.unboxed.Offset;&lt;br&gt; import org.vmmagic.unboxed.Word;&lt;br&gt; &lt;br&gt; @@ -33,10 +30,218 @@&lt;br&gt; @Uninterruptible&lt;br&gt; public final class ThinLock implements ThinLockConstants {&lt;br&gt; &lt;br&gt; - &amp;nbsp;////////////////////////////////////////&lt;br&gt; - &amp;nbsp;/// Support for light-weight locking ///&lt;br&gt; - &amp;nbsp;////////////////////////////////////////&lt;br&gt; + &amp;nbsp;@Inline&lt;br&gt; + &amp;nbsp;@NoNullCheck&lt;br&gt; + &amp;nbsp;@Unpreemptible&lt;br&gt; + &amp;nbsp;public static void inlineLock(Object o, Offset lockOffset) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;Word old = Magic.prepareWord(o, lockOffset); // FIXME: bad for PPC?&lt;br&gt; + &amp;nbsp; &amp;nbsp;Word id = old.and(TL_THREAD_ID_MASK.or(TL_STAT_MASK));&lt;br&gt; + &amp;nbsp; &amp;nbsp;Word tid = Word.fromIntSignExtend(RVMThread.getCurrentThread().getLockingId());&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (id.EQ(tid)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Word changed = old.toAddress().plus(TL_LOCK_COUNT_UNIT).toWord();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!changed.and(TL_LOCK_COUNT_MASK).isZero()) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.setWordAtOffset(o, lockOffset, changed);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp;} else if (id.EQ(TL_STAT_THIN)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;// lock is thin and not held by anyone&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Magic.attemptWord(o, lockOffset, old, old.or(tid))) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.isync();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp;lock(o, lockOffset);&lt;br&gt; + &amp;nbsp;}&lt;br&gt; &lt;br&gt; + &amp;nbsp;@Inline&lt;br&gt; + &amp;nbsp;@NoNullCheck&lt;br&gt; + &amp;nbsp;@Unpreemptible&lt;br&gt; + &amp;nbsp;public static void inlineUnlock(Object o, Offset lockOffset) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;Word old = Magic.prepareWord(o, lockOffset); // FIXME: bad for PPC?&lt;br&gt; + &amp;nbsp; &amp;nbsp;Word id = old.and(TL_THREAD_ID_MASK.or(TL_STAT_MASK));&lt;br&gt; + &amp;nbsp; &amp;nbsp;Word tid = Word.fromIntSignExtend(RVMThread.getCurrentThread().getLockingId());&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (id.EQ(tid)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!old.and(TL_LOCK_COUNT_MASK).isZero()) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.setWordAtOffset(&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;o, lockOffset,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;old.toAddress().minus(TL_LOCK_COUNT_UNIT).toWord());&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp;} else if (old.xor(tid).rshl(TL_LOCK_COUNT_SHIFT).EQ(TL_STAT_THIN.rshl(TL_LOCK_COUNT_SHIFT))) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.sync();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Magic.attemptWord(o, lockOffset, old, old.and(TL_UNLOCK_MASK).or(TL_STAT_THIN))) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp;unlock(o, lockOffset);&lt;br&gt; + &amp;nbsp;}&lt;br&gt; +&lt;br&gt; + &amp;nbsp;@NoInline&lt;br&gt; + &amp;nbsp;@NoNullCheck&lt;br&gt; + &amp;nbsp;@Unpreemptible&lt;br&gt; + &amp;nbsp;public static void lock(Object o, Offset lockOffset) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (STATS) fastLocks++;&lt;br&gt; +&lt;br&gt; + &amp;nbsp; &amp;nbsp;Word threadId = Word.fromIntZeroExtend(RVMThread.getCurrentThread().getLockingId());&lt;br&gt; +&lt;br&gt; + &amp;nbsp; &amp;nbsp;for (int cnt=0;;cnt++) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Word old = Magic.getWordAtOffset(o, lockOffset);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Word stat = old.and(TL_STAT_MASK);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;boolean tryToInflate=false;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (stat.EQ(TL_STAT_BIASABLE)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word id = old.and(TL_THREAD_ID_MASK);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (id.isZero()) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// lock is unbiased, bias it in our favor and grab it&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Synchronization.tryCompareAndSwap(&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;o, lockOffset,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;old,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;old.or(threadId).toAddress().plus(TL_LOCK_COUNT_UNIT).toWord())) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.isync();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (id.EQ(threadId)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// lock is biased in our favor&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word changed = old.toAddress().plus(TL_LOCK_COUNT_UNIT).toWord();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!changed.and(TL_LOCK_COUNT_MASK).isZero()) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.setWordAtOffset(o, lockOffset, changed);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tryToInflate=true;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (casFromBiased(o, lockOffset, old, biasBitsToThinBits(old), cnt)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;continue; // don't spin, since it's thin now&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (stat.EQ(TL_STAT_THIN)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word id = old.and(TL_THREAD_ID_MASK);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (id.isZero()) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Synchronization.tryCompareAndSwap(&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;o, lockOffset, old, old.or(threadId))) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.isync();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (id.EQ(threadId)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word changed = old.toAddress().plus(TL_LOCK_COUNT_UNIT).toWord();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (changed.and(TL_LOCK_COUNT_MASK).isZero()) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tryToInflate=true;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (Synchronization.tryCompareAndSwap(&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; o, lockOffset, old, changed)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.isync();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (cnt&gt;retryLimit) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tryToInflate=true;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(stat.EQ(TL_STAT_FAT));&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// lock is fat. &amp;nbsp;contend on it.&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Lock.getLock(getLockIndex(old)).lockHeavy(o)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; +&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (tryToInflate) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (STATS) slowLocks++;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// the lock is not fat, is owned by someone else, or else the count wrapped.&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// attempt to inflate it (this may fail, in which case we'll just harmlessly&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// loop around) and lock it (may also fail, if we get the wrong lock). &amp;nbsp;if it&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// succeeds, we're done.&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// NB: this calls into our attemptToMarkInflated() method, which will do the&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Right Thing if the lock is biased to someone else.&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (inflateAndLock(o, lockOffset)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.yield();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp;}&lt;br&gt; +&lt;br&gt; + &amp;nbsp;@NoInline&lt;br&gt; + &amp;nbsp;@NoNullCheck&lt;br&gt; + &amp;nbsp;@Unpreemptible&lt;br&gt; + &amp;nbsp;public static void unlock(Object o, Offset lockOffset) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;Word threadId = Word.fromIntZeroExtend(RVMThread.getCurrentThread().getLockingId());&lt;br&gt; + &amp;nbsp; &amp;nbsp;for (int cnt=0;;cnt++) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Word old = Magic.getWordAtOffset(o, lockOffset);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Word stat = old.and(TL_STAT_MASK);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (stat.EQ(TL_STAT_BIASABLE)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word id = old.and(TL_THREAD_ID_MASK);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (id.EQ(threadId)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (old.and(TL_LOCK_COUNT_MASK).isZero()) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.raiseIllegalMonitorStateException(&quot;biased unlocking: we own this object but the count is already zero&quot;, o);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.setWordAtOffset(o, lockOffset,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;old.toAddress().minus(TL_LOCK_COUNT_UNIT).toWord());&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.raiseIllegalMonitorStateException(&quot;biased unlocking: we don't own this object&quot;, o);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (stat.EQ(TL_STAT_THIN)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.sync();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word id = old.and(TL_THREAD_ID_MASK);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (id.EQ(threadId)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word changed;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (old.and(TL_LOCK_COUNT_MASK).isZero()) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;changed=old.and(TL_UNLOCK_MASK).or(TL_STAT_THIN);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;changed=old.toAddress().minus(TL_LOCK_COUNT_UNIT).toWord();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Synchronization.tryCompareAndSwap(&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;o, lockOffset, old, changed)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (false) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;VM.sysWriteln(&quot;threadId = &quot;,threadId);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;VM.sysWriteln(&quot;id = &quot;,id);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.raiseIllegalMonitorStateException(&quot;thin unlocking: we don't own this object&quot;, o);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(stat.EQ(TL_STAT_FAT));&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// fat unlock&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Lock.getLock(getLockIndex(old)).unlockHeavy(o);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp;}&lt;br&gt; +&lt;br&gt; + &amp;nbsp;@Uninterruptible&lt;br&gt; + &amp;nbsp;@NoNullCheck&lt;br&gt; + &amp;nbsp;public static boolean holdsLock(Object o, Offset lockOffset, RVMThread thread) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;for (int cnt=0;;++cnt) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;int tid = thread.getLockingId();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Word bits = Magic.getWordAtOffset(o, lockOffset);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (bits.and(TL_STAT_MASK).EQ(TL_STAT_BIASABLE)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// if locked, then it is locked with a thin lock&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bits.and(TL_THREAD_ID_MASK).toInt() == tid &amp;amp;&amp;amp;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!bits.and(TL_LOCK_COUNT_MASK).isZero();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (bits.and(TL_STAT_MASK).EQ(TL_STAT_THIN)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return bits.and(TL_THREAD_ID_MASK).toInt()==tid;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(bits.and(TL_STAT_MASK).EQ(TL_STAT_FAT));&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// if locked, then it is locked with a fat lock&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Lock l=Lock.getLock(getLockIndex(bits));&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (l!=null) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;l.mutex.lock();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;boolean result = (l.getOwnerId()==tid &amp;amp;&amp;amp; l.getLockedObject()==o);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;l.mutex.unlock();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return result;&lt;/tt&gt;&lt;br&gt; &lt;tt&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.yield();&lt;br&gt; + &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp;}&lt;br&gt; +&lt;br&gt; + &amp;nbsp;@Inline&lt;br&gt; + &amp;nbsp;@Uninterruptible&lt;br&gt; + &amp;nbsp;public static boolean isFat(Word lockWord) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;return lockWord.and(TL_STAT_MASK).EQ(TL_STAT_FAT);&lt;br&gt; + &amp;nbsp;}&lt;br&gt; +&lt;br&gt; &amp;nbsp; /**&lt;br&gt; &amp;nbsp; &amp;nbsp;* Return the lock index for a given lock word. &amp;nbsp;Assert valid index&lt;br&gt; &amp;nbsp; &amp;nbsp;* ranges, that the fat lock bit is set, and that the lock entry&lt;br&gt; @@ -46,7 +251,8 @@&lt;br&gt; &amp;nbsp; &amp;nbsp;* @return the lock index corresponding to the lock workd.&lt;br&gt; &amp;nbsp; &amp;nbsp;*/&lt;br&gt; &amp;nbsp; @Inline&lt;br&gt; - &amp;nbsp;private static int getLockIndex(Word lockWord) {&lt;br&gt; + &amp;nbsp;@Uninterruptible&lt;br&gt; + &amp;nbsp;public static int getLockIndex(Word lockWord) {&lt;br&gt; &amp;nbsp; &amp;nbsp; int index = lockWord.and(TL_LOCK_ID_MASK).rshl(TL_LOCK_ID_SHIFT).toInt();&lt;br&gt; &amp;nbsp; &amp;nbsp; if (VM.VerifyAssertions) {&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (!(index &gt; 0 &amp;amp;&amp;amp; index &amp;lt; Lock.numLocks())) {&lt;br&gt; @@ -56,180 +262,288 @@&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; VM.sysWriteln();&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; VM._assert(index &gt; 0 &amp;amp;&amp;amp; index &amp;lt; Lock.numLocks()); &amp;nbsp;// index is in range&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;VM._assert(!lockWord.and(TL_FAT_LOCK_MASK).isZero()); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// fat lock bit is set&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;VM._assert(Lock.getLock(index) != null); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // the lock is actually there&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;VM._assert(lockWord.and(TL_STAT_MASK).EQ(TL_STAT_FAT)); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// fat lock bit is set&lt;br&gt; &amp;nbsp; &amp;nbsp; }&lt;br&gt; &amp;nbsp; &amp;nbsp; return index;&lt;br&gt; &amp;nbsp; }&lt;br&gt; &lt;br&gt; - &amp;nbsp;/**&lt;br&gt; - &amp;nbsp; * Obtains a lock on the indicated object. &amp;nbsp;Abbreviated light-weight&lt;br&gt; - &amp;nbsp; * locking sequence inlined by the optimizing compiler for the&lt;br&gt; - &amp;nbsp; * prologue of synchronized methods and for the&lt;br&gt; - &amp;nbsp; * &amp;lt;code&gt;monitorenter&amp;lt;/code&gt; bytecode.&lt;br&gt; - &amp;nbsp; *&lt;br&gt; - &amp;nbsp; * @param o the object to be locked&lt;br&gt; - &amp;nbsp; * @param lockOffset the offset of the thin lock word in the object.&lt;br&gt; - &amp;nbsp; * @see org.jikesrvm.compilers.opt.hir2lir.ExpandRuntimeServices&lt;br&gt; - &amp;nbsp; */&lt;br&gt; &amp;nbsp; @Inline&lt;br&gt; - &amp;nbsp;@Entrypoint&lt;br&gt; - &amp;nbsp;@Unpreemptible(&quot;Become another thread when lock is contended, don't preempt in other cases&quot;)&lt;br&gt; - &amp;nbsp;static void inlineLock(Object o, Offset lockOffset) {&lt;br&gt; - &amp;nbsp; &amp;nbsp;Word old = Magic.prepareWord(o, lockOffset);&lt;br&gt; - &amp;nbsp; &amp;nbsp;if (old.rshl(TL_THREAD_ID_SHIFT).isZero()) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;// implies that fatbit == 0 &amp;amp; threadid == 0&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;int threadId = RVMThread.getCurrentThread().getLockingId();&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Magic.attemptWord(o, lockOffset, old, old.or(Word.fromIntZeroExtend(threadId)))) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.isync(); // don't use stale prefetched data in monitor&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (STATS) fastLocks++;&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // common case: o is now locked&lt;br&gt; + &amp;nbsp;@Uninterruptible&lt;br&gt; + &amp;nbsp;public static int getLockOwner(Word lockWord) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(!isFat(lockWord));&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (lockWord.and(TL_STAT_MASK).EQ(TL_STAT_BIASABLE)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (lockWord.and(TL_LOCK_COUNT_MASK).isZero()) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return 0;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return lockWord.and(TL_THREAD_ID_MASK).toInt();&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt; + &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;return lockWord.and(TL_THREAD_ID_MASK).toInt();&lt;br&gt; &amp;nbsp; &amp;nbsp; }&lt;br&gt; - &amp;nbsp; &amp;nbsp;lock(o, lockOffset); // uncommon case: default to out-of-line lock()&lt;br&gt; &amp;nbsp; }&lt;br&gt; &lt;br&gt; - &amp;nbsp;/**&lt;br&gt; - &amp;nbsp; * Releases the lock on the indicated object. &amp;nbsp;Abreviated&lt;br&gt; - &amp;nbsp; * light-weight unlocking sequence inlined by the optimizing&lt;br&gt; - &amp;nbsp; * compiler for the epilogue of synchronized methods and for the&lt;br&gt; - &amp;nbsp; * &amp;lt;code&gt;monitorexit&amp;lt;/code&gt; bytecode.&lt;br&gt; - &amp;nbsp; *&lt;br&gt; - &amp;nbsp; * @param o the object to be unlocked&lt;br&gt; - &amp;nbsp; * @param lockOffset the offset of the thin lock word in the object.&lt;br&gt; - &amp;nbsp; * @see org.jikesrvm.compilers.opt.hir2lir.ExpandRuntimeServices&lt;br&gt; - &amp;nbsp; */&lt;br&gt; &amp;nbsp; @Inline&lt;br&gt; - &amp;nbsp;@Entrypoint&lt;br&gt; - &amp;nbsp;@Unpreemptible(&quot;No preemption normally, but may raise exceptions&quot;)&lt;br&gt; - &amp;nbsp;static void inlineUnlock(Object o, Offset lockOffset) {&lt;br&gt; - &amp;nbsp; &amp;nbsp;Word old = Magic.prepareWord(o, lockOffset);&lt;br&gt; - &amp;nbsp; &amp;nbsp;Word threadId = Word.fromIntZeroExtend(RVMThread.getCurrentThread().getLockingId());&lt;br&gt; - &amp;nbsp; &amp;nbsp;if (old.xor(threadId).rshl(TL_LOCK_COUNT_SHIFT).isZero()) { // implies that fatbit == 0 &amp;amp;&amp;amp; count == 0 &amp;amp;&amp;amp; lockid == me&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.sync(); // memory barrier: subsequent locker will see previous writes&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Magic.attemptWord(o, lockOffset, old, old.and(TL_UNLOCK_MASK))) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return; // common case: o is now unlocked&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp;@Uninterruptible&lt;br&gt; + &amp;nbsp;public static int getRecCount(Word lockWord) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(getLockOwner(lockWord)!=0);&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (lockWord.and(TL_STAT_MASK).EQ(TL_STAT_BIASABLE)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;return lockWord.and(TL_LOCK_COUNT_MASK).rshl(TL_LOCK_COUNT_SHIFT).toInt();&lt;br&gt; + &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;return lockWord.and(TL_LOCK_COUNT_MASK).rshl(TL_LOCK_COUNT_SHIFT).toInt()+1;&lt;br&gt; &amp;nbsp; &amp;nbsp; }&lt;br&gt; - &amp;nbsp; &amp;nbsp;unlock(o, lockOffset); &amp;nbsp;// uncommon case: default to non inlined unlock()&lt;br&gt; &amp;nbsp; }&lt;br&gt; &lt;br&gt; - &amp;nbsp;/**&lt;br&gt; - &amp;nbsp; * O btains a lock on the indicated object. &amp;nbsp;Light-weight locking&lt;br&gt; - &amp;nbsp; * sequence for the prologue of synchronized methods and for the&lt;br&gt; - &amp;nbsp; * &amp;lt;code&gt;monitorenter&amp;lt;/code&gt; bytecode.&lt;br&gt; - &amp;nbsp; *&lt;br&gt; - &amp;nbsp; * @param o the object to be locked&lt;br&gt; - &amp;nbsp; * @param lockOffset the offset of the thin lock word in the object.&lt;br&gt; - &amp;nbsp; */&lt;br&gt; &amp;nbsp; @NoInline&lt;br&gt; - &amp;nbsp;@Unpreemptible(&quot;Become another thread when lock is contended, don't preempt in other cases&quot;)&lt;br&gt; - &amp;nbsp;public static void lock(Object o, Offset lockOffset) {&lt;br&gt; - &amp;nbsp; &amp;nbsp;major:&lt;br&gt; - &amp;nbsp; &amp;nbsp;while (true) { // repeat only if attempt to lock a promoted lock fails&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;int retries = retryLimit;&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;Word threadId = Word.fromIntZeroExtend(RVMThread.getCurrentThread().getLockingId());&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;while (0 != retries--) { // repeat if there is contention for thin lock&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word old = Magic.prepareWord(o, lockOffset);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word id = old.and(TL_THREAD_ID_MASK.or(TL_FAT_LOCK_MASK));&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (id.isZero()) { // o isn't locked&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Magic.attemptWord(o, lockOffset, old, old.or(threadId))) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.isync(); // don't use stale prefetched data in monitor&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (STATS) slowLocks++;&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break major; &amp;nbsp;// lock succeeds&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;continue; // contention, possibly spurious, try again&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (id.EQ(threadId)) { // this thread has o locked already&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word changed = old.toAddress().plus(TL_LOCK_COUNT_UNIT).toWord(); // update count&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (changed.and(TL_LOCK_COUNT_MASK).isZero()) { // count wrapped around (most unlikely), make heavy lock&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;while (!inflateAndLock(o, lockOffset)) { // wait for a lock to become available&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.yield();&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break major; &amp;nbsp;// lock succeeds (note that lockHeavy has issued an isync)&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Magic.attemptWord(o, lockOffset, old, changed)) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.isync(); // don't use stale prefetched data in monitor !!TODO: is this isync required?&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (STATS) slowLocks++;&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break major; &amp;nbsp;// lock succeeds&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;continue; // contention, probably spurious, try again (TODO!! worry about this)&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp;@Unpreemptible&lt;br&gt; + &amp;nbsp;public static boolean casFromBiased(Object o, Offset lockOffset,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word oldLockWord, Word changed,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int cnt) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;RVMThread me=RVMThread.getCurrentThread();&lt;br&gt; + &amp;nbsp; &amp;nbsp;Word id=oldLockWord.and(TL_THREAD_ID_MASK);&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (id.isZero()) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (false) VM.sysWriteln(&quot;id is zero - easy case.&quot;);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;return Synchronization.tryCompareAndSwap(o, lockOffset, oldLockWord, changed);&lt;br&gt; + &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (false) VM.sysWriteln(&quot;id = &quot;,id);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;int slot=id.toInt()&gt;&gt;TL_THREAD_ID_SHIFT;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (false) VM.sysWriteln(&quot;slot = &quot;,slot);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread owner=RVMThread.threadBySlot[slot];&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (owner==me /* I own it, so I can unbias it trivially. &amp;nbsp;This occurs&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; when we are inflating due to, for example, wait() */ ||&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;owner==null /* the thread that owned it is dead, so it's safe to&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; unbias. */) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// note that we use a CAS here, but it's only needed in the case&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// that owner==null, since in that case some other thread may also&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// be unbiasing.&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return Synchronization.tryCompareAndSwap(&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;o, lockOffset, oldLockWord, changed);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;boolean result=false;&lt;br&gt; &lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!(old.and(TL_FAT_LOCK_MASK).isZero())) { // o has a heavy lock&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int index = getLockIndex(old);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Lock.getLock(index).lockHeavy(o)) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break major; // lock succeeds (note that lockHeavy has issued an isync)&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// heavy lock failed (deflated or contention for system lock)&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.yield();&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;continue major; &amp;nbsp; &amp;nbsp;// try again&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// real contention: wait (hope other thread unlocks o), try again&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (traceContention) { // for performance tuning only (see section 5)&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Address fp = Magic.getFramePointer();&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fp = Magic.getCallerFramePointer(fp);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int mid = Magic.getCompiledMethodID(fp);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMMethod m1 = CompiledMethods.getCompiledMethod(mid).getMethod();&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fp = Magic.getCallerFramePointer(fp);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mid = Magic.getCompiledMethodID(fp);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMMethod m2 = CompiledMethods.getCompiledMethod(mid).getMethod();&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String s = m1.getDeclaringClass() + &quot;.&quot; + m1.getName() + &quot; &quot; + m2.getDeclaringClass() + &quot;.&quot; + m2.getName();&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.trace(Magic.getObjectType(o).toString(), s, -2 - retries);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (0 != retries) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.yield(); // wait, hope o gets unlocked&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// NB. this may stop a thread other than the one that had the bias,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// if that thread died and some other thread took its slot. &amp;nbsp;that's&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// why we do a CAS below. &amp;nbsp;it's only needed if some other thread&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// had seen the owner be null (which may happen if we came here after&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// a new thread took the slot while someone else came here when the&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// slot was still null). &amp;nbsp;if it was the case that everyone else had&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// seen a non-null owner, then the pair handshake would serve as&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// sufficient synchronization (the id would identify the set of threads&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// that shared that id's communicationLock). &amp;nbsp;oddly, that means that&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// this whole thing could be &quot;simplified&quot; to acquire the&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// communicationLock even if the owner was null. &amp;nbsp;but that would be&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// goofy.&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (false) VM.sysWriteln(&quot;entering pair handshake&quot;);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;owner.beginPairHandshake();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (false) VM.sysWriteln(&quot;done with that&quot;);&lt;br&gt; +&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word newLockWord=Magic.getWordAtOffset(o, lockOffset);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result=Synchronization.tryCompareAndSwap(&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;o, lockOffset, oldLockWord, changed);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;owner.endPairHandshake();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (false) VM.sysWriteln(&quot;that worked.&quot;);&lt;br&gt; +&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return result;&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;// create a heavy lock for o and lock it&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;if (inflateAndLock(o, lockOffset)) break;&lt;br&gt; &amp;nbsp; &amp;nbsp; }&lt;br&gt; - &amp;nbsp; &amp;nbsp;// o has been locked, must return before an exception can be thrown&lt;br&gt; &amp;nbsp; }&lt;br&gt; &lt;br&gt; + &amp;nbsp;@Inline&lt;br&gt; + &amp;nbsp;@Unpreemptible&lt;br&gt; + &amp;nbsp;public static boolean attemptToMarkInflated(Object o, Offset lockOffset,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word oldLockWord,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int lockId,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int cnt) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(oldLockWord.and(TL_STAT_MASK).NE(TL_STAT_FAT));&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (false) VM.sysWriteln(&quot;attemptToMarkInflated with oldLockWord = &quot;,oldLockWord);&lt;br&gt; + &amp;nbsp; &amp;nbsp;// what this needs to do:&lt;br&gt; + &amp;nbsp; &amp;nbsp;// 1) if the lock is thin, it's just a CAS&lt;br&gt; + &amp;nbsp; &amp;nbsp;// 2) if the lock is unbiased, CAS in the inflation&lt;br&gt; + &amp;nbsp; &amp;nbsp;// 3) if the lock is biased in our favor, store the lock without CAS&lt;br&gt; + &amp;nbsp; &amp;nbsp;// 4) if the lock is biased but to someone else, enter the pair handshake&lt;br&gt; + &amp;nbsp; &amp;nbsp;// &amp;nbsp; &amp;nbsp;to unbias it and install the inflated lock&lt;br&gt; + &amp;nbsp; &amp;nbsp;Word changed=&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;TL_STAT_FAT.or(Word.fromIntZeroExtend(lockId).lsh(TL_LOCK_ID_SHIFT))&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;.or(oldLockWord.and(TL_UNLOCK_MASK));&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (false &amp;amp;&amp;amp; oldLockWord.and(TL_STAT_MASK).EQ(TL_STAT_THIN))&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;VM.sysWriteln(&quot;obj = &quot;,Magic.objectAsAddress(o),&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&quot;, old = &quot;,oldLockWord,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&quot;, owner = &quot;,getLockOwner(oldLockWord),&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&quot;, rec = &quot;,getLockOwner(oldLockWord)==0?0:getRecCount(oldLockWord),&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&quot;, changed = &quot;,changed,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&quot;, lockId = &quot;,lockId);&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (false) VM.sysWriteln(&quot;changed = &quot;,changed);&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (oldLockWord.and(TL_STAT_MASK).EQ(TL_STAT_THIN)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (false) VM.sysWriteln(&quot;it's thin, inflating the easy way.&quot;);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;return Synchronization.tryCompareAndSwap(&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;o, lockOffset, oldLockWord, changed);&lt;br&gt; + &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;return casFromBiased(o, lockOffset, oldLockWord, changed, cnt);&lt;br&gt; + &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp;}&lt;br&gt; +&lt;br&gt; &amp;nbsp; /**&lt;br&gt; - &amp;nbsp; * Releases the lock on the indicated object. &amp;nbsp; Light-weight unlocking&lt;br&gt; - &amp;nbsp; * sequence for the epilogue of synchronized methods and for the&lt;br&gt; - &amp;nbsp; * &amp;lt;code&gt;monitorexit&amp;lt;/code&gt; bytecode.&lt;br&gt; + &amp;nbsp; * Promotes a light-weight lock to a heavy-weight lock. &amp;nbsp;If this returns the lock&lt;br&gt; + &amp;nbsp; * that you gave it, its mutex will be locked; otherwise, its mutex will be unlocked.&lt;br&gt; + &amp;nbsp; * Hence, calls to this method should always be followed by a condition lock() or&lt;br&gt; + &amp;nbsp; * unlock() call.&lt;br&gt; &amp;nbsp; &amp;nbsp;*&lt;br&gt; - &amp;nbsp; * @param o the object to be locked&lt;br&gt; + &amp;nbsp; * @param o the object to get a heavy-weight lock&lt;br&gt; &amp;nbsp; &amp;nbsp;* @param lockOffset the offset of the thin lock word in the object.&lt;br&gt; + &amp;nbsp; * @return the inflated lock; either the one you gave, or another one, if the lock&lt;br&gt; + &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; was inflated by some other thread.&lt;br&gt; &amp;nbsp; &amp;nbsp;*/&lt;br&gt; - &amp;nbsp;@NoInline&lt;br&gt; - &amp;nbsp;@Unpreemptible(&quot;No preemption normally, but may raise exceptions&quot;)&lt;br&gt; - &amp;nbsp;public static void unlock(Object o, Offset lockOffset) {&lt;br&gt; - &amp;nbsp; &amp;nbsp;Magic.sync(); // prevents stale data from being seen by next owner of the lock&lt;br&gt; - &amp;nbsp; &amp;nbsp;while (true) { // spurious contention detected&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;Word old = Magic.prepareWord(o, lockOffset);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;Word id = old.and(TL_THREAD_ID_MASK.or(TL_FAT_LOCK_MASK));&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;Word threadId = Word.fromIntZeroExtend(RVMThread.getCurrentThread().getLockingId());&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;if (id.NE(threadId)) { // not normal case&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!(old.and(TL_FAT_LOCK_MASK).isZero())) { // o has a heavy lock&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Lock.getLock(getLockIndex(old)).unlockHeavy(o);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// note that unlockHeavy has issued a sync&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;br&gt; + &amp;nbsp;@NoNullCheck&lt;br&gt; + &amp;nbsp;@Unpreemptible&lt;br&gt; + &amp;nbsp;protected static Lock attemptToInflate(Object o,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Offset lockOffset,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Lock l) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (false) VM.sysWriteln(&quot;l = &quot;,Magic.objectAsAddress(l));&lt;br&gt; + &amp;nbsp; &amp;nbsp;l.mutex.lock();&lt;br&gt; + &amp;nbsp; &amp;nbsp;for (int cnt=0;;++cnt) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Word bits = Magic.getWordAtOffset(o, lockOffset);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;// check to see if another thread has already created a fat lock&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (isFat(bits)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (trace) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;VM.sysWriteln(&quot;Thread #&quot;,RVMThread.getCurrentThreadSlot(),&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&quot;: freeing lock &quot;,Magic.objectAsAddress(l),&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&quot; because we had a double-inflate&quot;);&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.trace(&quot;Lock&quot;, &quot;unlock error: thin lock word = &quot;, old.toAddress());&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.trace(&quot;Lock&quot;, &quot;unlock error: thin lock word = &quot;, Magic.objectAsAddress(o));&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// RVMThread.trace(&quot;Lock&quot;, RVMThread.getCurrentThread().toString(), 0);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.raiseIllegalMonitorStateException(&quot;thin unlocking&quot;, o);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Lock result = Lock.getLock(getLockIndex(bits));&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (result==null ||&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result.lockedObject!=o) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;continue; /* this is nasty. &amp;nbsp;this will happen when a lock&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; is deflated. */&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Lock.free(l);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;l.mutex.unlock();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return result;&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;if (old.and(TL_LOCK_COUNT_MASK).isZero()) { // get count, 0 is the last lock&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word changed = old.and(TL_UNLOCK_MASK);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Magic.attemptWord(o, lockOffset, old, changed)) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return; // unlock succeeds&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(l!=null);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (attemptToMarkInflated(&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;o, lockOffset, bits, l.index, cnt)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;l.setLockedObject(o);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;l.setOwnerId(getLockOwner(bits));&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (l.getOwnerId() != 0) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;l.setRecursionCount(getRecCount(bits));&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(l.getRecursionCount()==0);&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;continue;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return l;&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;// more than one lock&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;// decrement recursion count&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;Word changed = old.toAddress().minus(TL_LOCK_COUNT_UNIT).toWord();&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Magic.attemptWord(o, lockOffset, old, changed)) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return; // unlock succeeds&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;// contention detected, try again&lt;br&gt; + &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp;}&lt;br&gt; +&lt;br&gt; + &amp;nbsp;@Inline&lt;br&gt; + &amp;nbsp;@Uninterruptible&lt;br&gt; + &amp;nbsp;private static Word biasBitsToThinBits(Word bits) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;int lockOwner=getLockOwner(bits);&lt;br&gt; +&lt;br&gt; + &amp;nbsp; &amp;nbsp;Word changed=bits.and(TL_UNLOCK_MASK).or(TL_STAT_THIN);&lt;br&gt; +&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (lockOwner!=0) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;int recCount=getRecCount(bits);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;changed=changed&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.or(Word.fromIntZeroExtend(lockOwner))&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.or(Word.fromIntZeroExtend(recCount-1).lsh(TL_LOCK_COUNT_SHIFT));&lt;br&gt; + &amp;nbsp; &amp;nbsp;}&lt;br&gt; +&lt;br&gt; + &amp;nbsp; &amp;nbsp;return changed;&lt;br&gt; + &amp;nbsp;}&lt;br&gt; +&lt;br&gt; + &amp;nbsp;@Inline&lt;br&gt; + &amp;nbsp;@Uninterruptible&lt;br&gt; + &amp;nbsp;public static boolean attemptToMarkDeflated(Object o, Offset lockOffset,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word oldLockWord) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;// we allow concurrent modification of the lock word when it's thin or fat.&lt;br&gt; + &amp;nbsp; &amp;nbsp;Word changed=oldLockWord.and(TL_UNLOCK_MASK).or(TL_STAT_THIN);&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(getLockOwner(changed)==0);&lt;br&gt; + &amp;nbsp; &amp;nbsp;return Synchronization.tryCompareAndSwap(&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;o, lockOffset, oldLockWord, changed);&lt;br&gt; + &amp;nbsp;}&lt;br&gt; +&lt;br&gt; + &amp;nbsp;@Uninterruptible&lt;br&gt; + &amp;nbsp;public static void markDeflated(Object o, Offset lockOffset, int id) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;for (;;) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Word bits=Magic.getWordAtOffset(o, lockOffset);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(isFat(bits));&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(getLockIndex(bits)==id);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (attemptToMarkDeflated(o, lockOffset, bits)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt; &amp;nbsp; &amp;nbsp; }&lt;br&gt; &amp;nbsp; }&lt;br&gt; &lt;br&gt; + &amp;nbsp;@NoNullCheck&lt;br&gt; + &amp;nbsp;@Unpreemptible&lt;br&gt; + &amp;nbsp;public static boolean lockHeader(Object o, Offset lockOffset) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;// what this should do:&lt;br&gt; + &amp;nbsp; &amp;nbsp;// 1) take advantage of the fact that if a lock is fat it can only go back to&lt;br&gt; + &amp;nbsp; &amp;nbsp;// &amp;nbsp; &amp;nbsp;being thin, so concurrent modification of the lock word is allowed.&lt;br&gt; + &amp;nbsp; &amp;nbsp;// 2) if it's biased, we own it anyway so we can &quot;lock&quot; it by incrementing the&lt;br&gt; + &amp;nbsp; &amp;nbsp;// &amp;nbsp; &amp;nbsp;count.&lt;br&gt; + &amp;nbsp; &amp;nbsp;Word threadId = Word.fromIntZeroExtend(RVMThread.getCurrentThread().getLockingId());&lt;br&gt; + &amp;nbsp; &amp;nbsp;for (;;) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;boolean attemptToInflate=false;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Word old=Magic.getWordAtOffset(o,lockOffset);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (old.and(TL_STAT_MASK).NE(TL_STAT_BIASABLE)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(old.and(TL_STAT_MASK).EQ(TL_STAT_THIN) ||&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;old.and(TL_STAT_MASK).EQ(TL_STAT_FAT));&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return false;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word id = old.and(TL_THREAD_ID_MASK);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// what do we do here? &amp;nbsp;if we have the bias, then it's easy. &amp;nbsp;but what&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// if we don't? &amp;nbsp;in that case we need to be ultra-careful. &amp;nbsp;what we can&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// do:&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// 1) if the lock is biased in our favor, then lock it&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// 2) if the lock is unbiased, then bias it in our favor an lock it&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// 3) if the lock is biased in someone else's favor, inflate it (so we can go above)&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (id.isZero()) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// lock is unbiased, bias it in our favor and grab it&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Synchronization.tryCompareAndSwap(&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;o, lockOffset,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;old,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;old.or(threadId).toAddress().plus(TL_LOCK_COUNT_UNIT).toWord())) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.isync();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return true;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (id.EQ(threadId)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// lock is biased in our favor, so grab it&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word changed = old.toAddress().plus(TL_LOCK_COUNT_UNIT).toWord();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!changed.and(TL_LOCK_COUNT_MASK).isZero()) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.setWordAtOffset(o, lockOffset, changed);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return true;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;attemptToInflate=true;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;attemptToInflate=true;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; +&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (attemptToInflate) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;inflate(o,lockOffset);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp;}&lt;br&gt; +&lt;br&gt; + &amp;nbsp;@NoNullCheck&lt;br&gt; + &amp;nbsp;@Unpreemptible&lt;br&gt; + &amp;nbsp;public static void unlockHeader(Object o, Offset lockOffset,boolean lockHeaderResult) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;// what to do here?&lt;br&gt; + &amp;nbsp; &amp;nbsp;// 1) if lockHeaderResult is false, we're done&lt;br&gt; + &amp;nbsp; &amp;nbsp;// 2) if lockHeaderResult is true, release the lock.&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (lockHeaderResult) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;unlock(o, lockOffset);&lt;br&gt; + &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp;}&lt;br&gt; +&lt;br&gt; + &amp;nbsp;@Inline&lt;br&gt; + &amp;nbsp;@Uninterruptible&lt;br&gt; + &amp;nbsp;public static boolean allowHeaderCAS(Object o, Offset lockOffset) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;return Magic.getWordAtOffset(o,lockOffset).and(TL_STAT_MASK).NE(TL_STAT_BIASABLE);&lt;br&gt; + &amp;nbsp;}&lt;br&gt; +&lt;br&gt; &amp;nbsp; ////////////////////////////////////////////////////////////////&lt;br&gt; &amp;nbsp; /// Support for inflating (and deflating) heavy-weight locks ///&lt;br&gt; &amp;nbsp; ////////////////////////////////////////////////////////////////&lt;br&gt; @@ -246,11 +560,6 @@&lt;br&gt; &amp;nbsp; &amp;nbsp;*/&lt;br&gt; &amp;nbsp; @Unpreemptible&lt;br&gt; &amp;nbsp; private static Lock inflate(Object o, Offset lockOffset) {&lt;br&gt; - &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;VM._assert(holdsLock(o, lockOffset, RVMThread.getCurrentThread()));&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;// this assertions is just plain wrong.&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;//VM._assert((Magic.getWordAtOffset(o, lockOffset).and(TL_FAT_LOCK_MASK).isZero()));&lt;br&gt; - &amp;nbsp; &amp;nbsp;}&lt;br&gt; &amp;nbsp; &amp;nbsp; Lock l = Lock.allocate();&lt;br&gt; &amp;nbsp; &amp;nbsp; if (VM.VerifyAssertions) {&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; VM._assert(l != null); // inflate called by wait (or notify) which shouldn't be called during GC&lt;br&gt; @@ -283,86 +592,6 @@&lt;br&gt; &amp;nbsp; &amp;nbsp; return l.lockHeavyLocked(o);&lt;br&gt; &amp;nbsp; }&lt;br&gt; &lt;br&gt; - &amp;nbsp;/**&lt;br&gt; - &amp;nbsp; * Promotes a light-weight lock to a heavy-weight lock.&lt;br&gt; - &amp;nbsp; *&lt;br&gt; - &amp;nbsp; * @param o the object to get a heavy-weight lock&lt;br&gt; - &amp;nbsp; * @param lockOffset the offset of the thin lock word in the object.&lt;br&gt; - &amp;nbsp; * @return whether the object was successfully locked&lt;br&gt; - &amp;nbsp; */&lt;br&gt; - &amp;nbsp;private static Lock attemptToInflate(Object o, Offset lockOffset, Lock l) {&lt;br&gt; - &amp;nbsp; &amp;nbsp;Word old;&lt;br&gt; - &amp;nbsp; &amp;nbsp;l.mutex.lock();&lt;br&gt; - &amp;nbsp; &amp;nbsp;do {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;old = Magic.prepareWord(o, lockOffset);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;// check to see if another thread has already created a fat lock&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!(old.and(TL_FAT_LOCK_MASK).isZero())) { // already a fat lock in place&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Lock.trace) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;VM.sysWriteln(&quot;Thread #&quot;,RVMThread.getCurrentThreadSlot(),&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&quot;: freeing lock &quot;,Magic.objectAsAddress(l),&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&quot; because we had a double-inflate&quot;);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Lock.free(l);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;l.mutex.unlock();&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;l = Lock.getLock(getLockIndex(old));&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return l;&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;Word locked = TL_FAT_LOCK_MASK.or(Word.fromIntZeroExtend(l.index).lsh(TL_LOCK_ID_SHIFT));&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;Word changed = locked.or(old.and(TL_UNLOCK_MASK));&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(getLockIndex(changed) == l.index);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Magic.attemptWord(o, lockOffset, old, changed)) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;l.setLockedObject(o);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;l.setOwnerId(old.and(TL_THREAD_ID_MASK).toInt());&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (l.getOwnerId() != 0) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;l.setRecursionCount(old.and(TL_LOCK_COUNT_MASK).rshl(TL_LOCK_COUNT_SHIFT).toInt() + 1);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return l;&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;// contention detected, try again&lt;br&gt; - &amp;nbsp; &amp;nbsp;} while (true);&lt;br&gt; - &amp;nbsp;}&lt;br&gt; -&lt;br&gt; - &amp;nbsp;public static void deflate(Object o, Offset lockOffset, Lock l) {&lt;br&gt; - &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;Word old = Magic.getWordAtOffset(o, lockOffset);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;VM._assert(!(old.and(TL_FAT_LOCK_MASK).isZero()));&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;VM._assert(l == Lock.getLock(getLockIndex(old)));&lt;br&gt; - &amp;nbsp; &amp;nbsp;}&lt;br&gt; - &amp;nbsp; &amp;nbsp;Word old;&lt;br&gt; - &amp;nbsp; &amp;nbsp;do {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;old = Magic.prepareWord(o, lockOffset);&lt;br&gt; - &amp;nbsp; &amp;nbsp;} while (!Magic.attemptWord(o, lockOffset, old, old.and(TL_UNLOCK_MASK)));&lt;br&gt; - &amp;nbsp;}&lt;br&gt; -&lt;br&gt; - &amp;nbsp;/**&lt;br&gt; - &amp;nbsp; * @param obj an object&lt;br&gt; - &amp;nbsp; * @param lockOffset the offset of the thin lock word in the object.&lt;br&gt; - &amp;nbsp; * @param thread a thread&lt;br&gt; - &amp;nbsp; * @return &amp;lt;code&gt;true&amp;lt;/code&gt; if the lock on obj at offset lockOffset is currently owned&lt;br&gt; - &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; by thread &amp;lt;code&gt;false&amp;lt;/code&gt; if it is not.&lt;br&gt; - &amp;nbsp; */&lt;br&gt; - &amp;nbsp;public static boolean holdsLock(Object obj, Offset lockOffset, RVMThread thread) {&lt;br&gt; - &amp;nbsp; &amp;nbsp;int tid = thread.getLockingId();&lt;br&gt; - &amp;nbsp; &amp;nbsp;Word bits = Magic.getWordAtOffset(obj, lockOffset);&lt;br&gt; - &amp;nbsp; &amp;nbsp;if (bits.and(TL_FAT_LOCK_MASK).isZero()) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;// if locked, then it is locked with a thin lock&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;return (bits.and(ThinLockConstants.TL_THREAD_ID_MASK).toInt() == tid);&lt;br&gt; - &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;// if locked, then it is locked with a fat lock&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;// but, if it's locked by someone else, the fat lock may get deflated,&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;// and then reinflated on this thread's behalf. &amp;nbsp;so we need to be careful.&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;int index = getLockIndex(bits);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;Lock l = Lock.getLock(index);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;boolean result=false;&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;if (l!=null) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;l.mutex.lock();&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result = (l.getOwnerId()==tid &amp;amp;&amp;amp; l.getLockedObject()==obj);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;l.mutex.unlock();&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;return result;&lt;br&gt; - &amp;nbsp; &amp;nbsp;}&lt;br&gt; - &amp;nbsp;}&lt;br&gt; -&lt;br&gt; &amp;nbsp; ////////////////////////////////////////////////////////////////////////////&lt;br&gt; &amp;nbsp; /// Get heavy-weight lock for an object; if thin, inflate it.&lt;br&gt; &amp;nbsp; ////////////////////////////////////////////////////////////////////////////&lt;br&gt; @@ -380,14 +609,13 @@&lt;br&gt; &amp;nbsp; @Unpreemptible&lt;br&gt; &amp;nbsp; public static Lock getHeavyLock(Object o, Offset lockOffset, boolean create) {&lt;br&gt; &amp;nbsp; &amp;nbsp; Word old = Magic.getWordAtOffset(o, lockOffset);&lt;br&gt; - &amp;nbsp; &amp;nbsp;if (!(old.and(TL_FAT_LOCK_MASK).isZero())) { // already a fat lock in place&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (isFat(old)) { // already a fat lock in place&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; return Lock.getLock(getLockIndex(old));&lt;br&gt; &amp;nbsp; &amp;nbsp; } else if (create) {&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; return inflate(o, lockOffset);&lt;br&gt; &amp;nbsp; &amp;nbsp; } else {&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; return null;&lt;br&gt; &amp;nbsp; &amp;nbsp; }&lt;br&gt; -&lt;br&gt; &amp;nbsp; }&lt;br&gt; &lt;br&gt; &amp;nbsp; ///////////////////////////////////////////////////////////////&lt;br&gt; @@ -397,22 +625,16 @@&lt;br&gt; &amp;nbsp; /**&lt;br&gt; &amp;nbsp; &amp;nbsp;* Number of times a thread yields before inflating the lock on a&lt;br&gt; &amp;nbsp; &amp;nbsp;* object to a heavy-weight lock. &amp;nbsp;The current value was for the&lt;br&gt; - &amp;nbsp; * portBOB benchmark on a 12-way SMP (AIX) in the Fall of '99. &amp;nbsp;This&lt;br&gt; - &amp;nbsp; * is almost certainly not the optimal value.&lt;br&gt; + &amp;nbsp; * portBOB benchmark on a 12-way SMP (AIX) in the Fall of '99. &amp;nbsp;FP&lt;br&gt; + &amp;nbsp; * confirmed that it's still optimal for JBB and DaCapo on 4-, 8-,&lt;br&gt; + &amp;nbsp; * and 16-way SMPs (Linux/ia32) in Spring '09.&lt;br&gt; &amp;nbsp; &amp;nbsp;*/&lt;br&gt; - &amp;nbsp;private static final int retryLimit = 40; // (-1 is effectively infinity)&lt;br&gt; + &amp;nbsp;private static final int retryLimit = 40;&lt;br&gt; &lt;br&gt; - &amp;nbsp;/**&lt;br&gt; - &amp;nbsp; * Should we trace lockContention to enable debugging?&lt;br&gt; - &amp;nbsp; */&lt;br&gt; - &amp;nbsp;private static final boolean traceContention = false;&lt;br&gt; + &amp;nbsp;static final boolean STATS = Lock.STATS;&lt;br&gt; &lt;br&gt; - &amp;nbsp;//////////////////////////////////////////////&lt;br&gt; - &amp;nbsp;// &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Statistics &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //&lt;br&gt; - &amp;nbsp;//////////////////////////////////////////////&lt;br&gt; + &amp;nbsp;static final boolean trace = false;&lt;br&gt; &lt;br&gt; - &amp;nbsp;static final boolean STATS = Lock.STATS;&lt;br&gt; -&lt;br&gt; &amp;nbsp; static int fastLocks;&lt;br&gt; &amp;nbsp; static int slowLocks;&lt;/tt&gt;&lt;br&gt; &lt;tt&gt;&amp;nbsp;&lt;br&gt; &lt;br&gt; &lt;br&gt; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.&lt;br&gt; &lt;br&gt; ------------------------------------------------------------------------------&lt;br&gt; The NEW KODAK i700 Series Scanners deliver under ANY circumstances! Your&lt;br&gt; production scanning environment may not be a perfect world - but thanks to&lt;br&gt; Kodak, there's a perfect scanner to get the job done! With the NEW KODAK i700&lt;br&gt; Series Scanner you'll get full speed at 300 dpi even with all image &lt;br&gt; processing features enabled. &lt;/tt&gt;&lt;tt&gt;&lt;a href=&quot;http://p.sf.net/sfu/kodak-com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/kodak-com&lt;/a&gt;&lt;/tt&gt;&lt;tt&gt;&lt;br&gt; _______________________________________________&lt;br&gt; Jikesrvm-commits mailing list&lt;br&gt; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=23441089&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Jikesrvm-commits@...&lt;/a&gt;&lt;br&gt; &lt;/tt&gt;&lt;tt&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/jikesrvm-commits&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/jikesrvm-commits&lt;/a&gt;&lt;/tt&gt;&lt;tt&gt;&lt;br&gt; &lt;/tt&gt;&lt;br&gt; &lt;/div&gt; ------------------------------------------------------------------------------&lt;br&gt;The NEW KODAK i700 Series Scanners deliver under ANY circumstances! Your&lt;br&gt;production scanning environment may not be a perfect world - but thanks to&lt;br&gt;Kodak, there's a perfect scanner to get the job done! With the NEW KODAK i700&lt;br&gt;Series Scanner you'll get full speed at 300 dpi even with all image &lt;br&gt;processing features enabled. &lt;a href=&quot;http://p.sf.net/sfu/kodak-com_______________________________________________&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/kodak-com_______________________________________________&lt;/a&gt;&lt;br&gt;Jikesrvm-core mailing list&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=23441089&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Jikesrvm-core@...&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&lt;/a&gt;&lt;br&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;/div&gt;------------------------------------------------------------------------------&lt;br&gt;The NEW KODAK i700 Series Scanners deliver under ANY circumstances! Your&lt;br&gt;production scanning environment may not be a perfect world - but thanks to&lt;br&gt;Kodak, there's a perfect scanner to get the job done! With the NEW KODAK i700&lt;br&gt;Series Scanner you'll get full speed at 300 dpi even with all image &lt;br&gt;processing features enabled. &lt;a href=&quot;http://p.sf.net/sfu/kodak-com_______________________________________________&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/kodak-com_______________________________________________&lt;/a&gt;&lt;br&gt;Jikesrvm-core mailing list&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=23441089&amp;i=4&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Jikesrvm-core@...&lt;/a&gt;&lt;br&gt;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&lt;br&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;/body&gt;&lt;/html&gt;&lt;br /&gt;------------------------------------------------------------------------------
&lt;br&gt;The NEW KODAK i700 Series Scanners deliver under ANY circumstances! Your
&lt;br&gt;production scanning environment may not be a perfect world - but thanks to
&lt;br&gt;Kodak, there's a perfect scanner to get the job done! With the NEW KODAK i700
&lt;br&gt;Series Scanner you'll get full speed at 300 dpi even with all image 
&lt;br&gt;processing features enabled. &lt;a href=&quot;http://p.sf.net/sfu/kodak-com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/kodak-com&lt;/a&gt;&lt;br /&gt;_______________________________________________
&lt;br&gt;Jikesrvm-core mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=23441089&amp;i=5&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Jikesrvm-core@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Re%3A--rvm-core---rvm-commits--SF.net-SVN%3A-jikesrvm%3A-15685--rvmroot-trunk-tp23439089p23441089.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-23439274</id>
	<title>Re: [rvm-core] [rvm-commits] SF.net SVN: jikesrvm:[15685] rvmroot/trunk</title>
	<published>2009-05-07T20:02:52Z</published>
	<updated>2009-05-07T20:02:52Z</updated>
	<author>
		<name>Filip Pizlo-2</name>
	</author>
	<content type="html">&lt;html&gt;&lt;body style=&quot;word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; &quot;&gt;Hi Dave,&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;I just did a clean checkout of trunk and tried building prototype and FullAdaptiveGenMS on vole.anu.edu.au, and FullAdaptiveGenMS on my Fedora 9 box, and my Ubuntu box. &amp;nbsp;It worked on all of them. &amp;nbsp; No compile errors.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;I'm building with buildit. &amp;nbsp;Should I be worried about some other way of building that you're using?&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;-Filip&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;div&gt;&lt;div&gt;On May 7, 2009, at 10:36 PM, David P Grove wrote:&lt;/div&gt;&lt;br class=&quot;Apple-interchange-newline&quot;&gt;&lt;blockquote type=&quot;cite&quot;&gt;&lt;div&gt;&lt;p&gt;svn head doesn't compile.  Please fix.  &lt;br&gt; &lt;br&gt; thanks,&lt;br&gt; &lt;br&gt; --dave&lt;br&gt; &lt;br&gt; do-checkstyle:&lt;br&gt; &lt;br&gt; compile:&lt;br&gt;    [mkdir] Created dir: /home/dgrove/rvm-trunk/target/prototype_ia32-linux/classes&lt;br&gt;    [javac] Compiling 88 source files to /home/dgrove/rvm-trunk/target/prototype_ia32-linux/classes&lt;br&gt;    [javac] /home/dgrove/rvm-trunk/rvm/src/org/jikesrvm/scheduler/Lock.java:315: cannot find symbol&lt;br&gt;    [javac] symbol  : method markDeflated(java.lang.Object,org.vmmagic.unboxed.Offset,int)&lt;br&gt;    [javac] location: class org.jikesrvm.scheduler.ThinLock&lt;br&gt;    [javac]     ThinLock.markDeflated(o, lockOffset, index);&lt;br&gt;    [javac]             ^&lt;br&gt;    [javac] Note: * uses or overrides a deprecated API.&lt;br&gt;    [javac] Note: Recompile with -Xlint:deprecation for details.&lt;br&gt;    [javac] Note: Some input files use unchecked or unsafe operations.&lt;br&gt;    [javac] Note: Recompile with -Xlint:unchecked for details.&lt;br&gt;    [javac] 1 error&lt;br&gt; &lt;br&gt; BUILD FAILED&lt;br&gt; /home/dgrove/rvm-trunk/build.xml:1079: The following error occurred while executing this line:&lt;br&gt; /home/dgrove/rvm-trunk/build.xml:1092: Compile failed; see the compiler error output for details.&lt;br&gt; &lt;br&gt; &lt;br&gt; &lt;span&gt;&amp;lt;graycol.gif&gt;&lt;/span&gt;&lt;font color=&quot;#424282&quot;&gt;pizlo---05/07/2009 06:40:28 PM---Revision: 15685           &lt;a href=&quot;http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=15685&amp;amp;view=rev&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=15685&amp;amp;view=rev&lt;/a&gt;&lt;/font&gt;&lt;br&gt; &lt;br&gt; &lt;table width=&quot;100%&quot; border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt; &lt;tbody&gt;&lt;tr valign=&quot;top&quot;&gt;&lt;td width=&quot;1%&quot;&gt;&lt;span&gt;&amp;lt;ecblank.gif&gt;&lt;/span&gt;&lt;br&gt; &lt;font size=&quot;2&quot; color=&quot;#5F5F5F&quot;&gt;From:&lt;/font&gt;&lt;/td&gt;&lt;td width=&quot;100%&quot;&gt;&lt;span&gt;&amp;lt;ecblank.gif&gt;&lt;/span&gt;&lt;br&gt; &lt;font size=&quot;2&quot;&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=23439274&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;pizlo@...&lt;/a&gt;&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr valign=&quot;top&quot;&gt;&lt;td width=&quot;1%&quot;&gt;&lt;span&gt;&amp;lt;ecblank.gif&gt;&lt;/span&gt;&lt;br&gt; &lt;font size=&quot;2&quot; color=&quot;#5F5F5F&quot;&gt;To:&lt;/font&gt;&lt;/td&gt;&lt;td width=&quot;100%&quot;&gt;&lt;span&gt;&amp;lt;ecblank.gif&gt;&lt;/span&gt;&lt;br&gt; &lt;font size=&quot;2&quot;&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=23439274&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;jikesrvm-commits@...&lt;/a&gt;&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr valign=&quot;top&quot;&gt;&lt;td width=&quot;1%&quot;&gt;&lt;span&gt;&amp;lt;ecblank.gif&gt;&lt;/span&gt;&lt;br&gt; &lt;font size=&quot;2&quot; color=&quot;#5F5F5F&quot;&gt;Date:&lt;/font&gt;&lt;/td&gt;&lt;td width=&quot;100%&quot;&gt;&lt;span&gt;&amp;lt;ecblank.gif&gt;&lt;/span&gt;&lt;br&gt; &lt;font size=&quot;2&quot;&gt;05/07/2009 06:40 PM&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr valign=&quot;top&quot;&gt;&lt;td width=&quot;1%&quot;&gt;&lt;span&gt;&amp;lt;ecblank.gif&gt;&lt;/span&gt;&lt;br&gt; &lt;font size=&quot;2&quot; color=&quot;#5F5F5F&quot;&gt;Subject:&lt;/font&gt;&lt;/td&gt;&lt;td width=&quot;100%&quot;&gt;&lt;span&gt;&amp;lt;ecblank.gif&gt;&lt;/span&gt;&lt;br&gt; &lt;font size=&quot;2&quot;&gt;[rvm-commits] SF.net SVN: jikesrvm:[15685] rvmroot/trunk&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;&lt;hr width=&quot;100%&quot; size=&quot;2&quot; align=&quot;left&quot; noshade=&quot;&quot; style=&quot;color:#8091A5; &quot;&gt;&lt;br&gt; &lt;br&gt; &lt;br&gt; &lt;tt&gt;Revision: 15685&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/tt&gt;&lt;tt&gt;&lt;a href=&quot;http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=15685&amp;amp;view=rev&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=15685&amp;amp;view=rev&lt;/a&gt;&lt;/tt&gt;&lt;tt&gt;&lt;br&gt; Author: &amp;nbsp; pizlo&lt;br&gt; Date: &amp;nbsp; &amp;nbsp; 2009-05-07 22:40:00 +0000 (Thu, 07 May 2009)&lt;br&gt; &lt;br&gt; Log Message:&lt;br&gt; -----------&lt;br&gt; Merging biased locking support. &amp;nbsp;Biased locking is on by default and there is currently no way to disable it (except potentially by some small hacks in the code). &amp;nbsp;On DaCapo, we see no performance degradation on any benchmark; instead we see a 6% performance boost in the geomean.&lt;br&gt; &lt;br&gt; Modified Paths:&lt;br&gt; --------------&lt;br&gt; &amp;nbsp; &amp;nbsp;rvmroot/trunk/build/primordials/RVM.txt&lt;br&gt; &amp;nbsp; &amp;nbsp;rvmroot/trunk/rvm/src/org/jikesrvm/VM.java&lt;br&gt; &amp;nbsp; &amp;nbsp;rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/bc2ir/BC2IR.java&lt;br&gt; &amp;nbsp; &amp;nbsp;rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/JavaHeader.java&lt;br&gt; &amp;nbsp; &amp;nbsp;rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ObjectModel.java&lt;br&gt; &amp;nbsp; &amp;nbsp;rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ThinLockConstants.java&lt;br&gt; &amp;nbsp; &amp;nbsp;rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Lock.java&lt;br&gt; &amp;nbsp; &amp;nbsp;rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/RVMThread.java&lt;br&gt; &amp;nbsp; &amp;nbsp;rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Synchronization.java&lt;br&gt; &amp;nbsp; &amp;nbsp;rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/ThinLock.java&lt;br&gt; &lt;br&gt; Modified: rvmroot/trunk/build/primordials/RVM.txt&lt;br&gt; ===================================================================&lt;br&gt; --- rvmroot/trunk/build/primordials/RVM.txt		 2009-05-07 20:08:18 UTC (rev 15684)&lt;br&gt; +++ rvmroot/trunk/build/primordials/RVM.txt		 2009-05-07 22:40:00 UTC (rev 15685)&lt;br&gt; @@ -54,6 +54,8 @@&lt;br&gt; [[Lorg/jikesrvm/scheduler/RVMThread;&lt;br&gt; [Lorg/jikesrvm/scheduler/RVMThread$BlockAdapter;&lt;br&gt; [[Lorg/jikesrvm/scheduler/RVMThread$BlockAdapter;&lt;br&gt; +Lorg/jikesrvm/scheduler/ThinLock;&lt;br&gt; +Lorg/jikesrvm/scheduler/Lock;&lt;br&gt; [Lorg/jikesrvm/scheduler/Lock;&lt;br&gt; [[Lorg/jikesrvm/scheduler/Lock;&lt;br&gt; &lt;br&gt; &lt;br&gt; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/VM.java&lt;br&gt; ===================================================================&lt;br&gt; --- rvmroot/trunk/rvm/src/org/jikesrvm/VM.java		 2009-05-07 20:08:18 UTC (rev 15684)&lt;br&gt; +++ rvmroot/trunk/rvm/src/org/jikesrvm/VM.java		 2009-05-07 22:40:00 UTC (rev 15685)&lt;br&gt; @@ -2058,6 +2058,25 @@&lt;br&gt; &amp;nbsp; &amp;nbsp; swUnlock();&lt;br&gt; &amp;nbsp; }&lt;br&gt; &lt;br&gt; + &amp;nbsp;@NoInline&lt;br&gt; + &amp;nbsp;public static void sysWriteln(String s0, Address a1, String s1, Word w1, String s2, int i1, String s3, int i2, String s4, Word w2, String s5, int i3) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;swLock();&lt;br&gt; + &amp;nbsp; &amp;nbsp;write(s0);&lt;br&gt; + &amp;nbsp; &amp;nbsp;write(a1);&lt;br&gt; + &amp;nbsp; &amp;nbsp;write(s1);&lt;br&gt; + &amp;nbsp; &amp;nbsp;write(w1);&lt;br&gt; + &amp;nbsp; &amp;nbsp;write(s2);&lt;br&gt; + &amp;nbsp; &amp;nbsp;write(i1);&lt;br&gt; + &amp;nbsp; &amp;nbsp;write(s3);&lt;br&gt; + &amp;nbsp; &amp;nbsp;write(i2);&lt;br&gt; + &amp;nbsp; &amp;nbsp;write(s4);&lt;br&gt; + &amp;nbsp; &amp;nbsp;write(w2);&lt;br&gt; + &amp;nbsp; &amp;nbsp;write(s5);&lt;br&gt; + &amp;nbsp; &amp;nbsp;write(i3);&lt;br&gt; + &amp;nbsp; &amp;nbsp;writeln();&lt;br&gt; + &amp;nbsp; &amp;nbsp;swUnlock();&lt;br&gt; + &amp;nbsp;}&lt;br&gt; +&lt;br&gt; &amp;nbsp; private static void showThread() {&lt;br&gt; &amp;nbsp; &amp;nbsp; write(&quot;Thread &quot;);&lt;br&gt; &amp;nbsp; &amp;nbsp; write(RVMThread.getCurrentThread().getThreadSlot());&lt;br&gt; &lt;br&gt; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/bc2ir/BC2IR.java&lt;br&gt; ===================================================================&lt;br&gt; --- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/bc2ir/BC2IR.java		 2009-05-07 20:08:18 UTC (rev 15684)&lt;br&gt; +++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/bc2ir/BC2IR.java		 2009-05-07 22:40:00 UTC (rev 15685)&lt;br&gt; @@ -3635,6 +3635,7 @@&lt;br&gt; &amp;nbsp; &amp;nbsp;*/&lt;br&gt; &amp;nbsp; public boolean do_NullCheck(Operand ref) {&lt;br&gt; &amp;nbsp; &amp;nbsp; if (gc.noNullChecks()) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;setCurrentGuard(new TrueGuardOperand());&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; return false;&lt;br&gt; &amp;nbsp; &amp;nbsp; }&lt;br&gt; &amp;nbsp; &amp;nbsp; if (ref.isDefinitelyNull()) {&lt;br&gt; &lt;br&gt; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/JavaHeader.java&lt;br&gt; ===================================================================&lt;br&gt; --- rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/JavaHeader.java		 2009-05-07 20:08:18 UTC (rev 15684)&lt;br&gt; +++ rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/JavaHeader.java		 2009-05-07 22:40:00 UTC (rev 15685)&lt;br&gt; @@ -492,6 +492,7 @@&lt;br&gt; &amp;nbsp; &amp;nbsp;* Get the hash code of an object.&lt;br&gt; &amp;nbsp; &amp;nbsp;*/&lt;br&gt; &amp;nbsp; @Inline&lt;br&gt; + &amp;nbsp;@Interruptible&lt;br&gt; &amp;nbsp; public static int getObjectHashCode(Object o) {&lt;br&gt; &amp;nbsp; &amp;nbsp; if (ADDRESS_BASED_HASHING) {&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (MemoryManagerConstants.MOVES_OBJECTS) {&lt;br&gt; @@ -513,10 +514,18 @@&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } else {&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // UNHASHED&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word tmp;&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;do {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tmp = Magic.prepareWord(o, STATUS_OFFSET);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} while (!Magic.attemptWord(o, STATUS_OFFSET, tmp, tmp.or(HASH_STATE_HASHED)));&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;boolean lhr=ThinLock.lockHeader(o, STATUS_OFFSET);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (lhr) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.setWordAtOffset(&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;o, STATUS_OFFSET,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.getWordAtOffset(o, STATUS_OFFSET).or(HASH_STATE_HASHED));&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word tmp;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;do {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tmp = Magic.prepareWord(o, STATUS_OFFSET);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} while (!Magic.attemptWord(o, STATUS_OFFSET, tmp, tmp.or(HASH_STATE_HASHED)));&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ThinLock.unlockHeader(o, STATUS_OFFSET, lhr);&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (ObjectModel.HASH_STATS) ObjectModel.hashTransition1++;&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return getObjectHashCode(o);&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt; @@ -534,20 +543,35 @@&lt;br&gt; &lt;br&gt; &amp;nbsp; /** Install a new hashcode (only used if !ADDRESS_BASED_HASHING) */&lt;br&gt; &amp;nbsp; @NoInline&lt;br&gt; + &amp;nbsp;@Interruptible&lt;br&gt; &amp;nbsp; protected static int installHashCode(Object o) {&lt;br&gt; &amp;nbsp; &amp;nbsp; Word hashCode;&lt;br&gt; &amp;nbsp; &amp;nbsp; do {&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; hashCodeGenerator = hashCodeGenerator.plus(Word.one().lsh(HASH_CODE_SHIFT));&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; hashCode = hashCodeGenerator.and(HASH_CODE_MASK);&lt;br&gt; &amp;nbsp; &amp;nbsp; } while (hashCode.isZero());&lt;br&gt; - &amp;nbsp; &amp;nbsp;while (true) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;Word statusWord = Magic.prepareWord(o, STATUS_OFFSET);&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (ThinLock.lockHeader(o, STATUS_OFFSET)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Word statusWord = Magic.getWordAtOffset(o, STATUS_OFFSET);&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (!(statusWord.and(HASH_CODE_MASK).isZero())) // some other thread installed a hashcode&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ThinLock.unlockHeader(o, STATUS_OFFSET, true);&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return statusWord.and(HASH_CODE_MASK).rshl(HASH_CODE_SHIFT).toInt();&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Magic.attemptWord(o, STATUS_OFFSET, statusWord, statusWord.or(hashCode))) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return hashCode.rshl(HASH_CODE_SHIFT).toInt(); &amp;nbsp;// we installed the hash code&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.setWordAtOffset(o, STATUS_OFFSET, statusWord.or(hashCode));&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;ThinLock.unlockHeader(o, STATUS_OFFSET, true);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;return hashCode.rshl(HASH_CODE_SHIFT).toInt(); &amp;nbsp;// we installed the hash code&lt;br&gt; + &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;while (true) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word statusWord = Magic.prepareWord(o, STATUS_OFFSET);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!(statusWord.and(HASH_CODE_MASK).isZero())) // some other thread installed a hashcode&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ThinLock.unlockHeader(o, STATUS_OFFSET, false);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return statusWord.and(HASH_CODE_MASK).rshl(HASH_CODE_SHIFT).toInt();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Magic.attemptWord(o, STATUS_OFFSET, statusWord, statusWord.or(hashCode))) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ThinLock.unlockHeader(o, STATUS_OFFSET, false);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return hashCode.rshl(HASH_CODE_SHIFT).toInt(); &amp;nbsp;// we installed the hash code&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt; &amp;nbsp; &amp;nbsp; }&lt;br&gt; &amp;nbsp; }&lt;br&gt; @@ -677,6 +701,7 @@&lt;br&gt; &amp;nbsp; &amp;nbsp;* Freeze the other bits in the byte containing the available bits&lt;br&gt; &amp;nbsp; &amp;nbsp;* so that it is safe to update them using setAvailableBits.&lt;br&gt; &amp;nbsp; &amp;nbsp;*/&lt;br&gt; + &amp;nbsp;@Interruptible&lt;br&gt; &amp;nbsp; public static void initializeAvailableByte(Object o) {&lt;br&gt; &amp;nbsp; &amp;nbsp; if (!ADDRESS_BASED_HASHING) getObjectHashCode(o);&lt;br&gt; &amp;nbsp; }&lt;br&gt; @@ -685,6 +710,8 @@&lt;br&gt; &amp;nbsp; &amp;nbsp;* A prepare on the word containing the available bits&lt;br&gt; &amp;nbsp; &amp;nbsp;*/&lt;br&gt; &amp;nbsp; public static Word prepareAvailableBits(Object o) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.worldStopped() || ThinLock.allowHeaderCAS(o, STATUS_OFFSET));&lt;br&gt; &amp;nbsp; &amp;nbsp; return Magic.prepareWord(o, STATUS_OFFSET);&lt;br&gt; &amp;nbsp; }&lt;br&gt; &lt;br&gt; @@ -692,6 +719,8 @@&lt;br&gt; &amp;nbsp; &amp;nbsp;* An attempt on the word containing the available bits&lt;br&gt; &amp;nbsp; &amp;nbsp;*/&lt;br&gt; &amp;nbsp; public static boolean attemptAvailableBits(Object o, Word oldVal, Word newVal) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.worldStopped() || ThinLock.allowHeaderCAS(o, STATUS_OFFSET));&lt;br&gt; &amp;nbsp; &amp;nbsp; return Magic.attemptWord(o, STATUS_OFFSET, oldVal, newVal);&lt;br&gt; &amp;nbsp; }&lt;br&gt; &lt;br&gt; &lt;br&gt; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ObjectModel.java&lt;br&gt; ===================================================================&lt;br&gt; --- rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ObjectModel.java		 2009-05-07 20:08:18 UTC (rev 15684)&lt;br&gt; +++ rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ObjectModel.java		 2009-05-07 22:40:00 UTC (rev 15685)&lt;br&gt; @@ -432,6 +432,7 @@&lt;br&gt; &amp;nbsp; /**&lt;br&gt; &amp;nbsp; &amp;nbsp;* Get the hash code of an object.&lt;br&gt; &amp;nbsp; &amp;nbsp;*/&lt;br&gt; + &amp;nbsp;@Interruptible&lt;br&gt; &amp;nbsp; public static int getObjectHashCode(Object o) {&lt;br&gt; &amp;nbsp; &amp;nbsp; if (HASH_STATS) hashRequests++;&lt;br&gt; &amp;nbsp; &amp;nbsp; return JavaHeader.getObjectHashCode(o);&lt;br&gt; @@ -547,6 +548,7 @@&lt;br&gt; &amp;nbsp; &amp;nbsp;* Freeze the other bits in the byte containing the available bits&lt;br&gt; &amp;nbsp; &amp;nbsp;* so that it is safe to update them using setAvailableBits.&lt;br&gt; &amp;nbsp; &amp;nbsp;*/&lt;br&gt; + &amp;nbsp;@Interruptible&lt;br&gt; &amp;nbsp; public static void initializeAvailableByte(Object o) {&lt;br&gt; &amp;nbsp; &amp;nbsp; JavaHeader.initializeAvailableByte(o);&lt;br&gt; &amp;nbsp; }&lt;br&gt; &lt;br&gt; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ThinLockConstants.java&lt;br&gt; ===================================================================&lt;br&gt; --- rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ThinLockConstants.java		 2009-05-07 20:08:18 UTC (rev 15684)&lt;br&gt; +++ rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ThinLockConstants.java		 2009-05-07 22:40:00 UTC (rev 15685)&lt;br&gt; @@ -35,21 +35,32 @@&lt;br&gt; &amp;nbsp;*/&lt;br&gt; public interface ThinLockConstants extends SizeConstants {&lt;br&gt; &lt;br&gt; - &amp;nbsp;int NUM_BITS_TID = RVMThread.LOG_MAX_THREADS;&lt;br&gt; - &amp;nbsp;int NUM_BITS_RC = JavaHeader.NUM_THIN_LOCK_BITS - NUM_BITS_TID;&lt;br&gt; + &amp;nbsp;// biased locking / thin locking status bits:&lt;br&gt; + &amp;nbsp;// 00 -&gt; thin biasable, and biased if TID is non-zero&lt;br&gt; + &amp;nbsp;// 01 -&gt; thin unbiasable&lt;br&gt; + &amp;nbsp;// 10 -&gt; fat unbiasable&lt;br&gt; &lt;br&gt; + &amp;nbsp;int TL_NUM_BITS_STAT = 2;&lt;br&gt; + &amp;nbsp;int TL_NUM_BITS_TID = RVMThread.LOG_MAX_THREADS;&lt;br&gt; + &amp;nbsp;int TL_NUM_BITS_RC = JavaHeader.NUM_THIN_LOCK_BITS - TL_NUM_BITS_TID - TL_NUM_BITS_STAT;&lt;br&gt; +&lt;br&gt; &amp;nbsp; int TL_LOCK_COUNT_SHIFT = JavaHeader.THIN_LOCK_SHIFT;&lt;br&gt; - &amp;nbsp;int TL_THREAD_ID_SHIFT = TL_LOCK_COUNT_SHIFT + NUM_BITS_RC;&lt;br&gt; + &amp;nbsp;int TL_THREAD_ID_SHIFT = TL_LOCK_COUNT_SHIFT + TL_NUM_BITS_RC;&lt;br&gt; + &amp;nbsp;int TL_STAT_SHIFT = TL_THREAD_ID_SHIFT + TL_NUM_BITS_TID;&lt;br&gt; &amp;nbsp; int TL_LOCK_ID_SHIFT = JavaHeader.THIN_LOCK_SHIFT;&lt;br&gt; &lt;br&gt; &amp;nbsp; int TL_LOCK_COUNT_UNIT = 1 &amp;lt;&amp;lt; TL_LOCK_COUNT_SHIFT;&lt;br&gt; &lt;br&gt; - &amp;nbsp;Word TL_LOCK_COUNT_MASK = Word.fromIntSignExtend(-1).rshl(BITS_IN_ADDRESS - NUM_BITS_RC).lsh(TL_LOCK_COUNT_SHIFT);&lt;br&gt; - &amp;nbsp;Word TL_THREAD_ID_MASK = Word.fromIntSignExtend(-1).rshl(BITS_IN_ADDRESS - NUM_BITS_TID).lsh(TL_THREAD_ID_SHIFT);&lt;br&gt; + &amp;nbsp;Word TL_LOCK_COUNT_MASK = Word.fromIntSignExtend(-1).rshl(BITS_IN_ADDRESS - TL_NUM_BITS_RC).lsh(TL_LOCK_COUNT_SHIFT);&lt;br&gt; + &amp;nbsp;Word TL_THREAD_ID_MASK = Word.fromIntSignExtend(-1).rshl(BITS_IN_ADDRESS - TL_NUM_BITS_TID).lsh(TL_THREAD_ID_SHIFT);&lt;br&gt; &amp;nbsp; Word TL_LOCK_ID_MASK =&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;Word.fromIntSignExtend(-1).rshl(BITS_IN_ADDRESS - (NUM_BITS_RC + NUM_BITS_TID - 1)).lsh(TL_LOCK_ID_SHIFT);&lt;br&gt; - &amp;nbsp;Word TL_FAT_LOCK_MASK = Word.one().lsh(JavaHeader.THIN_LOCK_SHIFT + NUM_BITS_RC + NUM_BITS_TID - 1);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Word.fromIntSignExtend(-1).rshl(BITS_IN_ADDRESS - (TL_NUM_BITS_RC + TL_NUM_BITS_TID)).lsh(TL_LOCK_ID_SHIFT);&lt;br&gt; + &amp;nbsp;Word TL_STAT_MASK = Word.fromIntSignExtend(-1).rshl(BITS_IN_ADDRESS - TL_NUM_BITS_TID).lsh(TL_STAT_SHIFT);&lt;br&gt; &amp;nbsp; Word TL_UNLOCK_MASK = Word.fromIntSignExtend(-1).rshl(BITS_IN_ADDRESS - JavaHeader&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; .NUM_THIN_LOCK_BITS).lsh(JavaHeader.THIN_LOCK_SHIFT).not();&lt;br&gt; +&lt;br&gt; + &amp;nbsp;Word TL_STAT_BIASABLE = Word.fromIntSignExtend(0).lsh(TL_STAT_SHIFT);&lt;br&gt; + &amp;nbsp;Word TL_STAT_THIN = Word.fromIntSignExtend(1).lsh(TL_STAT_SHIFT);&lt;br&gt; + &amp;nbsp;Word TL_STAT_FAT = Word.fromIntSignExtend(2).lsh(TL_STAT_SHIFT);&lt;br&gt; }&lt;br&gt; &lt;br&gt; &lt;br&gt; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Lock.java&lt;br&gt; ===================================================================&lt;br&gt; --- rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Lock.java		 2009-05-07 20:08:18 UTC (rev 15684)&lt;br&gt; +++ rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Lock.java		 2009-05-07 22:40:00 UTC (rev 15685)&lt;br&gt; @@ -115,7 +115,7 @@&lt;br&gt; &amp;nbsp;*/&lt;br&gt; &lt;br&gt; @Uninterruptible&lt;br&gt; -public class Lock implements Constants {&lt;br&gt; +public final class Lock implements Constants {&lt;br&gt; &amp;nbsp; /****************************************************************************&lt;br&gt; &amp;nbsp; &amp;nbsp;* Constants&lt;br&gt; &amp;nbsp; &amp;nbsp;*/&lt;br&gt; @@ -311,7 +311,7 @@&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; VM._assert(waiting.isEmpty());&lt;br&gt; &amp;nbsp; &amp;nbsp; }&lt;br&gt; &amp;nbsp; &amp;nbsp; if (STATS) deflations++;&lt;br&gt; - &amp;nbsp; &amp;nbsp;ThinLock.deflate(o, lockOffset, this);&lt;br&gt; + &amp;nbsp; &amp;nbsp;ThinLock.markDeflated(o, lockOffset, index);&lt;br&gt; &amp;nbsp; &amp;nbsp; lockedObject = null;&lt;br&gt; &amp;nbsp; &amp;nbsp; free(this);&lt;br&gt; &amp;nbsp; }&lt;br&gt; &lt;br&gt; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/RVMThread.java&lt;br&gt; ===================================================================&lt;br&gt; --- rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/RVMThread.java		 2009-05-07 20:08:18 UTC (rev 15684)&lt;br&gt; +++ rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/RVMThread.java		 2009-05-07 22:40:00 UTC (rev 15685)&lt;br&gt; @@ -2097,7 +2097,9 @@&lt;br&gt; &amp;nbsp; }&lt;br&gt; &lt;br&gt; &amp;nbsp; @Unpreemptible&lt;br&gt; - &amp;nbsp;final int safeBlock(BlockAdapter ba, boolean asynchronous) {&lt;br&gt; + &amp;nbsp;private int safeBlock(BlockAdapter ba, boolean asynchronous) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions)&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;VM._assert(getCurrentThread() != this);&lt;br&gt; &amp;nbsp; &amp;nbsp; beginPairWithCurrent();&lt;br&gt; &amp;nbsp; &amp;nbsp; int result=block(ba,asynchronous);&lt;br&gt; &amp;nbsp; &amp;nbsp; endPairWithCurrent();&lt;br&gt; @@ -2106,14 +2108,16 @@&lt;br&gt; &lt;br&gt; &amp;nbsp; @Unpreemptible&lt;br&gt; &amp;nbsp; public final int safeAsyncBlock(BlockAdapter ba) {&lt;br&gt; - &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions)&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;VM._assert(getCurrentThread() != this);&lt;br&gt; &amp;nbsp; &amp;nbsp; return safeBlock(ba, true);&lt;br&gt; &amp;nbsp; }&lt;br&gt; &lt;br&gt; &amp;nbsp; @Unpreemptible&lt;br&gt; &amp;nbsp; public final int safeBlock(BlockAdapter ba) {&lt;br&gt; - &amp;nbsp; &amp;nbsp;return safeBlock(ba, false);&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (getCurrentThread()==this) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;return block(ba,false);&lt;br&gt; + &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;return safeBlock(ba, false);&lt;br&gt; + &amp;nbsp; &amp;nbsp;}&lt;br&gt; &amp;nbsp; }&lt;br&gt; &lt;br&gt; &amp;nbsp; @Unpreemptible&lt;br&gt; @@ -2821,22 +2825,20 @@&lt;br&gt; &amp;nbsp; &amp;nbsp;*/&lt;br&gt; &amp;nbsp; @UnpreemptibleNoWarn(&quot;Exceptions may possibly cause yields&quot;)&lt;br&gt; &amp;nbsp; public final void suspend() {&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (false) VM.sysWriteln(&quot;Thread #&quot;,getCurrentThreadSlot(),&quot; suspending Thread #&quot;,getThreadSlot());&lt;br&gt; &amp;nbsp; &amp;nbsp; ObjectModel.genericUnlock(thread);&lt;br&gt; &amp;nbsp; &amp;nbsp; Throwable rethrow = null;&lt;br&gt; - &amp;nbsp; &amp;nbsp;monitor().lockNoHandshake();&lt;br&gt; &amp;nbsp; &amp;nbsp; try {&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; observeExecStatus();&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (execStatus != IN_JAVA &amp;amp;&amp;amp; execStatus != IN_JAVA_TO_BLOCK &amp;amp;&amp;amp;&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; execStatus != IN_NATIVE &amp;amp;&amp;amp; execStatus != BLOCKED_IN_NATIVE &amp;amp;&amp;amp;&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; execStatus != BLOCKED_IN_JNI &amp;amp;&amp;amp; execStatus != IN_JNI) {&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; throw new IllegalThreadStateException(&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&quot;Cannot suspend a thread that is not running.&quot;);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&quot;Cannot suspend a thread that is not running.&quot;);&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;safeBlock(suspendBlockAdapter);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;block(suspendBlockAdapter);&lt;br&gt; &amp;nbsp; &amp;nbsp; } catch (Throwable t) {&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; rethrow = t;&lt;br&gt; - &amp;nbsp; &amp;nbsp;} finally {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;monitor().unlock();&lt;br&gt; &amp;nbsp; &amp;nbsp; }&lt;br&gt; &amp;nbsp; &amp;nbsp; ObjectModel.genericLock(thread);&lt;br&gt; &amp;nbsp; &amp;nbsp; if (rethrow != null)&lt;br&gt; &lt;br&gt; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Synchronization.java&lt;br&gt; ===================================================================&lt;br&gt; --- rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Synchronization.java		 2009-05-07 20:08:18 UTC (rev 15684)&lt;br&gt; +++ rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Synchronization.java		 2009-05-07 22:40:00 UTC (rev 15685)&lt;br&gt; @@ -19,6 +19,7 @@&lt;br&gt; import org.vmmagic.pragma.Inline;&lt;br&gt; import org.vmmagic.pragma.Uninterruptible;&lt;br&gt; import org.vmmagic.unboxed.Address;&lt;br&gt; +import org.vmmagic.unboxed.Word;&lt;br&gt; import org.vmmagic.unboxed.Offset;&lt;br&gt; &lt;br&gt; /**&lt;br&gt; @@ -74,6 +75,24 @@&lt;br&gt; &amp;nbsp; &amp;nbsp;* @return true =&gt; successful swap, false =&gt; field not equal to testValue&lt;br&gt; &amp;nbsp; &amp;nbsp;*/&lt;br&gt; &amp;nbsp; @Inline&lt;br&gt; + &amp;nbsp;public static boolean tryCompareAndSwap(Object base, Offset offset, Word testValue, Word newValue) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;Word oldValue;&lt;br&gt; + &amp;nbsp; &amp;nbsp;do {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;oldValue = Magic.prepareWord(base, offset);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (oldValue != testValue) return false;&lt;br&gt; + &amp;nbsp; &amp;nbsp;} while (!Magic.attemptWord(base, offset, oldValue, newValue));&lt;br&gt; + &amp;nbsp; &amp;nbsp;return true;&lt;br&gt; + &amp;nbsp;}&lt;br&gt; +&lt;br&gt; + &amp;nbsp;/**&lt;br&gt; + &amp;nbsp; * Atomically swap test value to new value in the specified object and the specified field&lt;br&gt; + &amp;nbsp; * @param base object containing field&lt;br&gt; + &amp;nbsp; * @param offset position of field&lt;br&gt; + &amp;nbsp; * @param testValue expected value of field&lt;br&gt; + &amp;nbsp; * @param newValue new value of field&lt;br&gt; + &amp;nbsp; * @return true =&gt; successful swap, false =&gt; field not equal to testValue&lt;br&gt; + &amp;nbsp; */&lt;br&gt; + &amp;nbsp;@Inline&lt;br&gt; &amp;nbsp; public static boolean tryCompareAndSwap(Object base, Offset offset, Object testValue, Object newValue) {&lt;br&gt; &amp;nbsp; &amp;nbsp; if (MemoryManagerConstants.NEEDS_WRITE_BARRIER) {&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; return MemoryManager.tryCompareAndSwapWriteBarrier(base, offset, testValue, newValue);&lt;br&gt; &lt;br&gt; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/ThinLock.java&lt;br&gt; ===================================================================&lt;br&gt; --- rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/ThinLock.java		 2009-05-07 20:08:18 UTC (rev 15684)&lt;br&gt; +++ rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/ThinLock.java		 2009-05-07 22:40:00 UTC (rev 15685)&lt;br&gt; @@ -14,16 +14,13 @@&lt;br&gt; &lt;br&gt; import org.jikesrvm.VM;&lt;br&gt; import org.jikesrvm.Services;&lt;br&gt; -import org.jikesrvm.classloader.RVMMethod;&lt;br&gt; -import org.jikesrvm.compilers.common.CompiledMethods;&lt;br&gt; import org.jikesrvm.objectmodel.ThinLockConstants;&lt;br&gt; import org.jikesrvm.runtime.Magic;&lt;br&gt; -import org.vmmagic.pragma.Entrypoint;&lt;br&gt; import org.vmmagic.pragma.Inline;&lt;br&gt; import org.vmmagic.pragma.NoInline;&lt;br&gt; +import org.vmmagic.pragma.NoNullCheck;&lt;br&gt; import org.vmmagic.pragma.Uninterruptible;&lt;br&gt; import org.vmmagic.pragma.Unpreemptible;&lt;br&gt; -import org.vmmagic.unboxed.Address;&lt;br&gt; import org.vmmagic.unboxed.Offset;&lt;br&gt; import org.vmmagic.unboxed.Word;&lt;br&gt; &lt;br&gt; @@ -33,10 +30,218 @@&lt;br&gt; @Uninterruptible&lt;br&gt; public final class ThinLock implements ThinLockConstants {&lt;br&gt; &lt;br&gt; - &amp;nbsp;////////////////////////////////////////&lt;br&gt; - &amp;nbsp;/// Support for light-weight locking ///&lt;br&gt; - &amp;nbsp;////////////////////////////////////////&lt;br&gt; + &amp;nbsp;@Inline&lt;br&gt; + &amp;nbsp;@NoNullCheck&lt;br&gt; + &amp;nbsp;@Unpreemptible&lt;br&gt; + &amp;nbsp;public static void inlineLock(Object o, Offset lockOffset) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;Word old = Magic.prepareWord(o, lockOffset); // FIXME: bad for PPC?&lt;br&gt; + &amp;nbsp; &amp;nbsp;Word id = old.and(TL_THREAD_ID_MASK.or(TL_STAT_MASK));&lt;br&gt; + &amp;nbsp; &amp;nbsp;Word tid = Word.fromIntSignExtend(RVMThread.getCurrentThread().getLockingId());&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (id.EQ(tid)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Word changed = old.toAddress().plus(TL_LOCK_COUNT_UNIT).toWord();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!changed.and(TL_LOCK_COUNT_MASK).isZero()) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.setWordAtOffset(o, lockOffset, changed);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp;} else if (id.EQ(TL_STAT_THIN)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;// lock is thin and not held by anyone&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Magic.attemptWord(o, lockOffset, old, old.or(tid))) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.isync();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp;lock(o, lockOffset);&lt;br&gt; + &amp;nbsp;}&lt;br&gt; &lt;br&gt; + &amp;nbsp;@Inline&lt;br&gt; + &amp;nbsp;@NoNullCheck&lt;br&gt; + &amp;nbsp;@Unpreemptible&lt;br&gt; + &amp;nbsp;public static void inlineUnlock(Object o, Offset lockOffset) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;Word old = Magic.prepareWord(o, lockOffset); // FIXME: bad for PPC?&lt;br&gt; + &amp;nbsp; &amp;nbsp;Word id = old.and(TL_THREAD_ID_MASK.or(TL_STAT_MASK));&lt;br&gt; + &amp;nbsp; &amp;nbsp;Word tid = Word.fromIntSignExtend(RVMThread.getCurrentThread().getLockingId());&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (id.EQ(tid)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!old.and(TL_LOCK_COUNT_MASK).isZero()) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.setWordAtOffset(&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;o, lockOffset,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;old.toAddress().minus(TL_LOCK_COUNT_UNIT).toWord());&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp;} else if (old.xor(tid).rshl(TL_LOCK_COUNT_SHIFT).EQ(TL_STAT_THIN.rshl(TL_LOCK_COUNT_SHIFT))) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.sync();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Magic.attemptWord(o, lockOffset, old, old.and(TL_UNLOCK_MASK).or(TL_STAT_THIN))) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp;unlock(o, lockOffset);&lt;br&gt; + &amp;nbsp;}&lt;br&gt; +&lt;br&gt; + &amp;nbsp;@NoInline&lt;br&gt; + &amp;nbsp;@NoNullCheck&lt;br&gt; + &amp;nbsp;@Unpreemptible&lt;br&gt; + &amp;nbsp;public static void lock(Object o, Offset lockOffset) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (STATS) fastLocks++;&lt;br&gt; +&lt;br&gt; + &amp;nbsp; &amp;nbsp;Word threadId = Word.fromIntZeroExtend(RVMThread.getCurrentThread().getLockingId());&lt;br&gt; +&lt;br&gt; + &amp;nbsp; &amp;nbsp;for (int cnt=0;;cnt++) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Word old = Magic.getWordAtOffset(o, lockOffset);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Word stat = old.and(TL_STAT_MASK);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;boolean tryToInflate=false;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (stat.EQ(TL_STAT_BIASABLE)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word id = old.and(TL_THREAD_ID_MASK);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (id.isZero()) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// lock is unbiased, bias it in our favor and grab it&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Synchronization.tryCompareAndSwap(&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;o, lockOffset,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;old,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;old.or(threadId).toAddress().plus(TL_LOCK_COUNT_UNIT).toWord())) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.isync();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (id.EQ(threadId)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// lock is biased in our favor&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word changed = old.toAddress().plus(TL_LOCK_COUNT_UNIT).toWord();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!changed.and(TL_LOCK_COUNT_MASK).isZero()) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.setWordAtOffset(o, lockOffset, changed);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tryToInflate=true;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (casFromBiased(o, lockOffset, old, biasBitsToThinBits(old), cnt)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;continue; // don't spin, since it's thin now&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (stat.EQ(TL_STAT_THIN)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word id = old.and(TL_THREAD_ID_MASK);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (id.isZero()) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Synchronization.tryCompareAndSwap(&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;o, lockOffset, old, old.or(threadId))) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.isync();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (id.EQ(threadId)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word changed = old.toAddress().plus(TL_LOCK_COUNT_UNIT).toWord();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (changed.and(TL_LOCK_COUNT_MASK).isZero()) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tryToInflate=true;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (Synchronization.tryCompareAndSwap(&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; o, lockOffset, old, changed)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.isync();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (cnt&gt;retryLimit) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tryToInflate=true;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(stat.EQ(TL_STAT_FAT));&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// lock is fat. &amp;nbsp;contend on it.&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Lock.getLock(getLockIndex(old)).lockHeavy(o)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; +&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (tryToInflate) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (STATS) slowLocks++;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// the lock is not fat, is owned by someone else, or else the count wrapped.&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// attempt to inflate it (this may fail, in which case we'll just harmlessly&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// loop around) and lock it (may also fail, if we get the wrong lock). &amp;nbsp;if it&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// succeeds, we're done.&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// NB: this calls into our attemptToMarkInflated() method, which will do the&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Right Thing if the lock is biased to someone else.&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (inflateAndLock(o, lockOffset)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.yield();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp;}&lt;br&gt; +&lt;br&gt; + &amp;nbsp;@NoInline&lt;br&gt; + &amp;nbsp;@NoNullCheck&lt;br&gt; + &amp;nbsp;@Unpreemptible&lt;br&gt; + &amp;nbsp;public static void unlock(Object o, Offset lockOffset) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;Word threadId = Word.fromIntZeroExtend(RVMThread.getCurrentThread().getLockingId());&lt;br&gt; + &amp;nbsp; &amp;nbsp;for (int cnt=0;;cnt++) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Word old = Magic.getWordAtOffset(o, lockOffset);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Word stat = old.and(TL_STAT_MASK);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (stat.EQ(TL_STAT_BIASABLE)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word id = old.and(TL_THREAD_ID_MASK);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (id.EQ(threadId)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (old.and(TL_LOCK_COUNT_MASK).isZero()) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.raiseIllegalMonitorStateException(&quot;biased unlocking: we own this object but the count is already zero&quot;, o);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.setWordAtOffset(o, lockOffset,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;old.toAddress().minus(TL_LOCK_COUNT_UNIT).toWord());&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.raiseIllegalMonitorStateException(&quot;biased unlocking: we don't own this object&quot;, o);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (stat.EQ(TL_STAT_THIN)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.sync();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word id = old.and(TL_THREAD_ID_MASK);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (id.EQ(threadId)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word changed;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (old.and(TL_LOCK_COUNT_MASK).isZero()) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;changed=old.and(TL_UNLOCK_MASK).or(TL_STAT_THIN);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;changed=old.toAddress().minus(TL_LOCK_COUNT_UNIT).toWord();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Synchronization.tryCompareAndSwap(&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;o, lockOffset, old, changed)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (false) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;VM.sysWriteln(&quot;threadId = &quot;,threadId);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;VM.sysWriteln(&quot;id = &quot;,id);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.raiseIllegalMonitorStateException(&quot;thin unlocking: we don't own this object&quot;, o);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(stat.EQ(TL_STAT_FAT));&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// fat unlock&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Lock.getLock(getLockIndex(old)).unlockHeavy(o);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp;}&lt;br&gt; +&lt;br&gt; + &amp;nbsp;@Uninterruptible&lt;br&gt; + &amp;nbsp;@NoNullCheck&lt;br&gt; + &amp;nbsp;public static boolean holdsLock(Object o, Offset lockOffset, RVMThread thread) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;for (int cnt=0;;++cnt) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;int tid = thread.getLockingId();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Word bits = Magic.getWordAtOffset(o, lockOffset);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (bits.and(TL_STAT_MASK).EQ(TL_STAT_BIASABLE)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// if locked, then it is locked with a thin lock&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bits.and(TL_THREAD_ID_MASK).toInt() == tid &amp;amp;&amp;amp;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!bits.and(TL_LOCK_COUNT_MASK).isZero();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (bits.and(TL_STAT_MASK).EQ(TL_STAT_THIN)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return bits.and(TL_THREAD_ID_MASK).toInt()==tid;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(bits.and(TL_STAT_MASK).EQ(TL_STAT_FAT));&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// if locked, then it is locked with a fat lock&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Lock l=Lock.getLock(getLockIndex(bits));&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (l!=null) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;l.mutex.lock();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;boolean result = (l.getOwnerId()==tid &amp;amp;&amp;amp; l.getLockedObject()==o);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;l.mutex.unlock();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return result;&lt;/tt&gt;&lt;br&gt; &lt;tt&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.yield();&lt;br&gt; + &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp;}&lt;br&gt; +&lt;br&gt; + &amp;nbsp;@Inline&lt;br&gt; + &amp;nbsp;@Uninterruptible&lt;br&gt; + &amp;nbsp;public static boolean isFat(Word lockWord) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;return lockWord.and(TL_STAT_MASK).EQ(TL_STAT_FAT);&lt;br&gt; + &amp;nbsp;}&lt;br&gt; +&lt;br&gt; &amp;nbsp; /**&lt;br&gt; &amp;nbsp; &amp;nbsp;* Return the lock index for a given lock word. &amp;nbsp;Assert valid index&lt;br&gt; &amp;nbsp; &amp;nbsp;* ranges, that the fat lock bit is set, and that the lock entry&lt;br&gt; @@ -46,7 +251,8 @@&lt;br&gt; &amp;nbsp; &amp;nbsp;* @return the lock index corresponding to the lock workd.&lt;br&gt; &amp;nbsp; &amp;nbsp;*/&lt;br&gt; &amp;nbsp; @Inline&lt;br&gt; - &amp;nbsp;private static int getLockIndex(Word lockWord) {&lt;br&gt; + &amp;nbsp;@Uninterruptible&lt;br&gt; + &amp;nbsp;public static int getLockIndex(Word lockWord) {&lt;br&gt; &amp;nbsp; &amp;nbsp; int index = lockWord.and(TL_LOCK_ID_MASK).rshl(TL_LOCK_ID_SHIFT).toInt();&lt;br&gt; &amp;nbsp; &amp;nbsp; if (VM.VerifyAssertions) {&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (!(index &gt; 0 &amp;amp;&amp;amp; index &amp;lt; Lock.numLocks())) {&lt;br&gt; @@ -56,180 +262,288 @@&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; VM.sysWriteln();&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; VM._assert(index &gt; 0 &amp;amp;&amp;amp; index &amp;lt; Lock.numLocks()); &amp;nbsp;// index is in range&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;VM._assert(!lockWord.and(TL_FAT_LOCK_MASK).isZero()); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// fat lock bit is set&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;VM._assert(Lock.getLock(index) != null); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // the lock is actually there&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;VM._assert(lockWord.and(TL_STAT_MASK).EQ(TL_STAT_FAT)); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// fat lock bit is set&lt;br&gt; &amp;nbsp; &amp;nbsp; }&lt;br&gt; &amp;nbsp; &amp;nbsp; return index;&lt;br&gt; &amp;nbsp; }&lt;br&gt; &lt;br&gt; - &amp;nbsp;/**&lt;br&gt; - &amp;nbsp; * Obtains a lock on the indicated object. &amp;nbsp;Abbreviated light-weight&lt;br&gt; - &amp;nbsp; * locking sequence inlined by the optimizing compiler for the&lt;br&gt; - &amp;nbsp; * prologue of synchronized methods and for the&lt;br&gt; - &amp;nbsp; * &amp;lt;code&gt;monitorenter&amp;lt;/code&gt; bytecode.&lt;br&gt; - &amp;nbsp; *&lt;br&gt; - &amp;nbsp; * @param o the object to be locked&lt;br&gt; - &amp;nbsp; * @param lockOffset the offset of the thin lock word in the object.&lt;br&gt; - &amp;nbsp; * @see org.jikesrvm.compilers.opt.hir2lir.ExpandRuntimeServices&lt;br&gt; - &amp;nbsp; */&lt;br&gt; &amp;nbsp; @Inline&lt;br&gt; - &amp;nbsp;@Entrypoint&lt;br&gt; - &amp;nbsp;@Unpreemptible(&quot;Become another thread when lock is contended, don't preempt in other cases&quot;)&lt;br&gt; - &amp;nbsp;static void inlineLock(Object o, Offset lockOffset) {&lt;br&gt; - &amp;nbsp; &amp;nbsp;Word old = Magic.prepareWord(o, lockOffset);&lt;br&gt; - &amp;nbsp; &amp;nbsp;if (old.rshl(TL_THREAD_ID_SHIFT).isZero()) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;// implies that fatbit == 0 &amp;amp; threadid == 0&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;int threadId = RVMThread.getCurrentThread().getLockingId();&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Magic.attemptWord(o, lockOffset, old, old.or(Word.fromIntZeroExtend(threadId)))) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.isync(); // don't use stale prefetched data in monitor&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (STATS) fastLocks++;&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // common case: o is now locked&lt;br&gt; + &amp;nbsp;@Uninterruptible&lt;br&gt; + &amp;nbsp;public static int getLockOwner(Word lockWord) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(!isFat(lockWord));&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (lockWord.and(TL_STAT_MASK).EQ(TL_STAT_BIASABLE)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (lockWord.and(TL_LOCK_COUNT_MASK).isZero()) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return 0;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return lockWord.and(TL_THREAD_ID_MASK).toInt();&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt; + &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;return lockWord.and(TL_THREAD_ID_MASK).toInt();&lt;br&gt; &amp;nbsp; &amp;nbsp; }&lt;br&gt; - &amp;nbsp; &amp;nbsp;lock(o, lockOffset); // uncommon case: default to out-of-line lock()&lt;br&gt; &amp;nbsp; }&lt;br&gt; &lt;br&gt; - &amp;nbsp;/**&lt;br&gt; - &amp;nbsp; * Releases the lock on the indicated object. &amp;nbsp;Abreviated&lt;br&gt; - &amp;nbsp; * light-weight unlocking sequence inlined by the optimizing&lt;br&gt; - &amp;nbsp; * compiler for the epilogue of synchronized methods and for the&lt;br&gt; - &amp;nbsp; * &amp;lt;code&gt;monitorexit&amp;lt;/code&gt; bytecode.&lt;br&gt; - &amp;nbsp; *&lt;br&gt; - &amp;nbsp; * @param o the object to be unlocked&lt;br&gt; - &amp;nbsp; * @param lockOffset the offset of the thin lock word in the object.&lt;br&gt; - &amp;nbsp; * @see org.jikesrvm.compilers.opt.hir2lir.ExpandRuntimeServices&lt;br&gt; - &amp;nbsp; */&lt;br&gt; &amp;nbsp; @Inline&lt;br&gt; - &amp;nbsp;@Entrypoint&lt;br&gt; - &amp;nbsp;@Unpreemptible(&quot;No preemption normally, but may raise exceptions&quot;)&lt;br&gt; - &amp;nbsp;static void inlineUnlock(Object o, Offset lockOffset) {&lt;br&gt; - &amp;nbsp; &amp;nbsp;Word old = Magic.prepareWord(o, lockOffset);&lt;br&gt; - &amp;nbsp; &amp;nbsp;Word threadId = Word.fromIntZeroExtend(RVMThread.getCurrentThread().getLockingId());&lt;br&gt; - &amp;nbsp; &amp;nbsp;if (old.xor(threadId).rshl(TL_LOCK_COUNT_SHIFT).isZero()) { // implies that fatbit == 0 &amp;amp;&amp;amp; count == 0 &amp;amp;&amp;amp; lockid == me&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.sync(); // memory barrier: subsequent locker will see previous writes&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Magic.attemptWord(o, lockOffset, old, old.and(TL_UNLOCK_MASK))) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return; // common case: o is now unlocked&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp;@Uninterruptible&lt;br&gt; + &amp;nbsp;public static int getRecCount(Word lockWord) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(getLockOwner(lockWord)!=0);&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (lockWord.and(TL_STAT_MASK).EQ(TL_STAT_BIASABLE)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;return lockWord.and(TL_LOCK_COUNT_MASK).rshl(TL_LOCK_COUNT_SHIFT).toInt();&lt;br&gt; + &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;return lockWord.and(TL_LOCK_COUNT_MASK).rshl(TL_LOCK_COUNT_SHIFT).toInt()+1;&lt;br&gt; &amp;nbsp; &amp;nbsp; }&lt;br&gt; - &amp;nbsp; &amp;nbsp;unlock(o, lockOffset); &amp;nbsp;// uncommon case: default to non inlined unlock()&lt;br&gt; &amp;nbsp; }&lt;br&gt; &lt;br&gt; - &amp;nbsp;/**&lt;br&gt; - &amp;nbsp; * O btains a lock on the indicated object. &amp;nbsp;Light-weight locking&lt;br&gt; - &amp;nbsp; * sequence for the prologue of synchronized methods and for the&lt;br&gt; - &amp;nbsp; * &amp;lt;code&gt;monitorenter&amp;lt;/code&gt; bytecode.&lt;br&gt; - &amp;nbsp; *&lt;br&gt; - &amp;nbsp; * @param o the object to be locked&lt;br&gt; - &amp;nbsp; * @param lockOffset the offset of the thin lock word in the object.&lt;br&gt; - &amp;nbsp; */&lt;br&gt; &amp;nbsp; @NoInline&lt;br&gt; - &amp;nbsp;@Unpreemptible(&quot;Become another thread when lock is contended, don't preempt in other cases&quot;)&lt;br&gt; - &amp;nbsp;public static void lock(Object o, Offset lockOffset) {&lt;br&gt; - &amp;nbsp; &amp;nbsp;major:&lt;br&gt; - &amp;nbsp; &amp;nbsp;while (true) { // repeat only if attempt to lock a promoted lock fails&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;int retries = retryLimit;&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;Word threadId = Word.fromIntZeroExtend(RVMThread.getCurrentThread().getLockingId());&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;while (0 != retries--) { // repeat if there is contention for thin lock&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word old = Magic.prepareWord(o, lockOffset);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word id = old.and(TL_THREAD_ID_MASK.or(TL_FAT_LOCK_MASK));&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (id.isZero()) { // o isn't locked&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Magic.attemptWord(o, lockOffset, old, old.or(threadId))) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.isync(); // don't use stale prefetched data in monitor&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (STATS) slowLocks++;&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break major; &amp;nbsp;// lock succeeds&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;continue; // contention, possibly spurious, try again&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (id.EQ(threadId)) { // this thread has o locked already&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word changed = old.toAddress().plus(TL_LOCK_COUNT_UNIT).toWord(); // update count&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (changed.and(TL_LOCK_COUNT_MASK).isZero()) { // count wrapped around (most unlikely), make heavy lock&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;while (!inflateAndLock(o, lockOffset)) { // wait for a lock to become available&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.yield();&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break major; &amp;nbsp;// lock succeeds (note that lockHeavy has issued an isync)&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Magic.attemptWord(o, lockOffset, old, changed)) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.isync(); // don't use stale prefetched data in monitor !!TODO: is this isync required?&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (STATS) slowLocks++;&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break major; &amp;nbsp;// lock succeeds&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;continue; // contention, probably spurious, try again (TODO!! worry about this)&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp;@Unpreemptible&lt;br&gt; + &amp;nbsp;public static boolean casFromBiased(Object o, Offset lockOffset,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word oldLockWord, Word changed,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int cnt) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;RVMThread me=RVMThread.getCurrentThread();&lt;br&gt; + &amp;nbsp; &amp;nbsp;Word id=oldLockWord.and(TL_THREAD_ID_MASK);&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (id.isZero()) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (false) VM.sysWriteln(&quot;id is zero - easy case.&quot;);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;return Synchronization.tryCompareAndSwap(o, lockOffset, oldLockWord, changed);&lt;br&gt; + &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (false) VM.sysWriteln(&quot;id = &quot;,id);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;int slot=id.toInt()&gt;&gt;TL_THREAD_ID_SHIFT;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (false) VM.sysWriteln(&quot;slot = &quot;,slot);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread owner=RVMThread.threadBySlot[slot];&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (owner==me /* I own it, so I can unbias it trivially. &amp;nbsp;This occurs&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; when we are inflating due to, for example, wait() */ ||&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;owner==null /* the thread that owned it is dead, so it's safe to&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; unbias. */) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// note that we use a CAS here, but it's only needed in the case&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// that owner==null, since in that case some other thread may also&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// be unbiasing.&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return Synchronization.tryCompareAndSwap(&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;o, lockOffset, oldLockWord, changed);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;boolean result=false;&lt;br&gt; &lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!(old.and(TL_FAT_LOCK_MASK).isZero())) { // o has a heavy lock&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int index = getLockIndex(old);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Lock.getLock(index).lockHeavy(o)) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break major; // lock succeeds (note that lockHeavy has issued an isync)&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// heavy lock failed (deflated or contention for system lock)&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.yield();&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;continue major; &amp;nbsp; &amp;nbsp;// try again&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// real contention: wait (hope other thread unlocks o), try again&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (traceContention) { // for performance tuning only (see section 5)&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Address fp = Magic.getFramePointer();&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fp = Magic.getCallerFramePointer(fp);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int mid = Magic.getCompiledMethodID(fp);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMMethod m1 = CompiledMethods.getCompiledMethod(mid).getMethod();&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fp = Magic.getCallerFramePointer(fp);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mid = Magic.getCompiledMethodID(fp);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMMethod m2 = CompiledMethods.getCompiledMethod(mid).getMethod();&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String s = m1.getDeclaringClass() + &quot;.&quot; + m1.getName() + &quot; &quot; + m2.getDeclaringClass() + &quot;.&quot; + m2.getName();&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.trace(Magic.getObjectType(o).toString(), s, -2 - retries);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (0 != retries) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.yield(); // wait, hope o gets unlocked&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// NB. this may stop a thread other than the one that had the bias,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// if that thread died and some other thread took its slot. &amp;nbsp;that's&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// why we do a CAS below. &amp;nbsp;it's only needed if some other thread&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// had seen the owner be null (which may happen if we came here after&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// a new thread took the slot while someone else came here when the&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// slot was still null). &amp;nbsp;if it was the case that everyone else had&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// seen a non-null owner, then the pair handshake would serve as&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// sufficient synchronization (the id would identify the set of threads&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// that shared that id's communicationLock). &amp;nbsp;oddly, that means that&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// this whole thing could be &quot;simplified&quot; to acquire the&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// communicationLock even if the owner was null. &amp;nbsp;but that would be&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// goofy.&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (false) VM.sysWriteln(&quot;entering pair handshake&quot;);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;owner.beginPairHandshake();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (false) VM.sysWriteln(&quot;done with that&quot;);&lt;br&gt; +&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word newLockWord=Magic.getWordAtOffset(o, lockOffset);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result=Synchronization.tryCompareAndSwap(&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;o, lockOffset, oldLockWord, changed);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;owner.endPairHandshake();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (false) VM.sysWriteln(&quot;that worked.&quot;);&lt;br&gt; +&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return result;&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;// create a heavy lock for o and lock it&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;if (inflateAndLock(o, lockOffset)) break;&lt;br&gt; &amp;nbsp; &amp;nbsp; }&lt;br&gt; - &amp;nbsp; &amp;nbsp;// o has been locked, must return before an exception can be thrown&lt;br&gt; &amp;nbsp; }&lt;br&gt; &lt;br&gt; + &amp;nbsp;@Inline&lt;br&gt; + &amp;nbsp;@Unpreemptible&lt;br&gt; + &amp;nbsp;public static boolean attemptToMarkInflated(Object o, Offset lockOffset,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word oldLockWord,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int lockId,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int cnt) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(oldLockWord.and(TL_STAT_MASK).NE(TL_STAT_FAT));&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (false) VM.sysWriteln(&quot;attemptToMarkInflated with oldLockWord = &quot;,oldLockWord);&lt;br&gt; + &amp;nbsp; &amp;nbsp;// what this needs to do:&lt;br&gt; + &amp;nbsp; &amp;nbsp;// 1) if the lock is thin, it's just a CAS&lt;br&gt; + &amp;nbsp; &amp;nbsp;// 2) if the lock is unbiased, CAS in the inflation&lt;br&gt; + &amp;nbsp; &amp;nbsp;// 3) if the lock is biased in our favor, store the lock without CAS&lt;br&gt; + &amp;nbsp; &amp;nbsp;// 4) if the lock is biased but to someone else, enter the pair handshake&lt;br&gt; + &amp;nbsp; &amp;nbsp;// &amp;nbsp; &amp;nbsp;to unbias it and install the inflated lock&lt;br&gt; + &amp;nbsp; &amp;nbsp;Word changed=&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;TL_STAT_FAT.or(Word.fromIntZeroExtend(lockId).lsh(TL_LOCK_ID_SHIFT))&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;.or(oldLockWord.and(TL_UNLOCK_MASK));&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (false &amp;amp;&amp;amp; oldLockWord.and(TL_STAT_MASK).EQ(TL_STAT_THIN))&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;VM.sysWriteln(&quot;obj = &quot;,Magic.objectAsAddress(o),&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&quot;, old = &quot;,oldLockWord,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&quot;, owner = &quot;,getLockOwner(oldLockWord),&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&quot;, rec = &quot;,getLockOwner(oldLockWord)==0?0:getRecCount(oldLockWord),&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&quot;, changed = &quot;,changed,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&quot;, lockId = &quot;,lockId);&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (false) VM.sysWriteln(&quot;changed = &quot;,changed);&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (oldLockWord.and(TL_STAT_MASK).EQ(TL_STAT_THIN)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (false) VM.sysWriteln(&quot;it's thin, inflating the easy way.&quot;);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;return Synchronization.tryCompareAndSwap(&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;o, lockOffset, oldLockWord, changed);&lt;br&gt; + &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;return casFromBiased(o, lockOffset, oldLockWord, changed, cnt);&lt;br&gt; + &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp;}&lt;br&gt; +&lt;br&gt; &amp;nbsp; /**&lt;br&gt; - &amp;nbsp; * Releases the lock on the indicated object. &amp;nbsp; Light-weight unlocking&lt;br&gt; - &amp;nbsp; * sequence for the epilogue of synchronized methods and for the&lt;br&gt; - &amp;nbsp; * &amp;lt;code&gt;monitorexit&amp;lt;/code&gt; bytecode.&lt;br&gt; + &amp;nbsp; * Promotes a light-weight lock to a heavy-weight lock. &amp;nbsp;If this returns the lock&lt;br&gt; + &amp;nbsp; * that you gave it, its mutex will be locked; otherwise, its mutex will be unlocked.&lt;br&gt; + &amp;nbsp; * Hence, calls to this method should always be followed by a condition lock() or&lt;br&gt; + &amp;nbsp; * unlock() call.&lt;br&gt; &amp;nbsp; &amp;nbsp;*&lt;br&gt; - &amp;nbsp; * @param o the object to be locked&lt;br&gt; + &amp;nbsp; * @param o the object to get a heavy-weight lock&lt;br&gt; &amp;nbsp; &amp;nbsp;* @param lockOffset the offset of the thin lock word in the object.&lt;br&gt; + &amp;nbsp; * @return the inflated lock; either the one you gave, or another one, if the lock&lt;br&gt; + &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; was inflated by some other thread.&lt;br&gt; &amp;nbsp; &amp;nbsp;*/&lt;br&gt; - &amp;nbsp;@NoInline&lt;br&gt; - &amp;nbsp;@Unpreemptible(&quot;No preemption normally, but may raise exceptions&quot;)&lt;br&gt; - &amp;nbsp;public static void unlock(Object o, Offset lockOffset) {&lt;br&gt; - &amp;nbsp; &amp;nbsp;Magic.sync(); // prevents stale data from being seen by next owner of the lock&lt;br&gt; - &amp;nbsp; &amp;nbsp;while (true) { // spurious contention detected&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;Word old = Magic.prepareWord(o, lockOffset);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;Word id = old.and(TL_THREAD_ID_MASK.or(TL_FAT_LOCK_MASK));&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;Word threadId = Word.fromIntZeroExtend(RVMThread.getCurrentThread().getLockingId());&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;if (id.NE(threadId)) { // not normal case&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!(old.and(TL_FAT_LOCK_MASK).isZero())) { // o has a heavy lock&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Lock.getLock(getLockIndex(old)).unlockHeavy(o);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// note that unlockHeavy has issued a sync&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;br&gt; + &amp;nbsp;@NoNullCheck&lt;br&gt; + &amp;nbsp;@Unpreemptible&lt;br&gt; + &amp;nbsp;protected static Lock attemptToInflate(Object o,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Offset lockOffset,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Lock l) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (false) VM.sysWriteln(&quot;l = &quot;,Magic.objectAsAddress(l));&lt;br&gt; + &amp;nbsp; &amp;nbsp;l.mutex.lock();&lt;br&gt; + &amp;nbsp; &amp;nbsp;for (int cnt=0;;++cnt) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Word bits = Magic.getWordAtOffset(o, lockOffset);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;// check to see if another thread has already created a fat lock&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (isFat(bits)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (trace) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;VM.sysWriteln(&quot;Thread #&quot;,RVMThread.getCurrentThreadSlot(),&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&quot;: freeing lock &quot;,Magic.objectAsAddress(l),&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&quot; because we had a double-inflate&quot;);&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.trace(&quot;Lock&quot;, &quot;unlock error: thin lock word = &quot;, old.toAddress());&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.trace(&quot;Lock&quot;, &quot;unlock error: thin lock word = &quot;, Magic.objectAsAddress(o));&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// RVMThread.trace(&quot;Lock&quot;, RVMThread.getCurrentThread().toString(), 0);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.raiseIllegalMonitorStateException(&quot;thin unlocking&quot;, o);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Lock result = Lock.getLock(getLockIndex(bits));&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (result==null ||&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result.lockedObject!=o) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;continue; /* this is nasty. &amp;nbsp;this will happen when a lock&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; is deflated. */&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Lock.free(l);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;l.mutex.unlock();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return result;&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;if (old.and(TL_LOCK_COUNT_MASK).isZero()) { // get count, 0 is the last lock&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word changed = old.and(TL_UNLOCK_MASK);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Magic.attemptWord(o, lockOffset, old, changed)) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return; // unlock succeeds&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(l!=null);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (attemptToMarkInflated(&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;o, lockOffset, bits, l.index, cnt)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;l.setLockedObject(o);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;l.setOwnerId(getLockOwner(bits));&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (l.getOwnerId() != 0) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;l.setRecursionCount(getRecCount(bits));&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(l.getRecursionCount()==0);&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;continue;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return l;&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;// more than one lock&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;// decrement recursion count&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;Word changed = old.toAddress().minus(TL_LOCK_COUNT_UNIT).toWord();&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Magic.attemptWord(o, lockOffset, old, changed)) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return; // unlock succeeds&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;// contention detected, try again&lt;br&gt; + &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp;}&lt;br&gt; +&lt;br&gt; + &amp;nbsp;@Inline&lt;br&gt; + &amp;nbsp;@Uninterruptible&lt;br&gt; + &amp;nbsp;private static Word biasBitsToThinBits(Word bits) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;int lockOwner=getLockOwner(bits);&lt;br&gt; +&lt;br&gt; + &amp;nbsp; &amp;nbsp;Word changed=bits.and(TL_UNLOCK_MASK).or(TL_STAT_THIN);&lt;br&gt; +&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (lockOwner!=0) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;int recCount=getRecCount(bits);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;changed=changed&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.or(Word.fromIntZeroExtend(lockOwner))&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.or(Word.fromIntZeroExtend(recCount-1).lsh(TL_LOCK_COUNT_SHIFT));&lt;br&gt; + &amp;nbsp; &amp;nbsp;}&lt;br&gt; +&lt;br&gt; + &amp;nbsp; &amp;nbsp;return changed;&lt;br&gt; + &amp;nbsp;}&lt;br&gt; +&lt;br&gt; + &amp;nbsp;@Inline&lt;br&gt; + &amp;nbsp;@Uninterruptible&lt;br&gt; + &amp;nbsp;public static boolean attemptToMarkDeflated(Object o, Offset lockOffset,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word oldLockWord) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;// we allow concurrent modification of the lock word when it's thin or fat.&lt;br&gt; + &amp;nbsp; &amp;nbsp;Word changed=oldLockWord.and(TL_UNLOCK_MASK).or(TL_STAT_THIN);&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(getLockOwner(changed)==0);&lt;br&gt; + &amp;nbsp; &amp;nbsp;return Synchronization.tryCompareAndSwap(&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;o, lockOffset, oldLockWord, changed);&lt;br&gt; + &amp;nbsp;}&lt;br&gt; +&lt;br&gt; + &amp;nbsp;@Uninterruptible&lt;br&gt; + &amp;nbsp;public static void markDeflated(Object o, Offset lockOffset, int id) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;for (;;) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Word bits=Magic.getWordAtOffset(o, lockOffset);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(isFat(bits));&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(getLockIndex(bits)==id);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (attemptToMarkDeflated(o, lockOffset, bits)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt; &amp;nbsp; &amp;nbsp; }&lt;br&gt; &amp;nbsp; }&lt;br&gt; &lt;br&gt; + &amp;nbsp;@NoNullCheck&lt;br&gt; + &amp;nbsp;@Unpreemptible&lt;br&gt; + &amp;nbsp;public static boolean lockHeader(Object o, Offset lockOffset) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;// what this should do:&lt;br&gt; + &amp;nbsp; &amp;nbsp;// 1) take advantage of the fact that if a lock is fat it can only go back to&lt;br&gt; + &amp;nbsp; &amp;nbsp;// &amp;nbsp; &amp;nbsp;being thin, so concurrent modification of the lock word is allowed.&lt;br&gt; + &amp;nbsp; &amp;nbsp;// 2) if it's biased, we own it anyway so we can &quot;lock&quot; it by incrementing the&lt;br&gt; + &amp;nbsp; &amp;nbsp;// &amp;nbsp; &amp;nbsp;count.&lt;br&gt; + &amp;nbsp; &amp;nbsp;Word threadId = Word.fromIntZeroExtend(RVMThread.getCurrentThread().getLockingId());&lt;br&gt; + &amp;nbsp; &amp;nbsp;for (;;) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;boolean attemptToInflate=false;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Word old=Magic.getWordAtOffset(o,lockOffset);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (old.and(TL_STAT_MASK).NE(TL_STAT_BIASABLE)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(old.and(TL_STAT_MASK).EQ(TL_STAT_THIN) ||&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;old.and(TL_STAT_MASK).EQ(TL_STAT_FAT));&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return false;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word id = old.and(TL_THREAD_ID_MASK);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// what do we do here? &amp;nbsp;if we have the bias, then it's easy. &amp;nbsp;but what&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// if we don't? &amp;nbsp;in that case we need to be ultra-careful. &amp;nbsp;what we can&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// do:&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// 1) if the lock is biased in our favor, then lock it&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// 2) if the lock is unbiased, then bias it in our favor an lock it&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// 3) if the lock is biased in someone else's favor, inflate it (so we can go above)&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (id.isZero()) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// lock is unbiased, bias it in our favor and grab it&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Synchronization.tryCompareAndSwap(&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;o, lockOffset,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;old,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;old.or(threadId).toAddress().plus(TL_LOCK_COUNT_UNIT).toWord())) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.isync();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return true;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (id.EQ(threadId)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// lock is biased in our favor, so grab it&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word changed = old.toAddress().plus(TL_LOCK_COUNT_UNIT).toWord();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!changed.and(TL_LOCK_COUNT_MASK).isZero()) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.setWordAtOffset(o, lockOffset, changed);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return true;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;attemptToInflate=true;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;attemptToInflate=true;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; +&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (attemptToInflate) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;inflate(o,lockOffset);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp;}&lt;br&gt; +&lt;br&gt; + &amp;nbsp;@NoNullCheck&lt;br&gt; + &amp;nbsp;@Unpreemptible&lt;br&gt; + &amp;nbsp;public static void unlockHeader(Object o, Offset lockOffset,boolean lockHeaderResult) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;// what to do here?&lt;br&gt; + &amp;nbsp; &amp;nbsp;// 1) if lockHeaderResult is false, we're done&lt;br&gt; + &amp;nbsp; &amp;nbsp;// 2) if lockHeaderResult is true, release the lock.&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (lockHeaderResult) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;unlock(o, lockOffset);&lt;br&gt; + &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp;}&lt;br&gt; +&lt;br&gt; + &amp;nbsp;@Inline&lt;br&gt; + &amp;nbsp;@Uninterruptible&lt;br&gt; + &amp;nbsp;public static boolean allowHeaderCAS(Object o, Offset lockOffset) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;return Magic.getWordAtOffset(o,lockOffset).and(TL_STAT_MASK).NE(TL_STAT_BIASABLE);&lt;br&gt; + &amp;nbsp;}&lt;br&gt; +&lt;br&gt; &amp;nbsp; ////////////////////////////////////////////////////////////////&lt;br&gt; &amp;nbsp; /// Support for inflating (and deflating) heavy-weight locks ///&lt;br&gt; &amp;nbsp; ////////////////////////////////////////////////////////////////&lt;br&gt; @@ -246,11 +560,6 @@&lt;br&gt; &amp;nbsp; &amp;nbsp;*/&lt;br&gt; &amp;nbsp; @Unpreemptible&lt;br&gt; &amp;nbsp; private static Lock inflate(Object o, Offset lockOffset) {&lt;br&gt; - &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;VM._assert(holdsLock(o, lockOffset, RVMThread.getCurrentThread()));&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;// this assertions is just plain wrong.&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;//VM._assert((Magic.getWordAtOffset(o, lockOffset).and(TL_FAT_LOCK_MASK).isZero()));&lt;br&gt; - &amp;nbsp; &amp;nbsp;}&lt;br&gt; &amp;nbsp; &amp;nbsp; Lock l = Lock.allocate();&lt;br&gt; &amp;nbsp; &amp;nbsp; if (VM.VerifyAssertions) {&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; VM._assert(l != null); // inflate called by wait (or notify) which shouldn't be called during GC&lt;br&gt; @@ -283,86 +592,6 @@&lt;br&gt; &amp;nbsp; &amp;nbsp; return l.lockHeavyLocked(o);&lt;br&gt; &amp;nbsp; }&lt;br&gt; &lt;br&gt; - &amp;nbsp;/**&lt;br&gt; - &amp;nbsp; * Promotes a light-weight lock to a heavy-weight lock.&lt;br&gt; - &amp;nbsp; *&lt;br&gt; - &amp;nbsp; * @param o the object to get a heavy-weight lock&lt;br&gt; - &amp;nbsp; * @param lockOffset the offset of the thin lock word in the object.&lt;br&gt; - &amp;nbsp; * @return whether the object was successfully locked&lt;br&gt; - &amp;nbsp; */&lt;br&gt; - &amp;nbsp;private static Lock attemptToInflate(Object o, Offset lockOffset, Lock l) {&lt;br&gt; - &amp;nbsp; &amp;nbsp;Word old;&lt;br&gt; - &amp;nbsp; &amp;nbsp;l.mutex.lock();&lt;br&gt; - &amp;nbsp; &amp;nbsp;do {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;old = Magic.prepareWord(o, lockOffset);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;// check to see if another thread has already created a fat lock&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!(old.and(TL_FAT_LOCK_MASK).isZero())) { // already a fat lock in place&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Lock.trace) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;VM.sysWriteln(&quot;Thread #&quot;,RVMThread.getCurrentThreadSlot(),&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&quot;: freeing lock &quot;,Magic.objectAsAddress(l),&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&quot; because we had a double-inflate&quot;);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Lock.free(l);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;l.mutex.unlock();&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;l = Lock.getLock(getLockIndex(old));&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return l;&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;Word locked = TL_FAT_LOCK_MASK.or(Word.fromIntZeroExtend(l.index).lsh(TL_LOCK_ID_SHIFT));&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;Word changed = locked.or(old.and(TL_UNLOCK_MASK));&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(getLockIndex(changed) == l.index);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Magic.attemptWord(o, lockOffset, old, changed)) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;l.setLockedObject(o);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;l.setOwnerId(old.and(TL_THREAD_ID_MASK).toInt());&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (l.getOwnerId() != 0) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;l.setRecursionCount(old.and(TL_LOCK_COUNT_MASK).rshl(TL_LOCK_COUNT_SHIFT).toInt() + 1);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return l;&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;// contention detected, try again&lt;br&gt; - &amp;nbsp; &amp;nbsp;} while (true);&lt;br&gt; - &amp;nbsp;}&lt;br&gt; -&lt;br&gt; - &amp;nbsp;public static void deflate(Object o, Offset lockOffset, Lock l) {&lt;br&gt; - &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;Word old = Magic.getWordAtOffset(o, lockOffset);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;VM._assert(!(old.and(TL_FAT_LOCK_MASK).isZero()));&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;VM._assert(l == Lock.getLock(getLockIndex(old)));&lt;br&gt; - &amp;nbsp; &amp;nbsp;}&lt;br&gt; - &amp;nbsp; &amp;nbsp;Word old;&lt;br&gt; - &amp;nbsp; &amp;nbsp;do {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;old = Magic.prepareWord(o, lockOffset);&lt;br&gt; - &amp;nbsp; &amp;nbsp;} while (!Magic.attemptWord(o, lockOffset, old, old.and(TL_UNLOCK_MASK)));&lt;br&gt; - &amp;nbsp;}&lt;br&gt; -&lt;br&gt; - &amp;nbsp;/**&lt;br&gt; - &amp;nbsp; * @param obj an object&lt;br&gt; - &amp;nbsp; * @param lockOffset the offset of the thin lock word in the object.&lt;br&gt; - &amp;nbsp; * @param thread a thread&lt;br&gt; - &amp;nbsp; * @return &amp;lt;code&gt;true&amp;lt;/code&gt; if the lock on obj at offset lockOffset is currently owned&lt;br&gt; - &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; by thread &amp;lt;code&gt;false&amp;lt;/code&gt; if it is not.&lt;br&gt; - &amp;nbsp; */&lt;br&gt; - &amp;nbsp;public static boolean holdsLock(Object obj, Offset lockOffset, RVMThread thread) {&lt;br&gt; - &amp;nbsp; &amp;nbsp;int tid = thread.getLockingId();&lt;br&gt; - &amp;nbsp; &amp;nbsp;Word bits = Magic.getWordAtOffset(obj, lockOffset);&lt;br&gt; - &amp;nbsp; &amp;nbsp;if (bits.and(TL_FAT_LOCK_MASK).isZero()) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;// if locked, then it is locked with a thin lock&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;return (bits.and(ThinLockConstants.TL_THREAD_ID_MASK).toInt() == tid);&lt;br&gt; - &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;// if locked, then it is locked with a fat lock&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;// but, if it's locked by someone else, the fat lock may get deflated,&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;// and then reinflated on this thread's behalf. &amp;nbsp;so we need to be careful.&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;int index = getLockIndex(bits);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;Lock l = Lock.getLock(index);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;boolean result=false;&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;if (l!=null) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;l.mutex.lock();&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result = (l.getOwnerId()==tid &amp;amp;&amp;amp; l.getLockedObject()==obj);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;l.mutex.unlock();&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;return result;&lt;br&gt; - &amp;nbsp; &amp;nbsp;}&lt;br&gt; - &amp;nbsp;}&lt;br&gt; -&lt;br&gt; &amp;nbsp; ////////////////////////////////////////////////////////////////////////////&lt;br&gt; &amp;nbsp; /// Get heavy-weight lock for an object; if thin, inflate it.&lt;br&gt; &amp;nbsp; ////////////////////////////////////////////////////////////////////////////&lt;br&gt; @@ -380,14 +609,13 @@&lt;br&gt; &amp;nbsp; @Unpreemptible&lt;br&gt; &amp;nbsp; public static Lock getHeavyLock(Object o, Offset lockOffset, boolean create) {&lt;br&gt; &amp;nbsp; &amp;nbsp; Word old = Magic.getWordAtOffset(o, lockOffset);&lt;br&gt; - &amp;nbsp; &amp;nbsp;if (!(old.and(TL_FAT_LOCK_MASK).isZero())) { // already a fat lock in place&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (isFat(old)) { // already a fat lock in place&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; return Lock.getLock(getLockIndex(old));&lt;br&gt; &amp;nbsp; &amp;nbsp; } else if (create) {&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; return inflate(o, lockOffset);&lt;br&gt; &amp;nbsp; &amp;nbsp; } else {&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; return null;&lt;br&gt; &amp;nbsp; &amp;nbsp; }&lt;br&gt; -&lt;br&gt; &amp;nbsp; }&lt;br&gt; &lt;br&gt; &amp;nbsp; ///////////////////////////////////////////////////////////////&lt;br&gt; @@ -397,22 +625,16 @@&lt;br&gt; &amp;nbsp; /**&lt;br&gt; &amp;nbsp; &amp;nbsp;* Number of times a thread yields before inflating the lock on a&lt;br&gt; &amp;nbsp; &amp;nbsp;* object to a heavy-weight lock. &amp;nbsp;The current value was for the&lt;br&gt; - &amp;nbsp; * portBOB benchmark on a 12-way SMP (AIX) in the Fall of '99. &amp;nbsp;This&lt;br&gt; - &amp;nbsp; * is almost certainly not the optimal value.&lt;br&gt; + &amp;nbsp; * portBOB benchmark on a 12-way SMP (AIX) in the Fall of '99. &amp;nbsp;FP&lt;br&gt; + &amp;nbsp; * confirmed that it's still optimal for JBB and DaCapo on 4-, 8-,&lt;br&gt; + &amp;nbsp; * and 16-way SMPs (Linux/ia32) in Spring '09.&lt;br&gt; &amp;nbsp; &amp;nbsp;*/&lt;br&gt; - &amp;nbsp;private static final int retryLimit = 40; // (-1 is effectively infinity)&lt;br&gt; + &amp;nbsp;private static final int retryLimit = 40;&lt;br&gt; &lt;br&gt; - &amp;nbsp;/**&lt;br&gt; - &amp;nbsp; * Should we trace lockContention to enable debugging?&lt;br&gt; - &amp;nbsp; */&lt;br&gt; - &amp;nbsp;private static final boolean traceContention = false;&lt;br&gt; + &amp;nbsp;static final boolean STATS = Lock.STATS;&lt;br&gt; &lt;br&gt; - &amp;nbsp;//////////////////////////////////////////////&lt;br&gt; - &amp;nbsp;// &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Statistics &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //&lt;br&gt; - &amp;nbsp;//////////////////////////////////////////////&lt;br&gt; + &amp;nbsp;static final boolean trace = false;&lt;br&gt; &lt;br&gt; - &amp;nbsp;static final boolean STATS = Lock.STATS;&lt;br&gt; -&lt;br&gt; &amp;nbsp; static int fastLocks;&lt;br&gt; &amp;nbsp; static int slowLocks;&lt;/tt&gt;&lt;br&gt; &lt;tt&gt;&amp;nbsp;&lt;br&gt; &lt;br&gt; &lt;br&gt; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.&lt;br&gt; &lt;br&gt; ------------------------------------------------------------------------------&lt;br&gt; The NEW KODAK i700 Series Scanners deliver under ANY circumstances! Your&lt;br&gt; production scanning environment may not be a perfect world - but thanks to&lt;br&gt; Kodak, there's a perfect scanner to get the job done! With the NEW KODAK i700&lt;br&gt; Series Scanner you'll get full speed at 300 dpi even with all image &lt;br&gt; processing features enabled. &lt;/tt&gt;&lt;tt&gt;&lt;a href=&quot;http://p.sf.net/sfu/kodak-com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/kodak-com&lt;/a&gt;&lt;/tt&gt;&lt;tt&gt;&lt;br&gt; _______________________________________________&lt;br&gt; Jikesrvm-commits mailing list&lt;br&gt; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=23439274&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Jikesrvm-commits@...&lt;/a&gt;&lt;br&gt; &lt;/tt&gt;&lt;tt&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/jikesrvm-commits&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/jikesrvm-commits&lt;/a&gt;&lt;/tt&gt;&lt;tt&gt;&lt;br&gt; &lt;/tt&gt;&lt;br&gt; &lt;/div&gt; ------------------------------------------------------------------------------&lt;br&gt;The NEW KODAK i700 Series Scanners deliver under ANY circumstances! Your&lt;br&gt;production scanning environment may not be a perfect world - but thanks to&lt;br&gt;Kodak, there's a perfect scanner to get the job done! With the NEW KODAK i700&lt;br&gt;Series Scanner you'll get full speed at 300 dpi even with all image &lt;br&gt;processing features enabled. &lt;a href=&quot;http://p.sf.net/sfu/kodak-com_______________________________________________&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/kodak-com_______________________________________________&lt;/a&gt;&lt;br&gt;Jikesrvm-core mailing list&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=23439274&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Jikesrvm-core@...&lt;/a&gt;&lt;br&gt;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&lt;br&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;/body&gt;&lt;/html&gt;&lt;br /&gt;------------------------------------------------------------------------------
&lt;br&gt;The NEW KODAK i700 Series Scanners deliver under ANY circumstances! Your
&lt;br&gt;production scanning environment may not be a perfect world - but thanks to
&lt;br&gt;Kodak, there's a perfect scanner to get the job done! With the NEW KODAK i700
&lt;br&gt;Series Scanner you'll get full speed at 300 dpi even with all image 
&lt;br&gt;processing features enabled. &lt;a href=&quot;http://p.sf.net/sfu/kodak-com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://p.sf.net/sfu/kodak-com&lt;/a&gt;&lt;br /&gt;_______________________________________________
&lt;br&gt;Jikesrvm-core mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=23439274&amp;i=4&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Jikesrvm-core@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.sourceforge.net/lists/listinfo/jikesrvm-core&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Re%3A--rvm-core---rvm-commits--SF.net-SVN%3A-jikesrvm%3A-15685--rvmroot-trunk-tp23439089p23439274.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-23439158</id>
	<title>Re: [rvm-core] [rvm-commits] SF.net SVN: jikesrvm:[15685] rvmroot/trunk</title>
	<published>2009-05-07T19:44:30Z</published>
	<updated>2009-05-07T19:44:30Z</updated>
	<author>
		<name>Filip Pizlo-2</name>
	</author>
	<content type="html">&lt;html&gt;&lt;body style=&quot;word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; &quot;&gt;Awkward. &amp;nbsp;Pre-commit tests passed before I committed. &amp;nbsp;Investigating now...&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;-F&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;div&gt;&lt;div&gt;On May 7, 2009, at 10:36 PM, David P Grove wrote:&lt;/div&gt;&lt;br class=&quot;Apple-interchange-newline&quot;&gt;&lt;blockquote type=&quot;cite&quot;&gt;&lt;div&gt;&lt;p&gt;svn head doesn't compile.  Please fix.  &lt;br&gt; &lt;br&gt; thanks,&lt;br&gt; &lt;br&gt; --dave&lt;br&gt; &lt;br&gt; do-checkstyle:&lt;br&gt; &lt;br&gt; compile:&lt;br&gt;    [mkdir] Created dir: /home/dgrove/rvm-trunk/target/prototype_ia32-linux/classes&lt;br&gt;    [javac] Compiling 88 source files to /home/dgrove/rvm-trunk/target/prototype_ia32-linux/classes&lt;br&gt;    [javac] /home/dgrove/rvm-trunk/rvm/src/org/jikesrvm/scheduler/Lock.java:315: cannot find symbol&lt;br&gt;    [javac] symbol  : method markDeflated(java.lang.Object,org.vmmagic.unboxed.Offset,int)&lt;br&gt;    [javac] location: class org.jikesrvm.scheduler.ThinLock&lt;br&gt;    [javac]     ThinLock.markDeflated(o, lockOffset, index);&lt;br&gt;    [javac]             ^&lt;br&gt;    [javac] Note: * uses or overrides a deprecated API.&lt;br&gt;    [javac] Note: Recompile with -Xlint:deprecation for details.&lt;br&gt;    [javac] Note: Some input files use unchecked or unsafe operations.&lt;br&gt;    [javac] Note: Recompile with -Xlint:unchecked for details.&lt;br&gt;    [javac] 1 error&lt;br&gt; &lt;br&gt; BUILD FAILED&lt;br&gt; /home/dgrove/rvm-trunk/build.xml:1079: The following error occurred while executing this line:&lt;br&gt; /home/dgrove/rvm-trunk/build.xml:1092: Compile failed; see the compiler error output for details.&lt;br&gt; &lt;br&gt; &lt;br&gt; &lt;span&gt;&amp;lt;graycol.gif&gt;&lt;/span&gt;&lt;font color=&quot;#424282&quot;&gt;pizlo---05/07/2009 06:40:28 PM---Revision: 15685           &lt;a href=&quot;http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=15685&amp;amp;view=rev&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=15685&amp;amp;view=rev&lt;/a&gt;&lt;/font&gt;&lt;br&gt; &lt;br&gt; &lt;table width=&quot;100%&quot; border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt; &lt;tbody&gt;&lt;tr valign=&quot;top&quot;&gt;&lt;td width=&quot;1%&quot;&gt;&lt;span&gt;&amp;lt;ecblank.gif&gt;&lt;/span&gt;&lt;br&gt; &lt;font size=&quot;2&quot; color=&quot;#5F5F5F&quot;&gt;From:&lt;/font&gt;&lt;/td&gt;&lt;td width=&quot;100%&quot;&gt;&lt;span&gt;&amp;lt;ecblank.gif&gt;&lt;/span&gt;&lt;br&gt; &lt;font size=&quot;2&quot;&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=23439158&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;pizlo@...&lt;/a&gt;&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr valign=&quot;top&quot;&gt;&lt;td width=&quot;1%&quot;&gt;&lt;span&gt;&amp;lt;ecblank.gif&gt;&lt;/span&gt;&lt;br&gt; &lt;font size=&quot;2&quot; color=&quot;#5F5F5F&quot;&gt;To:&lt;/font&gt;&lt;/td&gt;&lt;td width=&quot;100%&quot;&gt;&lt;span&gt;&amp;lt;ecblank.gif&gt;&lt;/span&gt;&lt;br&gt; &lt;font size=&quot;2&quot;&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=23439158&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;jikesrvm-commits@...&lt;/a&gt;&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr valign=&quot;top&quot;&gt;&lt;td width=&quot;1%&quot;&gt;&lt;span&gt;&amp;lt;ecblank.gif&gt;&lt;/span&gt;&lt;br&gt; &lt;font size=&quot;2&quot; color=&quot;#5F5F5F&quot;&gt;Date:&lt;/font&gt;&lt;/td&gt;&lt;td width=&quot;100%&quot;&gt;&lt;span&gt;&amp;lt;ecblank.gif&gt;&lt;/span&gt;&lt;br&gt; &lt;font size=&quot;2&quot;&gt;05/07/2009 06:40 PM&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr valign=&quot;top&quot;&gt;&lt;td width=&quot;1%&quot;&gt;&lt;span&gt;&amp;lt;ecblank.gif&gt;&lt;/span&gt;&lt;br&gt; &lt;font size=&quot;2&quot; color=&quot;#5F5F5F&quot;&gt;Subject:&lt;/font&gt;&lt;/td&gt;&lt;td width=&quot;100%&quot;&gt;&lt;span&gt;&amp;lt;ecblank.gif&gt;&lt;/span&gt;&lt;br&gt; &lt;font size=&quot;2&quot;&gt;[rvm-commits] SF.net SVN: jikesrvm:[15685] rvmroot/trunk&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;&lt;hr width=&quot;100%&quot; size=&quot;2&quot; align=&quot;left&quot; noshade=&quot;&quot; style=&quot;color:#8091A5; &quot;&gt;&lt;br&gt; &lt;br&gt; &lt;br&gt; &lt;tt&gt;Revision: 15685&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/tt&gt;&lt;tt&gt;&lt;a href=&quot;http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=15685&amp;amp;view=rev&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=15685&amp;amp;view=rev&lt;/a&gt;&lt;/tt&gt;&lt;tt&gt;&lt;br&gt; Author: &amp;nbsp; pizlo&lt;br&gt; Date: &amp;nbsp; &amp;nbsp; 2009-05-07 22:40:00 +0000 (Thu, 07 May 2009)&lt;br&gt; &lt;br&gt; Log Message:&lt;br&gt; -----------&lt;br&gt; Merging biased locking support. &amp;nbsp;Biased locking is on by default and there is currently no way to disable it (except potentially by some small hacks in the code). &amp;nbsp;On DaCapo, we see no performance degradation on any benchmark; instead we see a 6% performance boost in the geomean.&lt;br&gt; &lt;br&gt; Modified Paths:&lt;br&gt; --------------&lt;br&gt; &amp;nbsp; &amp;nbsp;rvmroot/trunk/build/primordials/RVM.txt&lt;br&gt; &amp;nbsp; &amp;nbsp;rvmroot/trunk/rvm/src/org/jikesrvm/VM.java&lt;br&gt; &amp;nbsp; &amp;nbsp;rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/bc2ir/BC2IR.java&lt;br&gt; &amp;nbsp; &amp;nbsp;rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/JavaHeader.java&lt;br&gt; &amp;nbsp; &amp;nbsp;rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ObjectModel.java&lt;br&gt; &amp;nbsp; &amp;nbsp;rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ThinLockConstants.java&lt;br&gt; &amp;nbsp; &amp;nbsp;rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Lock.java&lt;br&gt; &amp;nbsp; &amp;nbsp;rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/RVMThread.java&lt;br&gt; &amp;nbsp; &amp;nbsp;rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Synchronization.java&lt;br&gt; &amp;nbsp; &amp;nbsp;rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/ThinLock.java&lt;br&gt; &lt;br&gt; Modified: rvmroot/trunk/build/primordials/RVM.txt&lt;br&gt; ===================================================================&lt;br&gt; --- rvmroot/trunk/build/primordials/RVM.txt		 2009-05-07 20:08:18 UTC (rev 15684)&lt;br&gt; +++ rvmroot/trunk/build/primordials/RVM.txt		 2009-05-07 22:40:00 UTC (rev 15685)&lt;br&gt; @@ -54,6 +54,8 @@&lt;br&gt; [[Lorg/jikesrvm/scheduler/RVMThread;&lt;br&gt; [Lorg/jikesrvm/scheduler/RVMThread$BlockAdapter;&lt;br&gt; [[Lorg/jikesrvm/scheduler/RVMThread$BlockAdapter;&lt;br&gt; +Lorg/jikesrvm/scheduler/ThinLock;&lt;br&gt; +Lorg/jikesrvm/scheduler/Lock;&lt;br&gt; [Lorg/jikesrvm/scheduler/Lock;&lt;br&gt; [[Lorg/jikesrvm/scheduler/Lock;&lt;br&gt; &lt;br&gt; &lt;br&gt; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/VM.java&lt;br&gt; ===================================================================&lt;br&gt; --- rvmroot/trunk/rvm/src/org/jikesrvm/VM.java		 2009-05-07 20:08:18 UTC (rev 15684)&lt;br&gt; +++ rvmroot/trunk/rvm/src/org/jikesrvm/VM.java		 2009-05-07 22:40:00 UTC (rev 15685)&lt;br&gt; @@ -2058,6 +2058,25 @@&lt;br&gt; &amp;nbsp; &amp;nbsp; swUnlock();&lt;br&gt; &amp;nbsp; }&lt;br&gt; &lt;br&gt; + &amp;nbsp;@NoInline&lt;br&gt; + &amp;nbsp;public static void sysWriteln(String s0, Address a1, String s1, Word w1, String s2, int i1, String s3, int i2, String s4, Word w2, String s5, int i3) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;swLock();&lt;br&gt; + &amp;nbsp; &amp;nbsp;write(s0);&lt;br&gt; + &amp;nbsp; &amp;nbsp;write(a1);&lt;br&gt; + &amp;nbsp; &amp;nbsp;write(s1);&lt;br&gt; + &amp;nbsp; &amp;nbsp;write(w1);&lt;br&gt; + &amp;nbsp; &amp;nbsp;write(s2);&lt;br&gt; + &amp;nbsp; &amp;nbsp;write(i1);&lt;br&gt; + &amp;nbsp; &amp;nbsp;write(s3);&lt;br&gt; + &amp;nbsp; &amp;nbsp;write(i2);&lt;br&gt; + &amp;nbsp; &amp;nbsp;write(s4);&lt;br&gt; + &amp;nbsp; &amp;nbsp;write(w2);&lt;br&gt; + &amp;nbsp; &amp;nbsp;write(s5);&lt;br&gt; + &amp;nbsp; &amp;nbsp;write(i3);&lt;br&gt; + &amp;nbsp; &amp;nbsp;writeln();&lt;br&gt; + &amp;nbsp; &amp;nbsp;swUnlock();&lt;br&gt; + &amp;nbsp;}&lt;br&gt; +&lt;br&gt; &amp;nbsp; private static void showThread() {&lt;br&gt; &amp;nbsp; &amp;nbsp; write(&quot;Thread &quot;);&lt;br&gt; &amp;nbsp; &amp;nbsp; write(RVMThread.getCurrentThread().getThreadSlot());&lt;br&gt; &lt;br&gt; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/bc2ir/BC2IR.java&lt;br&gt; ===================================================================&lt;br&gt; --- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/bc2ir/BC2IR.java		 2009-05-07 20:08:18 UTC (rev 15684)&lt;br&gt; +++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/bc2ir/BC2IR.java		 2009-05-07 22:40:00 UTC (rev 15685)&lt;br&gt; @@ -3635,6 +3635,7 @@&lt;br&gt; &amp;nbsp; &amp;nbsp;*/&lt;br&gt; &amp;nbsp; public boolean do_NullCheck(Operand ref) {&lt;br&gt; &amp;nbsp; &amp;nbsp; if (gc.noNullChecks()) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;setCurrentGuard(new TrueGuardOperand());&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; return false;&lt;br&gt; &amp;nbsp; &amp;nbsp; }&lt;br&gt; &amp;nbsp; &amp;nbsp; if (ref.isDefinitelyNull()) {&lt;br&gt; &lt;br&gt; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/JavaHeader.java&lt;br&gt; ===================================================================&lt;br&gt; --- rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/JavaHeader.java		 2009-05-07 20:08:18 UTC (rev 15684)&lt;br&gt; +++ rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/JavaHeader.java		 2009-05-07 22:40:00 UTC (rev 15685)&lt;br&gt; @@ -492,6 +492,7 @@&lt;br&gt; &amp;nbsp; &amp;nbsp;* Get the hash code of an object.&lt;br&gt; &amp;nbsp; &amp;nbsp;*/&lt;br&gt; &amp;nbsp; @Inline&lt;br&gt; + &amp;nbsp;@Interruptible&lt;br&gt; &amp;nbsp; public static int getObjectHashCode(Object o) {&lt;br&gt; &amp;nbsp; &amp;nbsp; if (ADDRESS_BASED_HASHING) {&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (MemoryManagerConstants.MOVES_OBJECTS) {&lt;br&gt; @@ -513,10 +514,18 @@&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } else {&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // UNHASHED&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word tmp;&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;do {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tmp = Magic.prepareWord(o, STATUS_OFFSET);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} while (!Magic.attemptWord(o, STATUS_OFFSET, tmp, tmp.or(HASH_STATE_HASHED)));&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;boolean lhr=ThinLock.lockHeader(o, STATUS_OFFSET);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (lhr) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.setWordAtOffset(&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;o, STATUS_OFFSET,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.getWordAtOffset(o, STATUS_OFFSET).or(HASH_STATE_HASHED));&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word tmp;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;do {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tmp = Magic.prepareWord(o, STATUS_OFFSET);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} while (!Magic.attemptWord(o, STATUS_OFFSET, tmp, tmp.or(HASH_STATE_HASHED)));&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ThinLock.unlockHeader(o, STATUS_OFFSET, lhr);&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (ObjectModel.HASH_STATS) ObjectModel.hashTransition1++;&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return getObjectHashCode(o);&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt; @@ -534,20 +543,35 @@&lt;br&gt; &lt;br&gt; &amp;nbsp; /** Install a new hashcode (only used if !ADDRESS_BASED_HASHING) */&lt;br&gt; &amp;nbsp; @NoInline&lt;br&gt; + &amp;nbsp;@Interruptible&lt;br&gt; &amp;nbsp; protected static int installHashCode(Object o) {&lt;br&gt; &amp;nbsp; &amp;nbsp; Word hashCode;&lt;br&gt; &amp;nbsp; &amp;nbsp; do {&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; hashCodeGenerator = hashCodeGenerator.plus(Word.one().lsh(HASH_CODE_SHIFT));&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; hashCode = hashCodeGenerator.and(HASH_CODE_MASK);&lt;br&gt; &amp;nbsp; &amp;nbsp; } while (hashCode.isZero());&lt;br&gt; - &amp;nbsp; &amp;nbsp;while (true) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;Word statusWord = Magic.prepareWord(o, STATUS_OFFSET);&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (ThinLock.lockHeader(o, STATUS_OFFSET)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Word statusWord = Magic.getWordAtOffset(o, STATUS_OFFSET);&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (!(statusWord.and(HASH_CODE_MASK).isZero())) // some other thread installed a hashcode&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ThinLock.unlockHeader(o, STATUS_OFFSET, true);&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return statusWord.and(HASH_CODE_MASK).rshl(HASH_CODE_SHIFT).toInt();&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Magic.attemptWord(o, STATUS_OFFSET, statusWord, statusWord.or(hashCode))) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return hashCode.rshl(HASH_CODE_SHIFT).toInt(); &amp;nbsp;// we installed the hash code&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.setWordAtOffset(o, STATUS_OFFSET, statusWord.or(hashCode));&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;ThinLock.unlockHeader(o, STATUS_OFFSET, true);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;return hashCode.rshl(HASH_CODE_SHIFT).toInt(); &amp;nbsp;// we installed the hash code&lt;br&gt; + &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;while (true) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word statusWord = Magic.prepareWord(o, STATUS_OFFSET);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!(statusWord.and(HASH_CODE_MASK).isZero())) // some other thread installed a hashcode&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ThinLock.unlockHeader(o, STATUS_OFFSET, false);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return statusWord.and(HASH_CODE_MASK).rshl(HASH_CODE_SHIFT).toInt();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Magic.attemptWord(o, STATUS_OFFSET, statusWord, statusWord.or(hashCode))) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ThinLock.unlockHeader(o, STATUS_OFFSET, false);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return hashCode.rshl(HASH_CODE_SHIFT).toInt(); &amp;nbsp;// we installed the hash code&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt; &amp;nbsp; &amp;nbsp; }&lt;br&gt; &amp;nbsp; }&lt;br&gt; @@ -677,6 +701,7 @@&lt;br&gt; &amp;nbsp; &amp;nbsp;* Freeze the other bits in the byte containing the available bits&lt;br&gt; &amp;nbsp; &amp;nbsp;* so that it is safe to update them using setAvailableBits.&lt;br&gt; &amp;nbsp; &amp;nbsp;*/&lt;br&gt; + &amp;nbsp;@Interruptible&lt;br&gt; &amp;nbsp; public static void initializeAvailableByte(Object o) {&lt;br&gt; &amp;nbsp; &amp;nbsp; if (!ADDRESS_BASED_HASHING) getObjectHashCode(o);&lt;br&gt; &amp;nbsp; }&lt;br&gt; @@ -685,6 +710,8 @@&lt;br&gt; &amp;nbsp; &amp;nbsp;* A prepare on the word containing the available bits&lt;br&gt; &amp;nbsp; &amp;nbsp;*/&lt;br&gt; &amp;nbsp; public static Word prepareAvailableBits(Object o) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.worldStopped() || ThinLock.allowHeaderCAS(o, STATUS_OFFSET));&lt;br&gt; &amp;nbsp; &amp;nbsp; return Magic.prepareWord(o, STATUS_OFFSET);&lt;br&gt; &amp;nbsp; }&lt;br&gt; &lt;br&gt; @@ -692,6 +719,8 @@&lt;br&gt; &amp;nbsp; &amp;nbsp;* An attempt on the word containing the available bits&lt;br&gt; &amp;nbsp; &amp;nbsp;*/&lt;br&gt; &amp;nbsp; public static boolean attemptAvailableBits(Object o, Word oldVal, Word newVal) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.worldStopped() || ThinLock.allowHeaderCAS(o, STATUS_OFFSET));&lt;br&gt; &amp;nbsp; &amp;nbsp; return Magic.attemptWord(o, STATUS_OFFSET, oldVal, newVal);&lt;br&gt; &amp;nbsp; }&lt;br&gt; &lt;br&gt; &lt;br&gt; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ObjectModel.java&lt;br&gt; ===================================================================&lt;br&gt; --- rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ObjectModel.java		 2009-05-07 20:08:18 UTC (rev 15684)&lt;br&gt; +++ rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ObjectModel.java		 2009-05-07 22:40:00 UTC (rev 15685)&lt;br&gt; @@ -432,6 +432,7 @@&lt;br&gt; &amp;nbsp; /**&lt;br&gt; &amp;nbsp; &amp;nbsp;* Get the hash code of an object.&lt;br&gt; &amp;nbsp; &amp;nbsp;*/&lt;br&gt; + &amp;nbsp;@Interruptible&lt;br&gt; &amp;nbsp; public static int getObjectHashCode(Object o) {&lt;br&gt; &amp;nbsp; &amp;nbsp; if (HASH_STATS) hashRequests++;&lt;br&gt; &amp;nbsp; &amp;nbsp; return JavaHeader.getObjectHashCode(o);&lt;br&gt; @@ -547,6 +548,7 @@&lt;br&gt; &amp;nbsp; &amp;nbsp;* Freeze the other bits in the byte containing the available bits&lt;br&gt; &amp;nbsp; &amp;nbsp;* so that it is safe to update them using setAvailableBits.&lt;br&gt; &amp;nbsp; &amp;nbsp;*/&lt;br&gt; + &amp;nbsp;@Interruptible&lt;br&gt; &amp;nbsp; public static void initializeAvailableByte(Object o) {&lt;br&gt; &amp;nbsp; &amp;nbsp; JavaHeader.initializeAvailableByte(o);&lt;br&gt; &amp;nbsp; }&lt;br&gt; &lt;br&gt; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ThinLockConstants.java&lt;br&gt; ===================================================================&lt;br&gt; --- rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ThinLockConstants.java		 2009-05-07 20:08:18 UTC (rev 15684)&lt;br&gt; +++ rvmroot/trunk/rvm/src/org/jikesrvm/objectmodel/ThinLockConstants.java		 2009-05-07 22:40:00 UTC (rev 15685)&lt;br&gt; @@ -35,21 +35,32 @@&lt;br&gt; &amp;nbsp;*/&lt;br&gt; public interface ThinLockConstants extends SizeConstants {&lt;br&gt; &lt;br&gt; - &amp;nbsp;int NUM_BITS_TID = RVMThread.LOG_MAX_THREADS;&lt;br&gt; - &amp;nbsp;int NUM_BITS_RC = JavaHeader.NUM_THIN_LOCK_BITS - NUM_BITS_TID;&lt;br&gt; + &amp;nbsp;// biased locking / thin locking status bits:&lt;br&gt; + &amp;nbsp;// 00 -&gt; thin biasable, and biased if TID is non-zero&lt;br&gt; + &amp;nbsp;// 01 -&gt; thin unbiasable&lt;br&gt; + &amp;nbsp;// 10 -&gt; fat unbiasable&lt;br&gt; &lt;br&gt; + &amp;nbsp;int TL_NUM_BITS_STAT = 2;&lt;br&gt; + &amp;nbsp;int TL_NUM_BITS_TID = RVMThread.LOG_MAX_THREADS;&lt;br&gt; + &amp;nbsp;int TL_NUM_BITS_RC = JavaHeader.NUM_THIN_LOCK_BITS - TL_NUM_BITS_TID - TL_NUM_BITS_STAT;&lt;br&gt; +&lt;br&gt; &amp;nbsp; int TL_LOCK_COUNT_SHIFT = JavaHeader.THIN_LOCK_SHIFT;&lt;br&gt; - &amp;nbsp;int TL_THREAD_ID_SHIFT = TL_LOCK_COUNT_SHIFT + NUM_BITS_RC;&lt;br&gt; + &amp;nbsp;int TL_THREAD_ID_SHIFT = TL_LOCK_COUNT_SHIFT + TL_NUM_BITS_RC;&lt;br&gt; + &amp;nbsp;int TL_STAT_SHIFT = TL_THREAD_ID_SHIFT + TL_NUM_BITS_TID;&lt;br&gt; &amp;nbsp; int TL_LOCK_ID_SHIFT = JavaHeader.THIN_LOCK_SHIFT;&lt;br&gt; &lt;br&gt; &amp;nbsp; int TL_LOCK_COUNT_UNIT = 1 &amp;lt;&amp;lt; TL_LOCK_COUNT_SHIFT;&lt;br&gt; &lt;br&gt; - &amp;nbsp;Word TL_LOCK_COUNT_MASK = Word.fromIntSignExtend(-1).rshl(BITS_IN_ADDRESS - NUM_BITS_RC).lsh(TL_LOCK_COUNT_SHIFT);&lt;br&gt; - &amp;nbsp;Word TL_THREAD_ID_MASK = Word.fromIntSignExtend(-1).rshl(BITS_IN_ADDRESS - NUM_BITS_TID).lsh(TL_THREAD_ID_SHIFT);&lt;br&gt; + &amp;nbsp;Word TL_LOCK_COUNT_MASK = Word.fromIntSignExtend(-1).rshl(BITS_IN_ADDRESS - TL_NUM_BITS_RC).lsh(TL_LOCK_COUNT_SHIFT);&lt;br&gt; + &amp;nbsp;Word TL_THREAD_ID_MASK = Word.fromIntSignExtend(-1).rshl(BITS_IN_ADDRESS - TL_NUM_BITS_TID).lsh(TL_THREAD_ID_SHIFT);&lt;br&gt; &amp;nbsp; Word TL_LOCK_ID_MASK =&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;Word.fromIntSignExtend(-1).rshl(BITS_IN_ADDRESS - (NUM_BITS_RC + NUM_BITS_TID - 1)).lsh(TL_LOCK_ID_SHIFT);&lt;br&gt; - &amp;nbsp;Word TL_FAT_LOCK_MASK = Word.one().lsh(JavaHeader.THIN_LOCK_SHIFT + NUM_BITS_RC + NUM_BITS_TID - 1);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Word.fromIntSignExtend(-1).rshl(BITS_IN_ADDRESS - (TL_NUM_BITS_RC + TL_NUM_BITS_TID)).lsh(TL_LOCK_ID_SHIFT);&lt;br&gt; + &amp;nbsp;Word TL_STAT_MASK = Word.fromIntSignExtend(-1).rshl(BITS_IN_ADDRESS - TL_NUM_BITS_TID).lsh(TL_STAT_SHIFT);&lt;br&gt; &amp;nbsp; Word TL_UNLOCK_MASK = Word.fromIntSignExtend(-1).rshl(BITS_IN_ADDRESS - JavaHeader&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; .NUM_THIN_LOCK_BITS).lsh(JavaHeader.THIN_LOCK_SHIFT).not();&lt;br&gt; +&lt;br&gt; + &amp;nbsp;Word TL_STAT_BIASABLE = Word.fromIntSignExtend(0).lsh(TL_STAT_SHIFT);&lt;br&gt; + &amp;nbsp;Word TL_STAT_THIN = Word.fromIntSignExtend(1).lsh(TL_STAT_SHIFT);&lt;br&gt; + &amp;nbsp;Word TL_STAT_FAT = Word.fromIntSignExtend(2).lsh(TL_STAT_SHIFT);&lt;br&gt; }&lt;br&gt; &lt;br&gt; &lt;br&gt; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Lock.java&lt;br&gt; ===================================================================&lt;br&gt; --- rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Lock.java		 2009-05-07 20:08:18 UTC (rev 15684)&lt;br&gt; +++ rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Lock.java		 2009-05-07 22:40:00 UTC (rev 15685)&lt;br&gt; @@ -115,7 +115,7 @@&lt;br&gt; &amp;nbsp;*/&lt;br&gt; &lt;br&gt; @Uninterruptible&lt;br&gt; -public class Lock implements Constants {&lt;br&gt; +public final class Lock implements Constants {&lt;br&gt; &amp;nbsp; /****************************************************************************&lt;br&gt; &amp;nbsp; &amp;nbsp;* Constants&lt;br&gt; &amp;nbsp; &amp;nbsp;*/&lt;br&gt; @@ -311,7 +311,7 @@&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; VM._assert(waiting.isEmpty());&lt;br&gt; &amp;nbsp; &amp;nbsp; }&lt;br&gt; &amp;nbsp; &amp;nbsp; if (STATS) deflations++;&lt;br&gt; - &amp;nbsp; &amp;nbsp;ThinLock.deflate(o, lockOffset, this);&lt;br&gt; + &amp;nbsp; &amp;nbsp;ThinLock.markDeflated(o, lockOffset, index);&lt;br&gt; &amp;nbsp; &amp;nbsp; lockedObject = null;&lt;br&gt; &amp;nbsp; &amp;nbsp; free(this);&lt;br&gt; &amp;nbsp; }&lt;br&gt; &lt;br&gt; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/RVMThread.java&lt;br&gt; ===================================================================&lt;br&gt; --- rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/RVMThread.java		 2009-05-07 20:08:18 UTC (rev 15684)&lt;br&gt; +++ rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/RVMThread.java		 2009-05-07 22:40:00 UTC (rev 15685)&lt;br&gt; @@ -2097,7 +2097,9 @@&lt;br&gt; &amp;nbsp; }&lt;br&gt; &lt;br&gt; &amp;nbsp; @Unpreemptible&lt;br&gt; - &amp;nbsp;final int safeBlock(BlockAdapter ba, boolean asynchronous) {&lt;br&gt; + &amp;nbsp;private int safeBlock(BlockAdapter ba, boolean asynchronous) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions)&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;VM._assert(getCurrentThread() != this);&lt;br&gt; &amp;nbsp; &amp;nbsp; beginPairWithCurrent();&lt;br&gt; &amp;nbsp; &amp;nbsp; int result=block(ba,asynchronous);&lt;br&gt; &amp;nbsp; &amp;nbsp; endPairWithCurrent();&lt;br&gt; @@ -2106,14 +2108,16 @@&lt;br&gt; &lt;br&gt; &amp;nbsp; @Unpreemptible&lt;br&gt; &amp;nbsp; public final int safeAsyncBlock(BlockAdapter ba) {&lt;br&gt; - &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions)&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;VM._assert(getCurrentThread() != this);&lt;br&gt; &amp;nbsp; &amp;nbsp; return safeBlock(ba, true);&lt;br&gt; &amp;nbsp; }&lt;br&gt; &lt;br&gt; &amp;nbsp; @Unpreemptible&lt;br&gt; &amp;nbsp; public final int safeBlock(BlockAdapter ba) {&lt;br&gt; - &amp;nbsp; &amp;nbsp;return safeBlock(ba, false);&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (getCurrentThread()==this) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;return block(ba,false);&lt;br&gt; + &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;return safeBlock(ba, false);&lt;br&gt; + &amp;nbsp; &amp;nbsp;}&lt;br&gt; &amp;nbsp; }&lt;br&gt; &lt;br&gt; &amp;nbsp; @Unpreemptible&lt;br&gt; @@ -2821,22 +2825,20 @@&lt;br&gt; &amp;nbsp; &amp;nbsp;*/&lt;br&gt; &amp;nbsp; @UnpreemptibleNoWarn(&quot;Exceptions may possibly cause yields&quot;)&lt;br&gt; &amp;nbsp; public final void suspend() {&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (false) VM.sysWriteln(&quot;Thread #&quot;,getCurrentThreadSlot(),&quot; suspending Thread #&quot;,getThreadSlot());&lt;br&gt; &amp;nbsp; &amp;nbsp; ObjectModel.genericUnlock(thread);&lt;br&gt; &amp;nbsp; &amp;nbsp; Throwable rethrow = null;&lt;br&gt; - &amp;nbsp; &amp;nbsp;monitor().lockNoHandshake();&lt;br&gt; &amp;nbsp; &amp;nbsp; try {&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; observeExecStatus();&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (execStatus != IN_JAVA &amp;amp;&amp;amp; execStatus != IN_JAVA_TO_BLOCK &amp;amp;&amp;amp;&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; execStatus != IN_NATIVE &amp;amp;&amp;amp; execStatus != BLOCKED_IN_NATIVE &amp;amp;&amp;amp;&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; execStatus != BLOCKED_IN_JNI &amp;amp;&amp;amp; execStatus != IN_JNI) {&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; throw new IllegalThreadStateException(&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&quot;Cannot suspend a thread that is not running.&quot;);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&quot;Cannot suspend a thread that is not running.&quot;);&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;safeBlock(suspendBlockAdapter);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;block(suspendBlockAdapter);&lt;br&gt; &amp;nbsp; &amp;nbsp; } catch (Throwable t) {&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; rethrow = t;&lt;br&gt; - &amp;nbsp; &amp;nbsp;} finally {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;monitor().unlock();&lt;br&gt; &amp;nbsp; &amp;nbsp; }&lt;br&gt; &amp;nbsp; &amp;nbsp; ObjectModel.genericLock(thread);&lt;br&gt; &amp;nbsp; &amp;nbsp; if (rethrow != null)&lt;br&gt; &lt;br&gt; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Synchronization.java&lt;br&gt; ===================================================================&lt;br&gt; --- rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Synchronization.java		 2009-05-07 20:08:18 UTC (rev 15684)&lt;br&gt; +++ rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/Synchronization.java		 2009-05-07 22:40:00 UTC (rev 15685)&lt;br&gt; @@ -19,6 +19,7 @@&lt;br&gt; import org.vmmagic.pragma.Inline;&lt;br&gt; import org.vmmagic.pragma.Uninterruptible;&lt;br&gt; import org.vmmagic.unboxed.Address;&lt;br&gt; +import org.vmmagic.unboxed.Word;&lt;br&gt; import org.vmmagic.unboxed.Offset;&lt;br&gt; &lt;br&gt; /**&lt;br&gt; @@ -74,6 +75,24 @@&lt;br&gt; &amp;nbsp; &amp;nbsp;* @return true =&gt; successful swap, false =&gt; field not equal to testValue&lt;br&gt; &amp;nbsp; &amp;nbsp;*/&lt;br&gt; &amp;nbsp; @Inline&lt;br&gt; + &amp;nbsp;public static boolean tryCompareAndSwap(Object base, Offset offset, Word testValue, Word newValue) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;Word oldValue;&lt;br&gt; + &amp;nbsp; &amp;nbsp;do {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;oldValue = Magic.prepareWord(base, offset);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (oldValue != testValue) return false;&lt;br&gt; + &amp;nbsp; &amp;nbsp;} while (!Magic.attemptWord(base, offset, oldValue, newValue));&lt;br&gt; + &amp;nbsp; &amp;nbsp;return true;&lt;br&gt; + &amp;nbsp;}&lt;br&gt; +&lt;br&gt; + &amp;nbsp;/**&lt;br&gt; + &amp;nbsp; * Atomically swap test value to new value in the specified object and the specified field&lt;br&gt; + &amp;nbsp; * @param base object containing field&lt;br&gt; + &amp;nbsp; * @param offset position of field&lt;br&gt; + &amp;nbsp; * @param testValue expected value of field&lt;br&gt; + &amp;nbsp; * @param newValue new value of field&lt;br&gt; + &amp;nbsp; * @return true =&gt; successful swap, false =&gt; field not equal to testValue&lt;br&gt; + &amp;nbsp; */&lt;br&gt; + &amp;nbsp;@Inline&lt;br&gt; &amp;nbsp; public static boolean tryCompareAndSwap(Object base, Offset offset, Object testValue, Object newValue) {&lt;br&gt; &amp;nbsp; &amp;nbsp; if (MemoryManagerConstants.NEEDS_WRITE_BARRIER) {&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; return MemoryManager.tryCompareAndSwapWriteBarrier(base, offset, testValue, newValue);&lt;br&gt; &lt;br&gt; Modified: rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/ThinLock.java&lt;br&gt; ===================================================================&lt;br&gt; --- rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/ThinLock.java		 2009-05-07 20:08:18 UTC (rev 15684)&lt;br&gt; +++ rvmroot/trunk/rvm/src/org/jikesrvm/scheduler/ThinLock.java		 2009-05-07 22:40:00 UTC (rev 15685)&lt;br&gt; @@ -14,16 +14,13 @@&lt;br&gt; &lt;br&gt; import org.jikesrvm.VM;&lt;br&gt; import org.jikesrvm.Services;&lt;br&gt; -import org.jikesrvm.classloader.RVMMethod;&lt;br&gt; -import org.jikesrvm.compilers.common.CompiledMethods;&lt;br&gt; import org.jikesrvm.objectmodel.ThinLockConstants;&lt;br&gt; import org.jikesrvm.runtime.Magic;&lt;br&gt; -import org.vmmagic.pragma.Entrypoint;&lt;br&gt; import org.vmmagic.pragma.Inline;&lt;br&gt; import org.vmmagic.pragma.NoInline;&lt;br&gt; +import org.vmmagic.pragma.NoNullCheck;&lt;br&gt; import org.vmmagic.pragma.Uninterruptible;&lt;br&gt; import org.vmmagic.pragma.Unpreemptible;&lt;br&gt; -import org.vmmagic.unboxed.Address;&lt;br&gt; import org.vmmagic.unboxed.Offset;&lt;br&gt; import org.vmmagic.unboxed.Word;&lt;br&gt; &lt;br&gt; @@ -33,10 +30,218 @@&lt;br&gt; @Uninterruptible&lt;br&gt; public final class ThinLock implements ThinLockConstants {&lt;br&gt; &lt;br&gt; - &amp;nbsp;////////////////////////////////////////&lt;br&gt; - &amp;nbsp;/// Support for light-weight locking ///&lt;br&gt; - &amp;nbsp;////////////////////////////////////////&lt;br&gt; + &amp;nbsp;@Inline&lt;br&gt; + &amp;nbsp;@NoNullCheck&lt;br&gt; + &amp;nbsp;@Unpreemptible&lt;br&gt; + &amp;nbsp;public static void inlineLock(Object o, Offset lockOffset) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;Word old = Magic.prepareWord(o, lockOffset); // FIXME: bad for PPC?&lt;br&gt; + &amp;nbsp; &amp;nbsp;Word id = old.and(TL_THREAD_ID_MASK.or(TL_STAT_MASK));&lt;br&gt; + &amp;nbsp; &amp;nbsp;Word tid = Word.fromIntSignExtend(RVMThread.getCurrentThread().getLockingId());&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (id.EQ(tid)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Word changed = old.toAddress().plus(TL_LOCK_COUNT_UNIT).toWord();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!changed.and(TL_LOCK_COUNT_MASK).isZero()) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.setWordAtOffset(o, lockOffset, changed);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp;} else if (id.EQ(TL_STAT_THIN)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;// lock is thin and not held by anyone&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Magic.attemptWord(o, lockOffset, old, old.or(tid))) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.isync();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp;lock(o, lockOffset);&lt;br&gt; + &amp;nbsp;}&lt;br&gt; &lt;br&gt; + &amp;nbsp;@Inline&lt;br&gt; + &amp;nbsp;@NoNullCheck&lt;br&gt; + &amp;nbsp;@Unpreemptible&lt;br&gt; + &amp;nbsp;public static void inlineUnlock(Object o, Offset lockOffset) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;Word old = Magic.prepareWord(o, lockOffset); // FIXME: bad for PPC?&lt;br&gt; + &amp;nbsp; &amp;nbsp;Word id = old.and(TL_THREAD_ID_MASK.or(TL_STAT_MASK));&lt;br&gt; + &amp;nbsp; &amp;nbsp;Word tid = Word.fromIntSignExtend(RVMThread.getCurrentThread().getLockingId());&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (id.EQ(tid)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!old.and(TL_LOCK_COUNT_MASK).isZero()) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.setWordAtOffset(&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;o, lockOffset,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;old.toAddress().minus(TL_LOCK_COUNT_UNIT).toWord());&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp;} else if (old.xor(tid).rshl(TL_LOCK_COUNT_SHIFT).EQ(TL_STAT_THIN.rshl(TL_LOCK_COUNT_SHIFT))) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.sync();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Magic.attemptWord(o, lockOffset, old, old.and(TL_UNLOCK_MASK).or(TL_STAT_THIN))) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp;unlock(o, lockOffset);&lt;br&gt; + &amp;nbsp;}&lt;br&gt; +&lt;br&gt; + &amp;nbsp;@NoInline&lt;br&gt; + &amp;nbsp;@NoNullCheck&lt;br&gt; + &amp;nbsp;@Unpreemptible&lt;br&gt; + &amp;nbsp;public static void lock(Object o, Offset lockOffset) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (STATS) fastLocks++;&lt;br&gt; +&lt;br&gt; + &amp;nbsp; &amp;nbsp;Word threadId = Word.fromIntZeroExtend(RVMThread.getCurrentThread().getLockingId());&lt;br&gt; +&lt;br&gt; + &amp;nbsp; &amp;nbsp;for (int cnt=0;;cnt++) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Word old = Magic.getWordAtOffset(o, lockOffset);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Word stat = old.and(TL_STAT_MASK);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;boolean tryToInflate=false;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (stat.EQ(TL_STAT_BIASABLE)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word id = old.and(TL_THREAD_ID_MASK);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (id.isZero()) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// lock is unbiased, bias it in our favor and grab it&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Synchronization.tryCompareAndSwap(&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;o, lockOffset,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;old,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;old.or(threadId).toAddress().plus(TL_LOCK_COUNT_UNIT).toWord())) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.isync();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (id.EQ(threadId)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// lock is biased in our favor&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word changed = old.toAddress().plus(TL_LOCK_COUNT_UNIT).toWord();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!changed.and(TL_LOCK_COUNT_MASK).isZero()) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.setWordAtOffset(o, lockOffset, changed);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tryToInflate=true;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (casFromBiased(o, lockOffset, old, biasBitsToThinBits(old), cnt)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;continue; // don't spin, since it's thin now&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (stat.EQ(TL_STAT_THIN)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word id = old.and(TL_THREAD_ID_MASK);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (id.isZero()) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Synchronization.tryCompareAndSwap(&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;o, lockOffset, old, old.or(threadId))) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.isync();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (id.EQ(threadId)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word changed = old.toAddress().plus(TL_LOCK_COUNT_UNIT).toWord();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (changed.and(TL_LOCK_COUNT_MASK).isZero()) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tryToInflate=true;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (Synchronization.tryCompareAndSwap(&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; o, lockOffset, old, changed)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.isync();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (cnt&gt;retryLimit) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tryToInflate=true;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(stat.EQ(TL_STAT_FAT));&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// lock is fat. &amp;nbsp;contend on it.&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Lock.getLock(getLockIndex(old)).lockHeavy(o)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; +&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (tryToInflate) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (STATS) slowLocks++;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// the lock is not fat, is owned by someone else, or else the count wrapped.&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// attempt to inflate it (this may fail, in which case we'll just harmlessly&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// loop around) and lock it (may also fail, if we get the wrong lock). &amp;nbsp;if it&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// succeeds, we're done.&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// NB: this calls into our attemptToMarkInflated() method, which will do the&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Right Thing if the lock is biased to someone else.&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (inflateAndLock(o, lockOffset)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.yield();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp;}&lt;br&gt; +&lt;br&gt; + &amp;nbsp;@NoInline&lt;br&gt; + &amp;nbsp;@NoNullCheck&lt;br&gt; + &amp;nbsp;@Unpreemptible&lt;br&gt; + &amp;nbsp;public static void unlock(Object o, Offset lockOffset) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;Word threadId = Word.fromIntZeroExtend(RVMThread.getCurrentThread().getLockingId());&lt;br&gt; + &amp;nbsp; &amp;nbsp;for (int cnt=0;;cnt++) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Word old = Magic.getWordAtOffset(o, lockOffset);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Word stat = old.and(TL_STAT_MASK);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (stat.EQ(TL_STAT_BIASABLE)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word id = old.and(TL_THREAD_ID_MASK);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (id.EQ(threadId)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (old.and(TL_LOCK_COUNT_MASK).isZero()) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.raiseIllegalMonitorStateException(&quot;biased unlocking: we own this object but the count is already zero&quot;, o);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.setWordAtOffset(o, lockOffset,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;old.toAddress().minus(TL_LOCK_COUNT_UNIT).toWord());&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.raiseIllegalMonitorStateException(&quot;biased unlocking: we don't own this object&quot;, o);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (stat.EQ(TL_STAT_THIN)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.sync();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word id = old.and(TL_THREAD_ID_MASK);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (id.EQ(threadId)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word changed;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (old.and(TL_LOCK_COUNT_MASK).isZero()) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;changed=old.and(TL_UNLOCK_MASK).or(TL_STAT_THIN);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;changed=old.toAddress().minus(TL_LOCK_COUNT_UNIT).toWord();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Synchronization.tryCompareAndSwap(&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;o, lockOffset, old, changed)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (false) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;VM.sysWriteln(&quot;threadId = &quot;,threadId);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;VM.sysWriteln(&quot;id = &quot;,id);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.raiseIllegalMonitorStateException(&quot;thin unlocking: we don't own this object&quot;, o);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(stat.EQ(TL_STAT_FAT));&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// fat unlock&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Lock.getLock(getLockIndex(old)).unlockHeavy(o);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp;}&lt;br&gt; +&lt;br&gt; + &amp;nbsp;@Uninterruptible&lt;br&gt; + &amp;nbsp;@NoNullCheck&lt;br&gt; + &amp;nbsp;public static boolean holdsLock(Object o, Offset lockOffset, RVMThread thread) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;for (int cnt=0;;++cnt) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;int tid = thread.getLockingId();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Word bits = Magic.getWordAtOffset(o, lockOffset);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (bits.and(TL_STAT_MASK).EQ(TL_STAT_BIASABLE)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// if locked, then it is locked with a thin lock&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bits.and(TL_THREAD_ID_MASK).toInt() == tid &amp;amp;&amp;amp;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;!bits.and(TL_LOCK_COUNT_MASK).isZero();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (bits.and(TL_STAT_MASK).EQ(TL_STAT_THIN)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return bits.and(TL_THREAD_ID_MASK).toInt()==tid;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(bits.and(TL_STAT_MASK).EQ(TL_STAT_FAT));&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// if locked, then it is locked with a fat lock&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Lock l=Lock.getLock(getLockIndex(bits));&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (l!=null) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;l.mutex.lock();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;boolean result = (l.getOwnerId()==tid &amp;amp;&amp;amp; l.getLockedObject()==o);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;l.mutex.unlock();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return result;&lt;/tt&gt;&lt;br&gt; &lt;tt&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.yield();&lt;br&gt; + &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp;}&lt;br&gt; +&lt;br&gt; + &amp;nbsp;@Inline&lt;br&gt; + &amp;nbsp;@Uninterruptible&lt;br&gt; + &amp;nbsp;public static boolean isFat(Word lockWord) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;return lockWord.and(TL_STAT_MASK).EQ(TL_STAT_FAT);&lt;br&gt; + &amp;nbsp;}&lt;br&gt; +&lt;br&gt; &amp;nbsp; /**&lt;br&gt; &amp;nbsp; &amp;nbsp;* Return the lock index for a given lock word. &amp;nbsp;Assert valid index&lt;br&gt; &amp;nbsp; &amp;nbsp;* ranges, that the fat lock bit is set, and that the lock entry&lt;br&gt; @@ -46,7 +251,8 @@&lt;br&gt; &amp;nbsp; &amp;nbsp;* @return the lock index corresponding to the lock workd.&lt;br&gt; &amp;nbsp; &amp;nbsp;*/&lt;br&gt; &amp;nbsp; @Inline&lt;br&gt; - &amp;nbsp;private static int getLockIndex(Word lockWord) {&lt;br&gt; + &amp;nbsp;@Uninterruptible&lt;br&gt; + &amp;nbsp;public static int getLockIndex(Word lockWord) {&lt;br&gt; &amp;nbsp; &amp;nbsp; int index = lockWord.and(TL_LOCK_ID_MASK).rshl(TL_LOCK_ID_SHIFT).toInt();&lt;br&gt; &amp;nbsp; &amp;nbsp; if (VM.VerifyAssertions) {&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (!(index &gt; 0 &amp;amp;&amp;amp; index &amp;lt; Lock.numLocks())) {&lt;br&gt; @@ -56,180 +262,288 @@&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; VM.sysWriteln();&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; VM._assert(index &gt; 0 &amp;amp;&amp;amp; index &amp;lt; Lock.numLocks()); &amp;nbsp;// index is in range&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;VM._assert(!lockWord.and(TL_FAT_LOCK_MASK).isZero()); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// fat lock bit is set&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;VM._assert(Lock.getLock(index) != null); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // the lock is actually there&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;VM._assert(lockWord.and(TL_STAT_MASK).EQ(TL_STAT_FAT)); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// fat lock bit is set&lt;br&gt; &amp;nbsp; &amp;nbsp; }&lt;br&gt; &amp;nbsp; &amp;nbsp; return index;&lt;br&gt; &amp;nbsp; }&lt;br&gt; &lt;br&gt; - &amp;nbsp;/**&lt;br&gt; - &amp;nbsp; * Obtains a lock on the indicated object. &amp;nbsp;Abbreviated light-weight&lt;br&gt; - &amp;nbsp; * locking sequence inlined by the optimizing compiler for the&lt;br&gt; - &amp;nbsp; * prologue of synchronized methods and for the&lt;br&gt; - &amp;nbsp; * &amp;lt;code&gt;monitorenter&amp;lt;/code&gt; bytecode.&lt;br&gt; - &amp;nbsp; *&lt;br&gt; - &amp;nbsp; * @param o the object to be locked&lt;br&gt; - &amp;nbsp; * @param lockOffset the offset of the thin lock word in the object.&lt;br&gt; - &amp;nbsp; * @see org.jikesrvm.compilers.opt.hir2lir.ExpandRuntimeServices&lt;br&gt; - &amp;nbsp; */&lt;br&gt; &amp;nbsp; @Inline&lt;br&gt; - &amp;nbsp;@Entrypoint&lt;br&gt; - &amp;nbsp;@Unpreemptible(&quot;Become another thread when lock is contended, don't preempt in other cases&quot;)&lt;br&gt; - &amp;nbsp;static void inlineLock(Object o, Offset lockOffset) {&lt;br&gt; - &amp;nbsp; &amp;nbsp;Word old = Magic.prepareWord(o, lockOffset);&lt;br&gt; - &amp;nbsp; &amp;nbsp;if (old.rshl(TL_THREAD_ID_SHIFT).isZero()) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;// implies that fatbit == 0 &amp;amp; threadid == 0&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;int threadId = RVMThread.getCurrentThread().getLockingId();&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Magic.attemptWord(o, lockOffset, old, old.or(Word.fromIntZeroExtend(threadId)))) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.isync(); // don't use stale prefetched data in monitor&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (STATS) fastLocks++;&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // common case: o is now locked&lt;br&gt; + &amp;nbsp;@Uninterruptible&lt;br&gt; + &amp;nbsp;public static int getLockOwner(Word lockWord) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(!isFat(lockWord));&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (lockWord.and(TL_STAT_MASK).EQ(TL_STAT_BIASABLE)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (lockWord.and(TL_LOCK_COUNT_MASK).isZero()) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return 0;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return lockWord.and(TL_THREAD_ID_MASK).toInt();&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt; + &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;return lockWord.and(TL_THREAD_ID_MASK).toInt();&lt;br&gt; &amp;nbsp; &amp;nbsp; }&lt;br&gt; - &amp;nbsp; &amp;nbsp;lock(o, lockOffset); // uncommon case: default to out-of-line lock()&lt;br&gt; &amp;nbsp; }&lt;br&gt; &lt;br&gt; - &amp;nbsp;/**&lt;br&gt; - &amp;nbsp; * Releases the lock on the indicated object. &amp;nbsp;Abreviated&lt;br&gt; - &amp;nbsp; * light-weight unlocking sequence inlined by the optimizing&lt;br&gt; - &amp;nbsp; * compiler for the epilogue of synchronized methods and for the&lt;br&gt; - &amp;nbsp; * &amp;lt;code&gt;monitorexit&amp;lt;/code&gt; bytecode.&lt;br&gt; - &amp;nbsp; *&lt;br&gt; - &amp;nbsp; * @param o the object to be unlocked&lt;br&gt; - &amp;nbsp; * @param lockOffset the offset of the thin lock word in the object.&lt;br&gt; - &amp;nbsp; * @see org.jikesrvm.compilers.opt.hir2lir.ExpandRuntimeServices&lt;br&gt; - &amp;nbsp; */&lt;br&gt; &amp;nbsp; @Inline&lt;br&gt; - &amp;nbsp;@Entrypoint&lt;br&gt; - &amp;nbsp;@Unpreemptible(&quot;No preemption normally, but may raise exceptions&quot;)&lt;br&gt; - &amp;nbsp;static void inlineUnlock(Object o, Offset lockOffset) {&lt;br&gt; - &amp;nbsp; &amp;nbsp;Word old = Magic.prepareWord(o, lockOffset);&lt;br&gt; - &amp;nbsp; &amp;nbsp;Word threadId = Word.fromIntZeroExtend(RVMThread.getCurrentThread().getLockingId());&lt;br&gt; - &amp;nbsp; &amp;nbsp;if (old.xor(threadId).rshl(TL_LOCK_COUNT_SHIFT).isZero()) { // implies that fatbit == 0 &amp;amp;&amp;amp; count == 0 &amp;amp;&amp;amp; lockid == me&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.sync(); // memory barrier: subsequent locker will see previous writes&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Magic.attemptWord(o, lockOffset, old, old.and(TL_UNLOCK_MASK))) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return; // common case: o is now unlocked&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp;@Uninterruptible&lt;br&gt; + &amp;nbsp;public static int getRecCount(Word lockWord) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(getLockOwner(lockWord)!=0);&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (lockWord.and(TL_STAT_MASK).EQ(TL_STAT_BIASABLE)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;return lockWord.and(TL_LOCK_COUNT_MASK).rshl(TL_LOCK_COUNT_SHIFT).toInt();&lt;br&gt; + &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;return lockWord.and(TL_LOCK_COUNT_MASK).rshl(TL_LOCK_COUNT_SHIFT).toInt()+1;&lt;br&gt; &amp;nbsp; &amp;nbsp; }&lt;br&gt; - &amp;nbsp; &amp;nbsp;unlock(o, lockOffset); &amp;nbsp;// uncommon case: default to non inlined unlock()&lt;br&gt; &amp;nbsp; }&lt;br&gt; &lt;br&gt; - &amp;nbsp;/**&lt;br&gt; - &amp;nbsp; * O btains a lock on the indicated object. &amp;nbsp;Light-weight locking&lt;br&gt; - &amp;nbsp; * sequence for the prologue of synchronized methods and for the&lt;br&gt; - &amp;nbsp; * &amp;lt;code&gt;monitorenter&amp;lt;/code&gt; bytecode.&lt;br&gt; - &amp;nbsp; *&lt;br&gt; - &amp;nbsp; * @param o the object to be locked&lt;br&gt; - &amp;nbsp; * @param lockOffset the offset of the thin lock word in the object.&lt;br&gt; - &amp;nbsp; */&lt;br&gt; &amp;nbsp; @NoInline&lt;br&gt; - &amp;nbsp;@Unpreemptible(&quot;Become another thread when lock is contended, don't preempt in other cases&quot;)&lt;br&gt; - &amp;nbsp;public static void lock(Object o, Offset lockOffset) {&lt;br&gt; - &amp;nbsp; &amp;nbsp;major:&lt;br&gt; - &amp;nbsp; &amp;nbsp;while (true) { // repeat only if attempt to lock a promoted lock fails&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;int retries = retryLimit;&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;Word threadId = Word.fromIntZeroExtend(RVMThread.getCurrentThread().getLockingId());&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;while (0 != retries--) { // repeat if there is contention for thin lock&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word old = Magic.prepareWord(o, lockOffset);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word id = old.and(TL_THREAD_ID_MASK.or(TL_FAT_LOCK_MASK));&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (id.isZero()) { // o isn't locked&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Magic.attemptWord(o, lockOffset, old, old.or(threadId))) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.isync(); // don't use stale prefetched data in monitor&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (STATS) slowLocks++;&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break major; &amp;nbsp;// lock succeeds&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;continue; // contention, possibly spurious, try again&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (id.EQ(threadId)) { // this thread has o locked already&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word changed = old.toAddress().plus(TL_LOCK_COUNT_UNIT).toWord(); // update count&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (changed.and(TL_LOCK_COUNT_MASK).isZero()) { // count wrapped around (most unlikely), make heavy lock&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;while (!inflateAndLock(o, lockOffset)) { // wait for a lock to become available&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.yield();&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break major; &amp;nbsp;// lock succeeds (note that lockHeavy has issued an isync)&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Magic.attemptWord(o, lockOffset, old, changed)) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.isync(); // don't use stale prefetched data in monitor !!TODO: is this isync required?&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (STATS) slowLocks++;&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break major; &amp;nbsp;// lock succeeds&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;continue; // contention, probably spurious, try again (TODO!! worry about this)&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp;@Unpreemptible&lt;br&gt; + &amp;nbsp;public static boolean casFromBiased(Object o, Offset lockOffset,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word oldLockWord, Word changed,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int cnt) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;RVMThread me=RVMThread.getCurrentThread();&lt;br&gt; + &amp;nbsp; &amp;nbsp;Word id=oldLockWord.and(TL_THREAD_ID_MASK);&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (id.isZero()) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (false) VM.sysWriteln(&quot;id is zero - easy case.&quot;);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;return Synchronization.tryCompareAndSwap(o, lockOffset, oldLockWord, changed);&lt;br&gt; + &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (false) VM.sysWriteln(&quot;id = &quot;,id);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;int slot=id.toInt()&gt;&gt;TL_THREAD_ID_SHIFT;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (false) VM.sysWriteln(&quot;slot = &quot;,slot);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread owner=RVMThread.threadBySlot[slot];&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (owner==me /* I own it, so I can unbias it trivially. &amp;nbsp;This occurs&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; when we are inflating due to, for example, wait() */ ||&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;owner==null /* the thread that owned it is dead, so it's safe to&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; unbias. */) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// note that we use a CAS here, but it's only needed in the case&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// that owner==null, since in that case some other thread may also&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// be unbiasing.&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return Synchronization.tryCompareAndSwap(&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;o, lockOffset, oldLockWord, changed);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;boolean result=false;&lt;br&gt; &lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!(old.and(TL_FAT_LOCK_MASK).isZero())) { // o has a heavy lock&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int index = getLockIndex(old);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Lock.getLock(index).lockHeavy(o)) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break major; // lock succeeds (note that lockHeavy has issued an isync)&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// heavy lock failed (deflated or contention for system lock)&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.yield();&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;continue major; &amp;nbsp; &amp;nbsp;// try again&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// real contention: wait (hope other thread unlocks o), try again&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (traceContention) { // for performance tuning only (see section 5)&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Address fp = Magic.getFramePointer();&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fp = Magic.getCallerFramePointer(fp);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int mid = Magic.getCompiledMethodID(fp);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMMethod m1 = CompiledMethods.getCompiledMethod(mid).getMethod();&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fp = Magic.getCallerFramePointer(fp);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mid = Magic.getCompiledMethodID(fp);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMMethod m2 = CompiledMethods.getCompiledMethod(mid).getMethod();&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String s = m1.getDeclaringClass() + &quot;.&quot; + m1.getName() + &quot; &quot; + m2.getDeclaringClass() + &quot;.&quot; + m2.getName();&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.trace(Magic.getObjectType(o).toString(), s, -2 - retries);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (0 != retries) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.yield(); // wait, hope o gets unlocked&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// NB. this may stop a thread other than the one that had the bias,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// if that thread died and some other thread took its slot. &amp;nbsp;that's&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// why we do a CAS below. &amp;nbsp;it's only needed if some other thread&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// had seen the owner be null (which may happen if we came here after&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// a new thread took the slot while someone else came here when the&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// slot was still null). &amp;nbsp;if it was the case that everyone else had&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// seen a non-null owner, then the pair handshake would serve as&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// sufficient synchronization (the id would identify the set of threads&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// that shared that id's communicationLock). &amp;nbsp;oddly, that means that&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// this whole thing could be &quot;simplified&quot; to acquire the&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// communicationLock even if the owner was null. &amp;nbsp;but that would be&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// goofy.&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (false) VM.sysWriteln(&quot;entering pair handshake&quot;);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;owner.beginPairHandshake();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (false) VM.sysWriteln(&quot;done with that&quot;);&lt;br&gt; +&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word newLockWord=Magic.getWordAtOffset(o, lockOffset);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result=Synchronization.tryCompareAndSwap(&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;o, lockOffset, oldLockWord, changed);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;owner.endPairHandshake();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (false) VM.sysWriteln(&quot;that worked.&quot;);&lt;br&gt; +&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return result;&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;// create a heavy lock for o and lock it&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;if (inflateAndLock(o, lockOffset)) break;&lt;br&gt; &amp;nbsp; &amp;nbsp; }&lt;br&gt; - &amp;nbsp; &amp;nbsp;// o has been locked, must return before an exception can be thrown&lt;br&gt; &amp;nbsp; }&lt;br&gt; &lt;br&gt; + &amp;nbsp;@Inline&lt;br&gt; + &amp;nbsp;@Unpreemptible&lt;br&gt; + &amp;nbsp;public static boolean attemptToMarkInflated(Object o, Offset lockOffset,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word oldLockWord,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int lockId,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int cnt) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(oldLockWord.and(TL_STAT_MASK).NE(TL_STAT_FAT));&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (false) VM.sysWriteln(&quot;attemptToMarkInflated with oldLockWord = &quot;,oldLockWord);&lt;br&gt; + &amp;nbsp; &amp;nbsp;// what this needs to do:&lt;br&gt; + &amp;nbsp; &amp;nbsp;// 1) if the lock is thin, it's just a CAS&lt;br&gt; + &amp;nbsp; &amp;nbsp;// 2) if the lock is unbiased, CAS in the inflation&lt;br&gt; + &amp;nbsp; &amp;nbsp;// 3) if the lock is biased in our favor, store the lock without CAS&lt;br&gt; + &amp;nbsp; &amp;nbsp;// 4) if the lock is biased but to someone else, enter the pair handshake&lt;br&gt; + &amp;nbsp; &amp;nbsp;// &amp;nbsp; &amp;nbsp;to unbias it and install the inflated lock&lt;br&gt; + &amp;nbsp; &amp;nbsp;Word changed=&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;TL_STAT_FAT.or(Word.fromIntZeroExtend(lockId).lsh(TL_LOCK_ID_SHIFT))&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;.or(oldLockWord.and(TL_UNLOCK_MASK));&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (false &amp;amp;&amp;amp; oldLockWord.and(TL_STAT_MASK).EQ(TL_STAT_THIN))&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;VM.sysWriteln(&quot;obj = &quot;,Magic.objectAsAddress(o),&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&quot;, old = &quot;,oldLockWord,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&quot;, owner = &quot;,getLockOwner(oldLockWord),&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&quot;, rec = &quot;,getLockOwner(oldLockWord)==0?0:getRecCount(oldLockWord),&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&quot;, changed = &quot;,changed,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&quot;, lockId = &quot;,lockId);&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (false) VM.sysWriteln(&quot;changed = &quot;,changed);&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (oldLockWord.and(TL_STAT_MASK).EQ(TL_STAT_THIN)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (false) VM.sysWriteln(&quot;it's thin, inflating the easy way.&quot;);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;return Synchronization.tryCompareAndSwap(&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;o, lockOffset, oldLockWord, changed);&lt;br&gt; + &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;return casFromBiased(o, lockOffset, oldLockWord, changed, cnt);&lt;br&gt; + &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp;}&lt;br&gt; +&lt;br&gt; &amp;nbsp; /**&lt;br&gt; - &amp;nbsp; * Releases the lock on the indicated object. &amp;nbsp; Light-weight unlocking&lt;br&gt; - &amp;nbsp; * sequence for the epilogue of synchronized methods and for the&lt;br&gt; - &amp;nbsp; * &amp;lt;code&gt;monitorexit&amp;lt;/code&gt; bytecode.&lt;br&gt; + &amp;nbsp; * Promotes a light-weight lock to a heavy-weight lock. &amp;nbsp;If this returns the lock&lt;br&gt; + &amp;nbsp; * that you gave it, its mutex will be locked; otherwise, its mutex will be unlocked.&lt;br&gt; + &amp;nbsp; * Hence, calls to this method should always be followed by a condition lock() or&lt;br&gt; + &amp;nbsp; * unlock() call.&lt;br&gt; &amp;nbsp; &amp;nbsp;*&lt;br&gt; - &amp;nbsp; * @param o the object to be locked&lt;br&gt; + &amp;nbsp; * @param o the object to get a heavy-weight lock&lt;br&gt; &amp;nbsp; &amp;nbsp;* @param lockOffset the offset of the thin lock word in the object.&lt;br&gt; + &amp;nbsp; * @return the inflated lock; either the one you gave, or another one, if the lock&lt;br&gt; + &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; was inflated by some other thread.&lt;br&gt; &amp;nbsp; &amp;nbsp;*/&lt;br&gt; - &amp;nbsp;@NoInline&lt;br&gt; - &amp;nbsp;@Unpreemptible(&quot;No preemption normally, but may raise exceptions&quot;)&lt;br&gt; - &amp;nbsp;public static void unlock(Object o, Offset lockOffset) {&lt;br&gt; - &amp;nbsp; &amp;nbsp;Magic.sync(); // prevents stale data from being seen by next owner of the lock&lt;br&gt; - &amp;nbsp; &amp;nbsp;while (true) { // spurious contention detected&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;Word old = Magic.prepareWord(o, lockOffset);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;Word id = old.and(TL_THREAD_ID_MASK.or(TL_FAT_LOCK_MASK));&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;Word threadId = Word.fromIntZeroExtend(RVMThread.getCurrentThread().getLockingId());&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;if (id.NE(threadId)) { // not normal case&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!(old.and(TL_FAT_LOCK_MASK).isZero())) { // o has a heavy lock&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Lock.getLock(getLockIndex(old)).unlockHeavy(o);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// note that unlockHeavy has issued a sync&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;br&gt; + &amp;nbsp;@NoNullCheck&lt;br&gt; + &amp;nbsp;@Unpreemptible&lt;br&gt; + &amp;nbsp;protected static Lock attemptToInflate(Object o,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Offset lockOffset,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Lock l) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (false) VM.sysWriteln(&quot;l = &quot;,Magic.objectAsAddress(l));&lt;br&gt; + &amp;nbsp; &amp;nbsp;l.mutex.lock();&lt;br&gt; + &amp;nbsp; &amp;nbsp;for (int cnt=0;;++cnt) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Word bits = Magic.getWordAtOffset(o, lockOffset);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;// check to see if another thread has already created a fat lock&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (isFat(bits)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (trace) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;VM.sysWriteln(&quot;Thread #&quot;,RVMThread.getCurrentThreadSlot(),&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&quot;: freeing lock &quot;,Magic.objectAsAddress(l),&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&quot; because we had a double-inflate&quot;);&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.trace(&quot;Lock&quot;, &quot;unlock error: thin lock word = &quot;, old.toAddress());&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.trace(&quot;Lock&quot;, &quot;unlock error: thin lock word = &quot;, Magic.objectAsAddress(o));&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// RVMThread.trace(&quot;Lock&quot;, RVMThread.getCurrentThread().toString(), 0);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;RVMThread.raiseIllegalMonitorStateException(&quot;thin unlocking&quot;, o);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Lock result = Lock.getLock(getLockIndex(bits));&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (result==null ||&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result.lockedObject!=o) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;continue; /* this is nasty. &amp;nbsp;this will happen when a lock&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; is deflated. */&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Lock.free(l);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;l.mutex.unlock();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return result;&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;if (old.and(TL_LOCK_COUNT_MASK).isZero()) { // get count, 0 is the last lock&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word changed = old.and(TL_UNLOCK_MASK);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Magic.attemptWord(o, lockOffset, old, changed)) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return; // unlock succeeds&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(l!=null);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (attemptToMarkInflated(&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;o, lockOffset, bits, l.index, cnt)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;l.setLockedObject(o);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;l.setOwnerId(getLockOwner(bits));&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (l.getOwnerId() != 0) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;l.setRecursionCount(getRecCount(bits));&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(l.getRecursionCount()==0);&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;continue;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return l;&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;// more than one lock&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;// decrement recursion count&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;Word changed = old.toAddress().minus(TL_LOCK_COUNT_UNIT).toWord();&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Magic.attemptWord(o, lockOffset, old, changed)) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return; // unlock succeeds&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;// contention detected, try again&lt;br&gt; + &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp;}&lt;br&gt; +&lt;br&gt; + &amp;nbsp;@Inline&lt;br&gt; + &amp;nbsp;@Uninterruptible&lt;br&gt; + &amp;nbsp;private static Word biasBitsToThinBits(Word bits) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;int lockOwner=getLockOwner(bits);&lt;br&gt; +&lt;br&gt; + &amp;nbsp; &amp;nbsp;Word changed=bits.and(TL_UNLOCK_MASK).or(TL_STAT_THIN);&lt;br&gt; +&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (lockOwner!=0) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;int recCount=getRecCount(bits);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;changed=changed&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.or(Word.fromIntZeroExtend(lockOwner))&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.or(Word.fromIntZeroExtend(recCount-1).lsh(TL_LOCK_COUNT_SHIFT));&lt;br&gt; + &amp;nbsp; &amp;nbsp;}&lt;br&gt; +&lt;br&gt; + &amp;nbsp; &amp;nbsp;return changed;&lt;br&gt; + &amp;nbsp;}&lt;br&gt; +&lt;br&gt; + &amp;nbsp;@Inline&lt;br&gt; + &amp;nbsp;@Uninterruptible&lt;br&gt; + &amp;nbsp;public static boolean attemptToMarkDeflated(Object o, Offset lockOffset,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word oldLockWord) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;// we allow concurrent modification of the lock word when it's thin or fat.&lt;br&gt; + &amp;nbsp; &amp;nbsp;Word changed=oldLockWord.and(TL_UNLOCK_MASK).or(TL_STAT_THIN);&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(getLockOwner(changed)==0);&lt;br&gt; + &amp;nbsp; &amp;nbsp;return Synchronization.tryCompareAndSwap(&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;o, lockOffset, oldLockWord, changed);&lt;br&gt; + &amp;nbsp;}&lt;br&gt; +&lt;br&gt; + &amp;nbsp;@Uninterruptible&lt;br&gt; + &amp;nbsp;public static void markDeflated(Object o, Offset lockOffset, int id) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;for (;;) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Word bits=Magic.getWordAtOffset(o, lockOffset);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(isFat(bits));&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(getLockIndex(bits)==id);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (attemptToMarkDeflated(o, lockOffset, bits)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt; &amp;nbsp; &amp;nbsp; }&lt;br&gt; &amp;nbsp; }&lt;br&gt; &lt;br&gt; + &amp;nbsp;@NoNullCheck&lt;br&gt; + &amp;nbsp;@Unpreemptible&lt;br&gt; + &amp;nbsp;public static boolean lockHeader(Object o, Offset lockOffset) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;// what this should do:&lt;br&gt; + &amp;nbsp; &amp;nbsp;// 1) take advantage of the fact that if a lock is fat it can only go back to&lt;br&gt; + &amp;nbsp; &amp;nbsp;// &amp;nbsp; &amp;nbsp;being thin, so concurrent modification of the lock word is allowed.&lt;br&gt; + &amp;nbsp; &amp;nbsp;// 2) if it's biased, we own it anyway so we can &quot;lock&quot; it by incrementing the&lt;br&gt; + &amp;nbsp; &amp;nbsp;// &amp;nbsp; &amp;nbsp;count.&lt;br&gt; + &amp;nbsp; &amp;nbsp;Word threadId = Word.fromIntZeroExtend(RVMThread.getCurrentThread().getLockingId());&lt;br&gt; + &amp;nbsp; &amp;nbsp;for (;;) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;boolean attemptToInflate=false;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;Word old=Magic.getWordAtOffset(o,lockOffset);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;if (old.and(TL_STAT_MASK).NE(TL_STAT_BIASABLE)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(old.and(TL_STAT_MASK).EQ(TL_STAT_THIN) ||&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;old.and(TL_STAT_MASK).EQ(TL_STAT_FAT));&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return false;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word id = old.and(TL_THREAD_ID_MASK);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// what do we do here? &amp;nbsp;if we have the bias, then it's easy. &amp;nbsp;but what&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// if we don't? &amp;nbsp;in that case we need to be ultra-careful. &amp;nbsp;what we can&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// do:&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// 1) if the lock is biased in our favor, then lock it&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// 2) if the lock is unbiased, then bias it in our favor an lock it&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// 3) if the lock is biased in someone else's favor, inflate it (so we can go above)&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (id.isZero()) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// lock is unbiased, bias it in our favor and grab it&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Synchronization.tryCompareAndSwap(&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;o, lockOffset,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;old,&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;old.or(threadId).toAddress().plus(TL_LOCK_COUNT_UNIT).toWord())) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.isync();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return true;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (id.EQ(threadId)) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// lock is biased in our favor, so grab it&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Word changed = old.toAddress().plus(TL_LOCK_COUNT_UNIT).toWord();&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!changed.and(TL_LOCK_COUNT_MASK).isZero()) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Magic.setWordAtOffset(o, lockOffset, changed);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return true;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;attemptToInflate=true;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;attemptToInflate=true;&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; +&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (attemptToInflate) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;inflate(o,lockOffset);&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp;}&lt;br&gt; +&lt;br&gt; + &amp;nbsp;@NoNullCheck&lt;br&gt; + &amp;nbsp;@Unpreemptible&lt;br&gt; + &amp;nbsp;public static void unlockHeader(Object o, Offset lockOffset,boolean lockHeaderResult) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;// what to do here?&lt;br&gt; + &amp;nbsp; &amp;nbsp;// 1) if lockHeaderResult is false, we're done&lt;br&gt; + &amp;nbsp; &amp;nbsp;// 2) if lockHeaderResult is true, release the lock.&lt;br&gt; + &amp;nbsp; &amp;nbsp;if (lockHeaderResult) {&lt;br&gt; + &amp;nbsp; &amp;nbsp; &amp;nbsp;unlock(o, lockOffset);&lt;br&gt; + &amp;nbsp; &amp;nbsp;}&lt;br&gt; + &amp;nbsp;}&lt;br&gt; +&lt;br&gt; + &amp;nbsp;@Inline&lt;br&gt; + &amp;nbsp;@Uninterruptible&lt;br&gt; + &amp;nbsp;public static boolean allowHeaderCAS(Object o, Offset lockOffset) {&lt;br&gt; + &amp;nbsp; &amp;nbsp;return Magic.getWordAtOffset(o,lockOffset).and(TL_STAT_MASK).NE(TL_STAT_BIASABLE);&lt;br&gt; + &amp;nbsp;}&lt;br&gt; +&lt;br&gt; &amp;nbsp; ////////////////////////////////////////////////////////////////&lt;br&gt; &amp;nbsp; /// Support for inflating (and deflating) heavy-weight locks ///&lt;br&gt; &amp;nbsp; ////////////////////////////////////////////////////////////////&lt;br&gt; @@ -246,11 +560,6 @@&lt;br&gt; &amp;nbsp; &amp;nbsp;*/&lt;br&gt; &amp;nbsp; @Unpreemptible&lt;br&gt; &amp;nbsp; private static Lock inflate(Object o, Offset lockOffset) {&lt;br&gt; - &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;VM._assert(holdsLock(o, lockOffset, RVMThread.getCurrentThread()));&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;// this assertions is just plain wrong.&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;//VM._assert((Magic.getWordAtOffset(o, lockOffset).and(TL_FAT_LOCK_MASK).isZero()));&lt;br&gt; - &amp;nbsp; &amp;nbsp;}&lt;br&gt; &amp;nbsp; &amp;nbsp; Lock l = Lock.allocate();&lt;br&gt; &amp;nbsp; &amp;nbsp; if (VM.VerifyAssertions) {&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; VM._assert(l != null); // inflate called by wait (or notify) which shouldn't be called during GC&lt;br&gt; @@ -283,86 +592,6 @@&lt;br&gt; &amp;nbsp; &amp;nbsp; return l.lockHeavyLocked(o);&lt;br&gt; &amp;nbsp; }&lt;br&gt; &lt;br&gt; - &amp;nbsp;/**&lt;br&gt; - &amp;nbsp; * Promotes a light-weight lock to a heavy-weight lock.&lt;br&gt; - &amp;nbsp; *&lt;br&gt; - &amp;nbsp; * @param o the object to get a heavy-weight lock&lt;br&gt; - &amp;nbsp; * @param lockOffset the offset of the thin lock word in the object.&lt;br&gt; - &amp;nbsp; * @return whether the object was successfully locked&lt;br&gt; - &amp;nbsp; */&lt;br&gt; - &amp;nbsp;private static Lock attemptToInflate(Object o, Offset lockOffset, Lock l) {&lt;br&gt; - &amp;nbsp; &amp;nbsp;Word old;&lt;br&gt; - &amp;nbsp; &amp;nbsp;l.mutex.lock();&lt;br&gt; - &amp;nbsp; &amp;nbsp;do {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;old = Magic.prepareWord(o, lockOffset);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;// check to see if another thread has already created a fat lock&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!(old.and(TL_FAT_LOCK_MASK).isZero())) { // already a fat lock in place&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Lock.trace) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;VM.sysWriteln(&quot;Thread #&quot;,RVMThread.getCurrentThreadSlot(),&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&quot;: freeing lock &quot;,Magic.objectAsAddress(l),&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&quot; because we had a double-inflate&quot;);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Lock.free(l);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;l.mutex.unlock();&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;l = Lock.getLock(getLockIndex(old));&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return l;&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;Word locked = TL_FAT_LOCK_MASK.or(Word.fromIntZeroExtend(l.index).lsh(TL_LOCK_ID_SHIFT));&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;Word changed = locked.or(old.and(TL_UNLOCK_MASK));&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;if (VM.VerifyAssertions) VM._assert(getLockIndex(changed) == l.index);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Magic.attemptWord(o, lockOffset, old, changed)) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;l.setLockedObject(o);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;l.setOwnerId(old.and(TL_THREAD_ID_MASK).toInt());&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (l.getOwnerId() != 0) {&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;l.setRecursionCount(old.and(TL_LOCK_COUNT_MASK).rshl(TL_LOCK_COUNT_SHIFT).toInt() + 1);&lt;br&gt; - &amp;nbsp; &amp;nbsp; &amp;nb