<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>A Concurrent Affair &#187; Concurrent Unit Testing</title>
	<atom:link href="http://www.concurrentaffair.org/category/research/concurrent-unit-testing/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.concurrentaffair.org</link>
	<description>a blog about Mathias&#039; work and play.</description>
	<lastBuildDate>Tue, 07 Feb 2012 07:11:31 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Java 7 for DrJava and Concutest</title>
		<link>http://www.concurrentaffair.org/2011/08/01/java-7-for-drjava-and-concutest/</link>
		<comments>http://www.concurrentaffair.org/2011/08/01/java-7-for-drjava-and-concutest/#comments</comments>
		<pubDate>Mon, 01 Aug 2011 15:58:49 +0000</pubDate>
		<dc:creator>Mathias</dc:creator>
				<category><![CDATA[Concurrent Unit Testing]]></category>
		<category><![CDATA[DrJava]]></category>

		<guid isPermaLink="false">http://www.concurrentaffair.org/2011/08/01/java-7-for-drjava-and-concutest/</guid>
		<description><![CDATA[I worked on Java 7 support this weekend, and I&#8217;m almost done. I just discovered that Concutest is currently incompatible with Java 7, though, so I will need to disable the ConcJUnit option in DrJava when using Java 7. I &#8230; <a href="http://www.concurrentaffair.org/2011/08/01/java-7-for-drjava-and-concutest/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I worked on Java 7 support this weekend, and I&#8217;m almost done. I just discovered that Concutest is currently incompatible with Java 7, though, so I will need to disable the ConcJUnit option in DrJava when using Java 7. I also need to test on Mac and Linux.</p>

<p>I&#8217;ll try to finish this tonight so we can get a beta out. Or should we release a stable version without this code?</p>

<p>Fixing Concutest will take a bit longer, of course.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.concurrentaffair.org/2011/08/01/java-7-for-drjava-and-concutest/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Paging Stuff Back Into My Brain</title>
		<link>http://www.concurrentaffair.org/2010/10/20/paging-stuff-back-into-my-brain/</link>
		<comments>http://www.concurrentaffair.org/2010/10/20/paging-stuff-back-into-my-brain/#comments</comments>
		<pubDate>Wed, 20 Oct 2010 22:06:57 +0000</pubDate>
		<dc:creator>Mathias</dc:creator>
				<category><![CDATA[Concurrent Unit Testing]]></category>
		<category><![CDATA[Teaching]]></category>

		<guid isPermaLink="false">http://www.concurrentaffair.org/?p=2355</guid>
		<description><![CDATA[I gave the second lecture as Corky&#8217;s substitute in COMP 311 today. We talked about object-oriented languages in general, and Java in particular. I didn&#8217;t talk about the historical perspective on OO (slide 5), and I only mentioned multiple inheritance &#8230; <a href="http://www.concurrentaffair.org/2010/10/20/paging-stuff-back-into-my-brain/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I gave the <a href="http://www.cs.rice.edu/~javaplt/311/Lectures/21.pdf">second lecture</a> as Corky&#8217;s substitute in <a href="http://www.cs.rice.edu/~javaplt/311/">COMP 311</a> today. We talked about object-oriented languages in general, and Java in particular.</p>

<p>I didn&#8217;t talk about the historical perspective on OO (slide 5), and I only mentioned multiple inheritance and prototype-based OO languages briefly. Other than that, I finished slides 1-7, i.e. including &#8220;Java Implementation I&#8221;. I also talked a bit about static and dynamic chains, how Java doesn&#8217;t have a static chain, and why.</p>

<p>I&#8217;m always happy when I get the opportunity to do a lecture.</p>

<p>Now I&#8217;m loading stuff back into my brain that I had paged out into swap space a few months ago&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.concurrentaffair.org/2010/10/20/paging-stuff-back-into-my-brain/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>No Nifty Assignment for the Educators Symposium</title>
		<link>http://www.concurrentaffair.org/2010/06/29/no-nifty-assignment-for-the-educators-symposium/</link>
		<comments>http://www.concurrentaffair.org/2010/06/29/no-nifty-assignment-for-the-educators-symposium/#comments</comments>
		<pubDate>Tue, 29 Jun 2010 22:02:48 +0000</pubDate>
		<dc:creator>Mathias</dc:creator>
				<category><![CDATA[Concurrent Unit Testing]]></category>

		<guid isPermaLink="false">http://www.concurrentaffair.org/?p=1936</guid>
		<description><![CDATA[I started writing too late and I discovered I still have some strange source of nondeterminism in my supposedly deterministic single-threaded application, so I won&#8217;t be submitting a Nifty Assignment to the Educators Symposium at OOPSLA/SPLASH this year. Too bad. &#8230; <a href="http://www.concurrentaffair.org/2010/06/29/no-nifty-assignment-for-the-educators-symposium/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I started writing too late and I discovered I still have some strange source of nondeterminism in my supposedly deterministic single-threaded application, so I won&#8217;t be submitting a Nifty Assignment to the <a href="http://www.splashcon.org/index.php?option=com_content&amp;view=article&amp;id=59:educators-and-trainers-symposium&amp;catid=38:due-june-30-2010&amp;Itemid=58" class="broken_link">Educators Symposium</a> at OOPSLA/SPLASH this year.</p>

<p>Too bad. But maybe I&#8217;ll have enough together for the <a href="http://www.sigcse.org/sigcse2011/authors/">next SIGCSE</a>. Paper submissions are due September 10, 2010.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.concurrentaffair.org/2010/06/29/no-nifty-assignment-for-the-educators-symposium/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Beethoven and Brainstorming</title>
		<link>http://www.concurrentaffair.org/2010/05/16/beethoven-and-brainstorming/</link>
		<comments>http://www.concurrentaffair.org/2010/05/16/beethoven-and-brainstorming/#comments</comments>
		<pubDate>Sun, 16 May 2010 19:28:57 +0000</pubDate>
		<dc:creator>Mathias</dc:creator>
				<category><![CDATA[Concurrent Unit Testing]]></category>
		<category><![CDATA[Pictures]]></category>

		<guid isPermaLink="false">http://www.concurrentaffair.org/?p=1865</guid>
		<description><![CDATA[I went on a walk today, on the prettiest day so far, for some Beethoven and brainstorming. I think I came up with some more nice ties back to my Master&#8217;s thesis.]]></description>
			<content:encoded><![CDATA[<p>I went on a walk today, on the prettiest day so far, for some Beethoven and brainstorming. I think I came up with some more nice ties back to my Master&#8217;s thesis.</p>

<div id="attachment_1867" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.concurrentaffair.org/wp-content/uploads/2010/05/Photo_051610_006.jpg"><img src="http://www.concurrentaffair.org/wp-content/uploads/2010/05/Photo_051610_006-300x240.jpg" alt="Brainstorming outside." title="Photo_051610_006" width="300" height="240" class="size-medium wp-image-1867" /></a><p class="wp-caption-text">Brainstorming outside.</p></div>

<div id="attachment_1866" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.concurrentaffair.org/wp-content/uploads/2010/05/Photo_051610_003.jpg"><img src="http://www.concurrentaffair.org/wp-content/uploads/2010/05/Photo_051610_003-300x240.jpg" alt="Outside on a sunny day." title="Photo_051610_003" width="300" height="240" class="size-medium wp-image-1866" /></a><p class="wp-caption-text">Sitting outside on a sunny day, with Beethoven in my ears.</p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.concurrentaffair.org/2010/05/16/beethoven-and-brainstorming/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Short Summary</title>
		<link>http://www.concurrentaffair.org/2010/04/06/short-summary/</link>
		<comments>http://www.concurrentaffair.org/2010/04/06/short-summary/#comments</comments>
		<pubDate>Tue, 06 Apr 2010 05:58:56 +0000</pubDate>
		<dc:creator>Mathias</dc:creator>
				<category><![CDATA[Concurrent Unit Testing]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.concurrentaffair.org/?p=1768</guid>
		<description><![CDATA[The last few days summed up: Happy Easter! Still working on propagating reachability-from information into the methods. That should allow me to do a simple run-once-run-many analysis. I noticed my scanner was broken too, not just the power supply. FedEx &#8230; <a href="http://www.concurrentaffair.org/2010/04/06/short-summary/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>The last few days summed up:</p>

<ul>
    <li>Happy Easter!</li>
    <li>Still working on propagating reachability-from information into the methods. That should allow me to do a simple run-once-run-many analysis.</li>
    <li>I noticed my scanner was broken too, <a href="http://www.concurrentaffair.org/2010/03/26/ups-went-poof/">not just the power supply</a>.</li>
    <li>FedEx delivered my new scanner, a Canon CanoScan LiDE100, on Saturday, and it rocks.</li>
    <li>I <a href="http://www.concurrentaffair.org/2010/03/27/radioshack-power-supply/">returned the power supply</a> to RadioShack. Thanks for the loan. I love America.</li>
    <li>Congratulations to a very nice MS defense, Jun.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.concurrentaffair.org/2010/04/06/short-summary/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Soot May-Happen-in-Parallel Analysis</title>
		<link>http://www.concurrentaffair.org/2010/04/01/soot-may-happen-in-parallel-analysis/</link>
		<comments>http://www.concurrentaffair.org/2010/04/01/soot-may-happen-in-parallel-analysis/#comments</comments>
		<pubDate>Thu, 01 Apr 2010 23:49:18 +0000</pubDate>
		<dc:creator>Mathias</dc:creator>
				<category><![CDATA[Concurrent Unit Testing]]></category>

		<guid isPermaLink="false">http://www.concurrentaffair.org/?p=1765</guid>
		<description><![CDATA[I got Soot&#8217;s &#8220;may happen in parallel&#8221; (MHP) analysis to work, but only on a very small, completely unrealistic example which I used to test my &#8220;shared volatile&#8221; code (source below). Even for this, I needed to set the heap &#8230; <a href="http://www.concurrentaffair.org/2010/04/01/soot-may-happen-in-parallel-analysis/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I got Soot&#8217;s &#8220;may happen in parallel&#8221; (MHP) analysis to work, but only on a very small, completely unrealistic example which I used to test my &#8220;shared volatile&#8221; code (source below). Even for this, I needed to set the heap size to 2 GB (which, if I remember correctly, won&#8217;t work on Windows machines). Anything a little bit bigger either exhausted
memory or caused the JVM garbage collector crash.</p>

<p>They must be horribly inefficient with their static analysis. In one of the theses I read today, the biggest benchmarks had 3,800 lines of code. Maybe I am doing something wrong, because they used 1.5 GB heap, but as of now I have doubts their analysis scales to real applications like DrJava.</p>

<p>Furthermore, Soot&#8217;s MHP analysis doesn&#8217;t take the event thread into account, but this is probably a smaller issue.</p>

<div class="codecolorer-container java default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br /></div></td><td><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">testers.volatileVarsThread</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> VolatileVarsThread <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">volatile</span> <span style="color: #000066; font-weight: bold;">int</span> vsField<span style="color: #339933;">;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">int</span> sField<span style="color: #339933;">;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">volatile</span> <span style="color: #000066; font-weight: bold;">int</span> vsField_notShared<span style="color: #339933;">;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">int</span> sField_notShared<span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;doStuff<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Athread+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Thread</span></a><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Arunnable+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Runnable</span></a><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> run<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #339933;">++</span>vsField<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #339933;">++</span>sField<span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">System</span></a>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Foo&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #000066; font-weight: bold;">int</span> i <span style="color: #339933;">=</span> doStuff<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> doStuff<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">System</span></a>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;i = &quot;</span><span style="color: #339933;">+</span>i<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;I c <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> C<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;c.<span style="color: #006633;">doSomething</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">catch</span><span style="color: #009900;">&#40;</span>java.<span style="color: #006633;">lang</span>.<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Exception</span></a> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #339933;">++</span>vsField_notShared <span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #339933;">++</span>sField_notShared<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;B b <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> B<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;b.<span style="color: #006633;">doSomething</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp;<span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">int</span> doStuff<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> A<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">foo</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp;<span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">class</span> A <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">int</span> foo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">return</span> bar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp;<span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">int</span> bar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #cc66cc;">123</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp;<span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">interface</span> I <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> doSomething<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">class</span> B <span style="color: #000000; font-weight: bold;">implements</span> I <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">volatile</span> <span style="color: #000066; font-weight: bold;">int</span> vField_notShared<span style="color: #339933;">;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">int</span> field_notShared<span style="color: #339933;">;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">volatile</span> <span style="color: #000066; font-weight: bold;">int</span> vField_notSharedButDynamicTarget<span style="color: #339933;">;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">int</span> field_notSharedButDynamicTarget<span style="color: #339933;">;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">public</span> B<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #339933;">++</span>vField_notShared<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #339933;">++</span>field_notShared<span style="color: #339933;">;</span><br />
&nbsp; &nbsp;<span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> doSomething<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #339933;">++</span>vField_notSharedButDynamicTarget<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #339933;">++</span>field_notSharedButDynamicTarget<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">System</span></a>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;B.doSomething&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp;<span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">class</span> C <span style="color: #000000; font-weight: bold;">implements</span> I <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">volatile</span> <span style="color: #000066; font-weight: bold;">int</span> vField <span style="color: #339933;">=</span> <span style="color: #cc66cc;">3</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">int</span> field <span style="color: #339933;">=</span> <span style="color: #cc66cc;">4</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> doSomething<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;vField <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;field <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">System</span></a>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;C.doSomething&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp;<span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
]]></content:encoded>
			<wfw:commentRss>http://www.concurrentaffair.org/2010/04/01/soot-may-happen-in-parallel-analysis/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Back and Wanting More</title>
		<link>http://www.concurrentaffair.org/2010/03/18/back-and-wanting-more/</link>
		<comments>http://www.concurrentaffair.org/2010/03/18/back-and-wanting-more/#comments</comments>
		<pubDate>Thu, 18 Mar 2010 18:41:21 +0000</pubDate>
		<dc:creator>Mathias</dc:creator>
				<category><![CDATA[Concurrent Unit Testing]]></category>
		<category><![CDATA[Teaching]]></category>

		<guid isPermaLink="false">http://www.concurrentaffair.org/?p=1725</guid>
		<description><![CDATA[This is my second day back from my talks at SIGCSE and Purdue, and I&#8217;m already wanting more. We&#8217;re finalizing our Mint paper for PLDI, and I&#8217;m thinking about a nifty assignment for the SPLASH/OOPSLA Educators&#8217; Symposium. I couldn&#8217;t really &#8230; <a href="http://www.concurrentaffair.org/2010/03/18/back-and-wanting-more/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>This is my second day back from <a href="http://www.concurrentaffair.org/2010/03/12/done-with-sigcse-talk/">my talks at SIGCSE</a> and <a href="http://www.concurrentaffair.org/2010/03/15/happy-about-purdue-talk/">Purdue</a>, and I&#8217;m already wanting more. We&#8217;re finalizing our <a href="http://www.concurrentaffair.org/2010/01/30/mint-paper-accepted-to-pldi-2010/">Mint paper for PLDI</a>, and I&#8217;m thinking about a nifty assignment for the SPLASH/OOPSLA Educators&#8217; Symposium.</p>

<p>I couldn&#8217;t really find a lot of information about the Educators&#8217; Symposium on the <a href="http://www.splashcon.org/">SPLASH/OOPSLA website</a>, except that Educators&#8217; Symposium submissions are supposedly due next week, on March 25.</p>

<p>Fortunately, symposium chair Ed Gehringer told me the Call for Participation will be released within the next two weeks, and that there will be 2.5 to 3 months after that to the submission deadline. Maybe it will coincide with the June 24 deadline for SPLASH posters, demonstrations, submissions to the Doctoral Symposium, Onward! films, and Student Volunteers.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.concurrentaffair.org/2010/03/18/back-and-wanting-more/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Short, Non-Technical Talks Are Hard</title>
		<link>http://www.concurrentaffair.org/2010/02/25/short-non-technical-talks-are-hard/</link>
		<comments>http://www.concurrentaffair.org/2010/02/25/short-non-technical-talks-are-hard/#comments</comments>
		<pubDate>Fri, 26 Feb 2010 00:43:20 +0000</pubDate>
		<dc:creator>Mathias</dc:creator>
				<category><![CDATA[Concurrent Unit Testing]]></category>
		<category><![CDATA[Graduate School]]></category>

		<guid isPermaLink="false">http://www.concurrentaffair.org/?p=1682</guid>
		<description><![CDATA[I just gave my talk Testing Concurrent Programs, A 7-Minute Jargon-Free Introduction to the students of the Thesis Writing Seminar of the School of Engineering here at Rice. It went very well, but I&#8217;ve got to say that this was &#8230; <a href="http://www.concurrentaffair.org/2010/02/25/short-non-technical-talks-are-hard/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I just gave my talk <a href="http://www.concurrentaffair.org/2010/02/25/presentation-testing-concurrent-programs-a-7-minute-jargon-free-introduction/">Testing Concurrent Programs, A 7-Minute Jargon-Free Introduction</a> to the students of the <a href="http://engr.rice.edu/content.aspx?id=2052">Thesis Writing Seminar</a> of the School of Engineering here at Rice. It went very well, but I&#8217;ve got to say that this was probably the most difficult talk I&#8217;ve had to prepare.</p>

<p>It is a 7-minute talk to an audience of smart engineering graduate students who generally are in all kinds of different fields. You can&#8217;t really use jargon or assume too much background knowledge and be too technical, otherwise you might lose your audience. You also can&#8217;t spend too much time explaining concepts. And at eight minutes, you get cut off.</p>

<p>I&#8217;ve really had to cut the number of slides down, gloss over a few things, and unfortunately also ignore some achievements that I think are really cool, like the reachability check of the join graph, which prevents &#8220;lucky&#8221; threads. Because of the extremely short time, practicing the talk pays off a lot, because your explanations just have to work. You don&#8217;t have time to start over.</p>

<p>The talk went very well and received unanimously positive feedback. What people liked the most was that it was virtually jargon-free, that the animations were simple and helpful, and that I was able to simplify the concepts and make them accessible to non-computer scientists without talking down to them.</p>

<p>Again, I finished working on the presentation only an hour before the talk, and my delivery definitely could have benefited from more time to practice. I also still haven&#8217;t figured out how to take a sip of water while giving a talk, but seven minutes fortunately were not long enough to develop a serious case of dry mouth.</p>

<p>Interestingly, Rui Zhang&#8217;s talk about software transactional memory was next, and my talk served as a good introduction.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.concurrentaffair.org/2010/02/25/short-non-technical-talks-are-hard/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&lt;clinit&gt; in The Thread of First Use</title>
		<link>http://www.concurrentaffair.org/2010/02/16/clinit-in-the-thread-of-first-use/</link>
		<comments>http://www.concurrentaffair.org/2010/02/16/clinit-in-the-thread-of-first-use/#comments</comments>
		<pubDate>Wed, 17 Feb 2010 05:21:16 +0000</pubDate>
		<dc:creator>Mathias</dc:creator>
				<category><![CDATA[Concurrent Unit Testing]]></category>

		<guid isPermaLink="false">http://www.concurrentaffair.org/?p=1657</guid>
		<description><![CDATA[Question: In which thread does &#60;clinit&#62; run? Answer: &#60;clinit&#62; is being executed in whatever thread uses the class first. 123456789101112131415161718192021222324252627282930313233343536package testers; import java.awt.EventQueue; public class CLInit &#123; &#160; &#160; public static void main&#40;String&#91;&#93; args&#41; throws Exception &#123; &#160; &#160; &#160; &#8230; <a href="http://www.concurrentaffair.org/2010/02/16/clinit-in-the-thread-of-first-use/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.concurrentaffair.org/2010/02/16/clinitin-which-thread/">Question: In which thread does <code class="codecolorer text mac-classic"><span class="text">&lt;clinit&gt;</span></code> run?</a></p>

<p>Answer: <code class="codecolorer text mac-classic"><span class="text">&lt;clinit&gt;</span></code> is being executed in whatever thread uses the class first.</p>

<div class="codecolorer-container java default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br /></div></td><td><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">testers</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.awt.EventQueue</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> CLInit <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Exception</span></a> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">new</span> CLInit2<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">doSomething</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aeventqueue+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">EventQueue</span></a>.<span style="color: #006633;">invokeAndWait</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Arunnable+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Runnable</span></a><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> run<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">new</span> CLInit2<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">doSomething</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">new</span> CLInit3<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">doSomething</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">new</span> CLInit3<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">doSomething</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">class</span> CLInit2 <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">System</span></a>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;CLInit2.&lt;CLInit&gt;: &quot;</span><span style="color: #339933;">+</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Athread+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Thread</span></a>.<span style="color: #006633;">currentThread</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> doSomething<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">System</span></a>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;CLInit2.doSomething&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">class</span> CLInit3 <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">System</span></a>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;CLInit3.&lt;CLInit&gt;: &quot;</span><span style="color: #339933;">+</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Athread+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Thread</span></a>.<span style="color: #006633;">currentThread</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> doSomething<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">System</span></a>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;CLInit3.doSomething&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>

<p>produces the output</p>

<p><pre>$ java testers.CLInit
CLInit2.&lt;CLInit&gt;: Thread[main,5,main]
CLInit2.doSomething
CLInit2.doSomething
CLInit3.&lt;CLInit&gt;: Thread[AWT-EventQueue-0,6,main]
CLInit3.doSomething
CLInit3.doSomething</pre></p>

<p>As you can see, the class initializer for <code class="codecolorer text mac-classic"><span class="text">CLInit2</span></code> is run in the main thread, but the one for <code class="codecolorer text mac-classic"><span class="text">CLInit3</span></code> is executed in the event thread.</p>

<p>The implication of this is that class initializers may run in the event thread (or auxiliary threads) and therefore have to be considered when I compute the methods that are reachable in auxiliary threads or the event thread.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.concurrentaffair.org/2010/02/16/clinit-in-the-thread-of-first-use/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>&lt;clinit&gt; in Which Thread?</title>
		<link>http://www.concurrentaffair.org/2010/02/16/clinit-in-which-thread/</link>
		<comments>http://www.concurrentaffair.org/2010/02/16/clinit-in-which-thread/#comments</comments>
		<pubDate>Tue, 16 Feb 2010 06:58:11 +0000</pubDate>
		<dc:creator>Mathias</dc:creator>
				<category><![CDATA[Concurrent Unit Testing]]></category>

		<guid isPermaLink="false">http://www.concurrentaffair.org/?p=1637</guid>
		<description><![CDATA[Question: In which thread does &#60;clinit&#62; run? Answer tomorrow.]]></description>
			<content:encoded><![CDATA[<p>Question: In which thread does <code class="codecolorer text mac-classic"><span class="text">&lt;clinit&gt;</span></code> run?</p>

<p><a href="http://www.concurrentaffair.org/2010/02/16/clinit-in-the-thread-of-first-use/">Answer</a> tomorrow.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.concurrentaffair.org/2010/02/16/clinit-in-which-thread/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Free Java Book</title>
		<link>http://www.concurrentaffair.org/2010/02/15/the-free-java-book/</link>
		<comments>http://www.concurrentaffair.org/2010/02/15/the-free-java-book/#comments</comments>
		<pubDate>Mon, 15 Feb 2010 18:32:05 +0000</pubDate>
		<dc:creator>Mathias</dc:creator>
				<category><![CDATA[Concurrent Unit Testing]]></category>
		<category><![CDATA[DrJava]]></category>

		<guid isPermaLink="false">http://www.concurrentaffair.org/?p=1634</guid>
		<description><![CDATA[Corky just informed me that there is a talk by Daniel L. Schuster at SIGCSE 2010 about Java, games, and the Free Java Book. I&#8217;ll definitely check out the talk and the book. I&#8217;ll also examine how concurrency is handled &#8230; <a href="http://www.concurrentaffair.org/2010/02/15/the-free-java-book/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Corky just informed me that there is a <a href="http://db.grinnell.edu/sigcse/sigcse2010/Program/viewAcceptedProposal.asp?sessionType=paper&#038;sessionNumber=180">talk</a> by <a href="http://webapps.western.edu/faculty/dschuster/index.html">Daniel L. Schuster</a> at <a href="http://www.sigcse.org/sigcse2010/">SIGCSE 2010</a> about Java, games, and <a href="http://mcis.western.edu/freejavabook/">the Free Java Book</a>. I&#8217;ll definitely check out the talk and the book. I&#8217;ll also examine how concurrency is handled in the <a href="http://www-cs-faculty.stanford.edu/~eroberts/jtf/">ACM Java Library</a>.</p>

<p>Daniel is kind enough to state the following in his book:</p>

<blockquote>Dr. Java is the preferred development environment for the Free Java Book. It is an easy to use but powerful editor and development environment. It is available via download and is free.  Free as in $0.00! It is available for Windows and Mac. </blockquote>

<p>Thanks! I added a link to the Free Java Book to the list of <a href="http://drjava.org/index-frame.shtml?usersites.shtml">DrJava user sites</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.concurrentaffair.org/2010/02/15/the-free-java-book/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java Bug 4396719 Work-Around?</title>
		<link>http://www.concurrentaffair.org/2010/01/31/java-bug-4396719-work-around/</link>
		<comments>http://www.concurrentaffair.org/2010/01/31/java-bug-4396719-work-around/#comments</comments>
		<pubDate>Sun, 31 Jan 2010 17:00:54 +0000</pubDate>
		<dc:creator>Mathias</dc:creator>
				<category><![CDATA[Concurrent Unit Testing]]></category>
		<category><![CDATA[DrJava]]></category>

		<guid isPermaLink="false">http://www.concurrentaffair.org/?p=1517</guid>
		<description><![CDATA[It seems like I can get around the garbage collector bug if I use -XX:+UseConcMarkSweepGC JVM argument. Now I&#8217;m having more Soot problems, but they actually make sense. In addition to being cross-platform, DrJava is also &#8220;cross-JDK version&#8221;: We support &#8230; <a href="http://www.concurrentaffair.org/2010/01/31/java-bug-4396719-work-around/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>It seems like I can get around the <a href="http://www.concurrentaffair.org/2010/01/29/java-bug-4396719-mark-sweep-stack-overflow-on-deeply-nested-object-arrays/">garbage collector bug</a> if I use <tt>-XX:+UseConcMarkSweepGC</tt> JVM argument.</p>

<p>Now I&#8217;m having more Soot problems, but they actually make sense. In addition to being cross-platform, DrJava is also &#8220;cross-JDK version&#8221;: We support JDK versions 5 and 6 and OpenJDK version 6. In the past, we also supported JDK version 4 and various versions of <a href="http://jcp.org/en/jsr/detail?id=14">JSR-14</a> (adding generics to Java 4).</p>

<p>The adapter to the JDK 5 compiler is compiled with and linked against JDK 5; the adapter to the JDK 6 compiler is compiled with and linked against JDK 6. At runtime, we will never use a JDK 5 adapter with a JDK 6 compiler, and vice versa. But when I&#8217;m generating the call graph with JDK 6, Soot is now also looking at the JDK 5 adapter.</p>

<p>The JDK 5 <code class="codecolorer text mac-classic"><span class="text">com.sun.tools.javac.util.Log</span></code> class had a <code class="codecolorer text mac-classic"><span class="text">String getText(String a, Object[] b)</span></code> method, but that has disappeared in JDK 6. Therefore, Soot is not finding a method it expects.</p>

<p>I guess I will have to remove the cross-version capability for the purpose of the call graph creation.</p>

<p><b>Update</b></p>

<p>On Windows and Mac, using <tt>-XX:+UseConcMarkSweepGC</tt> actually seems to help. On Linux, I&#8217;m still getting a segfault.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.concurrentaffair.org/2010/01/31/java-bug-4396719-work-around/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Soot Build Instructions</title>
		<link>http://www.concurrentaffair.org/2010/01/30/soot-build-instructions/</link>
		<comments>http://www.concurrentaffair.org/2010/01/30/soot-build-instructions/#comments</comments>
		<pubDate>Sun, 31 Jan 2010 00:39:42 +0000</pubDate>
		<dc:creator>Mathias</dc:creator>
				<category><![CDATA[Concurrent Unit Testing]]></category>

		<guid isPermaLink="false">http://www.concurrentaffair.org/?p=1489</guid>
		<description><![CDATA[While trying to create a call graph of DrJava using Soot, I ran into some problems that were supposed to have been fixed in the Soot nightly builds already. Unfortunately, the nightly builds I could find were all many months &#8230; <a href="http://www.concurrentaffair.org/2010/01/30/soot-build-instructions/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>While trying to create a <a href="http://www.concurrentaffair.org/2010/01/29/more-details-on-soot-and-allow-phantom-refs/">call graph of DrJava using Soot</a>, I ran into some problems that were supposed to have been fixed in the <a href="http://plg.uwaterloo.ca/~olhotak/build/">Soot nightly builds</a> already. Unfortunately, the nightly builds I could find were all many months old. So I built Soot from scratch from the Subversion repository, which wasn&#8217;t an easy task.</p>

<p>Here are some instructions for building Soot:</p>

<ol>
    <li>Make sure you have <a href="http://ant.apache.org/">Ant</a> ant the JDK (5 or newer) installed.</li>
    <li>Check out and download all of these code bases in the same directory.</li>
    <li>Download <a href="http://www.sable.mcgill.ca/software/polyglotclasses-1.3.5.jar">Polyglot</a> from <a href="http://www.sable.mcgill.ca/soot/soot_download.html">http://www.sable.mcgill.ca/soot/soot_download.html</a>:
<pre>wget http://www.sable.mcgill.ca/software/polyglotclasses-1.3.5.jar</pre></li>

    <li>Check out Soot from <a href="https://svn.sable.mcgill.ca/soot/soot/trunk">https://svn.sable.mcgill.ca/soot/soot/trunk</a>:
<pre>svn checkout https://svn.sable.mcgill.ca/soot/soot/trunk soot-dev</pre></li>
    <li>Check out Jasmin from <a href="https://svn.sable.mcgill.ca/soot/jasmin/trunk">https://svn.sable.mcgill.ca/soot/jasmin/trunk</a>:
<pre>svn checkout https://svn.sable.mcgill.ca/soot/jasmin/trunk jasmin-dev</pre></li>
    <li>Check out JastAddJ from <a href="http://svn.jastadd.org/projects/trunk/JastAddJ" class="broken_link">http://svn.jastadd.org/projects/trunk/JastAddJ</a>:
<pre>svn co http://svn.jastadd.org/projects/trunk/JastAddJ</pre></li>
    <li>Check out JastAddExtensions from <a href="http://svn.jastadd.org/projects/trunk/JastAddExtensions" class="broken_link">http://svn.jastadd.org/projects/trunk/JastAddExtensions</a>:
<pre>svn co http://svn.jastadd.org/projects/trunk/JastAddExtensions</pre></li>
    <li>You should now have the following directory structure:
<pre>.
|-- polyglotclasses-1.3.5.jar
|-- JastAddExtensions
|   |-- ...
|   |-- SootJastAddJ
|   `-- ...
|-- JastAddJ
|   `-- ...
|-- jasmin-dev
|   |-- ...
|   |-- lib
|   |   `...
|   |-- ant.settings.template
|   |-- build.xml
|   `-- ...
`-- soot-dev
    |-- ...
    |-- lib
    |   `...
    |-- ant.settings.template
    |-- build.xml
    `-- ...</pre>
</li>
    <li>Copy <tt>jasmin-dev/ant.settings.template</tt> to <tt>jasmin-dev/ant.settings</tt>:
<pre>cp jasmin-dev/ant.settings.template jasmin-dev/ant.settings</pre></li>
    <li>Edit <tt>jasmin-dev/ant.settings</tt> so it contains the following lines:
<pre>java_cup.jar=../polyglotclasses-1.3.5.jar
jasmin.version=trunk</pre></li>
    <li>Change into the <tt>jasmin-dev</tt> directory, build the <tt>jasminclasses-trunk.jar</tt> file, and change back out of the directory:
<pre>cd jasmin-dev
ant jasmin-jar
cd ..</pre></li>
    <li>The freshly built Jasmin jar file is <tt>jasmin-dev/lib/jasminclasses-trunk.jar</tt>.</li>
    <li>Change into the <tt>JastAddExtensions/SootJastAddJ</tt> directory, regenerate the JastAdd-generated files for Soot, and change back out of the directory:
<pre>cd JastAddExtensions/SootJastAddJ
ant gen
cd ../..</pre></li>
    <li>Copy <tt>soot-dev/ant.settings.template</tt> to <tt>soot-dev/ant.settings</tt>:
<pre>cp soot-dev/ant.settings.template soot-dev/ant.settings</pre></li>
    <li>Edit <tt>soot-dev/ant.settings</tt> so it contains the following lines:
<pre>jastaddfrontend.loc=../JastAddExtensions/SootJastAddJ
polyglot.jar=../polyglotclasses-1.3.5.jar
jasmin.jar=../jasmin-dev/lib/jasminclasses-trunk.jar</pre></li>
    <li>Change into the <tt>soot-dev</tt> directory and build the <tt>sootclasses-trunk.jar</tt> file, and change back out of the directory:
<pre>cd soot-dev
ant classesjar
cd ..</pre>
<em>Note:</em> I received a compiler error here. I had to insert the second cast into <tt>soot-dev/src/soot/jbco/bafTransformations/FindDuplicateSequences.java</tt> to make line 282

<div class="codecolorer-container java default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Unit jump <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>Unit<span style="color: #009900;">&#41;</span> units.<span style="color: #006633;">getSuccOf</span><span style="color: #009900;">&#40;</span>next.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span>next.<span style="color: #006633;">size</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>

</li>
read

<div class="codecolorer-container java default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Unit jump <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>Unit<span style="color: #009900;">&#41;</span> units.<span style="color: #006633;">getSuccOf</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>Unit<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span>next.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span>next.<span style="color: #006633;">size</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>

</li>
    <li>The freshly built Soot jar file is <tt>soot-dev/lib/sootclasses-trunk.jar</tt>.</li>
</ol>

<p>Have fun with fresh Soot.</p>

<p>Here&#8217;s a bash script that does it all (except insert the cast): <a href='http://www.concurrentaffair.org/wp-content/uploads/2010/01/build-soot.sh.zip'>build-soot.sh.zip</a></p>

<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;">#!/bin/bash</span><br />
<br />
<span style="color: #666666; font-style: italic;"># Make sure you have Ant ant the JDK (5 or newer) installed.</span><br />
<span style="color: #666666; font-style: italic;"># Check out and download all of these code bases in the same directory.</span><br />
<span style="color: #666666; font-style: italic;"># Download Polyglot from http://www.sable.mcgill.ca/soot/soot_download.html: </span><br />
<span style="color: #c20cb9; font-weight: bold;">wget</span> http:<span style="color: #000000; font-weight: bold;">//</span>www.sable.mcgill.ca<span style="color: #000000; font-weight: bold;">/</span>software<span style="color: #000000; font-weight: bold;">/</span>polyglotclasses-1.3.5.jar<br />
<br />
<span style="color: #666666; font-style: italic;"># Check out Soot from https://svn.sable.mcgill.ca/soot/soot/trunk: </span><br />
<span style="color: #c20cb9; font-weight: bold;">svn checkout</span> https:<span style="color: #000000; font-weight: bold;">//</span>svn.sable.mcgill.ca<span style="color: #000000; font-weight: bold;">/</span>soot<span style="color: #000000; font-weight: bold;">/</span>soot<span style="color: #000000; font-weight: bold;">/</span>trunk soot-dev<br />
<br />
<span style="color: #666666; font-style: italic;"># Check out Jasmin from https://svn.sable.mcgill.ca/soot/jasmin/trunk: </span><br />
<span style="color: #c20cb9; font-weight: bold;">svn checkout</span> https:<span style="color: #000000; font-weight: bold;">//</span>svn.sable.mcgill.ca<span style="color: #000000; font-weight: bold;">/</span>soot<span style="color: #000000; font-weight: bold;">/</span>jasmin<span style="color: #000000; font-weight: bold;">/</span>trunk jasmin-dev<br />
<br />
<span style="color: #666666; font-style: italic;"># Check out JastAddJ from http://svn.jastadd.org/projects/trunk/JastAddJ:</span><br />
<span style="color: #c20cb9; font-weight: bold;">svn co</span> http:<span style="color: #000000; font-weight: bold;">//</span>svn.jastadd.org<span style="color: #000000; font-weight: bold;">/</span>projects<span style="color: #000000; font-weight: bold;">/</span>trunk<span style="color: #000000; font-weight: bold;">/</span>JastAddJ<br />
<br />
<span style="color: #666666; font-style: italic;"># Check out JastAddExtensions from</span><br />
<span style="color: #666666; font-style: italic;"># http://svn.jastadd.org/projects/trunk/JastAddExtensions:</span><br />
<span style="color: #c20cb9; font-weight: bold;">svn co</span> http:<span style="color: #000000; font-weight: bold;">//</span>svn.jastadd.org<span style="color: #000000; font-weight: bold;">/</span>projects<span style="color: #000000; font-weight: bold;">/</span>trunk<span style="color: #000000; font-weight: bold;">/</span>JastAddExtensions<br />
<br />
<span style="color: #666666; font-style: italic;"># Copy jasmin-dev/ant.settings.template to jasmin-dev/ant.settings:</span><br />
<span style="color: #666666; font-style: italic;"># Edit jasmin-dev/ant.settings so it contains the following lines:</span><br />
<span style="color: #666666; font-style: italic;"># java_cup.jar=../polyglotclasses-1.3.5.jar</span><br />
<span style="color: #666666; font-style: italic;"># jasmin.version=trunk</span><br />
<span style="color: #c20cb9; font-weight: bold;">cat</span> jasmin-dev<span style="color: #000000; font-weight: bold;">/</span>ant.settings.template <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sed</span> \<br />
<span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;s/.*\(java_cup.jar=\).*/\1..\/polyglotclasses-1.3.5.jar/&quot;</span> \<br />
<span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;s/.*\(jasmin.version=\).*/\1trunk/&quot;</span> \<br />
<span style="color: #000000; font-weight: bold;">&gt;</span> jasmin-dev<span style="color: #000000; font-weight: bold;">/</span>ant.settings<br />
<br />
<span style="color: #666666; font-style: italic;"># Change into the jasmin-dev directory, build the</span><br />
<span style="color: #666666; font-style: italic;"># jasminclasses-trunk.jar file, and change back out of the directory:</span><br />
<span style="color: #7a0874; font-weight: bold;">cd</span> jasmin-dev<br />
ant jasmin-jar<br />
<span style="color: #7a0874; font-weight: bold;">cd</span> ..<br />
<br />
<span style="color: #666666; font-style: italic;"># The freshly built Jasmin jar file is</span><br />
<span style="color: #666666; font-style: italic;"># jasmin-dev/lib/jasminclasses-trunk.jar. &nbsp;Change into the</span><br />
<span style="color: #666666; font-style: italic;"># JastAddExtensions/SootJastAddJ directory, regenerate the</span><br />
<span style="color: #666666; font-style: italic;"># JastAdd-generated files for Soot, and change back out of the</span><br />
<span style="color: #666666; font-style: italic;"># directory:</span><br />
<span style="color: #7a0874; font-weight: bold;">cd</span> JastAddExtensions<span style="color: #000000; font-weight: bold;">/</span>SootJastAddJ<br />
ant gen<br />
<span style="color: #7a0874; font-weight: bold;">cd</span> ..<span style="color: #000000; font-weight: bold;">/</span>..<br />
<br />
<span style="color: #666666; font-style: italic;"># Copy soot-dev/ant.settings.template to soot-dev/ant.settings:</span><br />
<span style="color: #666666; font-style: italic;"># Edit soot-dev/ant.settings so it contains the following lines:</span><br />
<span style="color: #666666; font-style: italic;"># jastaddfrontend.loc=../JastAddExtensions/SootJastAddJ</span><br />
<span style="color: #666666; font-style: italic;"># polyglot.jar=../polyglotclasses-1.3.5.jar</span><br />
<span style="color: #666666; font-style: italic;"># jasmin.jar=../jasmin-dev/lib/jasminclasses-trunk.jar</span><br />
<span style="color: #c20cb9; font-weight: bold;">cat</span> soot-dev<span style="color: #000000; font-weight: bold;">/</span>ant.settings.template <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sed</span> \<br />
<span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;s/.*\(jastaddfrontend.loc=\).*/\1..\/JastAddExtensions\/SootJastAddJ/&quot;</span> \<br />
<span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;s/.*\(polyglot.jar=\).*/\1..\/polyglotclasses-1.3.5.jar/&quot;</span> \<br />
<span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;s/.*\(jasmin.jar=\).*/\1..\/jasmin-dev\/lib\/jasminclasses-trunk.jar/&quot;</span> \<br />
<span style="color: #000000; font-weight: bold;">&gt;</span> soot-dev<span style="color: #000000; font-weight: bold;">/</span>ant.settings<br />
<br />
<span style="color: #666666; font-style: italic;"># Change into the soot-dev directory and build the</span><br />
<span style="color: #666666; font-style: italic;"># sootclasses-trunk.jar file, and change back out of the directory:</span><br />
<span style="color: #7a0874; font-weight: bold;">cd</span> soot-dev<br />
ant classesjar<br />
<span style="color: #7a0874; font-weight: bold;">cd</span> ..<br />
<br />
<span style="color: #c20cb9; font-weight: bold;">cp</span> soot-dev<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>sootclasses-trunk.jar .</div></td></tr></tbody></table></div>
]]></content:encoded>
			<wfw:commentRss>http://www.concurrentaffair.org/2010/01/30/soot-build-instructions/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>A HotSpot Java Error, a Bus Error and a Segmentation Fault</title>
		<link>http://www.concurrentaffair.org/2010/01/30/a-hotspot-java-error-a-bus-error-and-a-segmentation-fault/</link>
		<comments>http://www.concurrentaffair.org/2010/01/30/a-hotspot-java-error-a-bus-error-and-a-segmentation-fault/#comments</comments>
		<pubDate>Sat, 30 Jan 2010 20:10:40 +0000</pubDate>
		<dc:creator>Mathias</dc:creator>
				<category><![CDATA[Concurrent Unit Testing]]></category>
		<category><![CDATA[Ramblings]]></category>

		<guid isPermaLink="false">http://www.concurrentaffair.org/?p=1486</guid>
		<description><![CDATA[When I run Soot to create a call graph of DrJava, I get the aforementioned HotSpot Java error on Windows with Java 1.6.0_18. On Mac OS X 10.4 with Java 1.5.0_19, I get a &#8220;Bus error&#8221; (Java exit status 138). &#8230; <a href="http://www.concurrentaffair.org/2010/01/30/a-hotspot-java-error-a-bus-error-and-a-segmentation-fault/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>When I run Soot to create a call graph of DrJava, I get the aforementioned <a href="http://www.concurrentaffair.org/2010/01/29/java-bug-4396719-mark-sweep-stack-overflow-on-deeply-nested-object-arrays/">HotSpot Java error</a> on Windows with Java 1.6.0_18.</p>

<p>On Mac OS X 10.4 with Java 1.5.0_19, I get a &#8220;Bus error&#8221; (Java exit status 138).<br />
On Red Hat Enterprise Linux 5 with Java 1.6.0_18, I get a &#8220;Segmentation fault&#8221; (Java exit status 139).</p>

<p>Fun, fun! At least it&#8217;s consistently not working. They probably all have the same cause.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.concurrentaffair.org/2010/01/30/a-hotspot-java-error-a-bus-error-and-a-segmentation-fault/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>More Details on Soot and -allow-phantom-refs</title>
		<link>http://www.concurrentaffair.org/2010/01/29/more-details-on-soot-and-allow-phantom-refs/</link>
		<comments>http://www.concurrentaffair.org/2010/01/29/more-details-on-soot-and-allow-phantom-refs/#comments</comments>
		<pubDate>Fri, 29 Jan 2010 16:24:03 +0000</pubDate>
		<dc:creator>Mathias</dc:creator>
				<category><![CDATA[Concurrent Unit Testing]]></category>
		<category><![CDATA[DrJava]]></category>

		<guid isPermaLink="false">http://www.concurrentaffair.org/?p=1467</guid>
		<description><![CDATA[In the previous post I mentioned that I&#8217;m trying to create a call graph of all of DrJava using Soot. Since DrJava is a cross-platform application, there are classes that get compiled and used only on certain operating systems. The &#8230; <a href="http://www.concurrentaffair.org/2010/01/29/more-details-on-soot-and-allow-phantom-refs/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>In the <a href="http://www.concurrentaffair.org/2010/01/29/java-bug-4396719-mark-sweep-stack-overflow-on-deeply-nested-object-arrays/">previous post</a> I mentioned that I&#8217;m trying to create a call graph of all of DrJava using <a href="http://www.sable.mcgill.ca/soot/">Soot</a>. Since DrJava is a cross-platform application, there are classes that get compiled and used only on certain operating systems. The classes in the <tt>com.apple.eawt</tt> package, for instance, are only used on the Mac.</p>

<p>That means that Soot doesn&#8217;t normally find these classes when generating the call graph with Sun JDKs:</p>

<p><pre>resolving [from .class]: edu.rice.cs.drjava.platform.MacPlatform$1
Exception in thread "main" java.lang.RuntimeException:
couldn't find class: com.apple.eawt.ApplicationListener
(is your soot-class-path set properly?)
    at soot.SootResolver.bringToHierarchy(SootResolver.java:184)
    at soot.SootResolver.bringToSignatures(SootResolver.java:219)
    at soot.SootResolver.bringToBodies(SootResolver.java:260)
    at soot.SootResolver.processResolveWorklist(SootResolver.java:135)
    at soot.SootResolver.resolveClass(SootResolver.java:124)
    at soot.Scene.loadClass(Scene.java:390)
    at soot.Scene.loadClassAndSupport(Scene.java:375)
    at soot.Scene.loadNecessaryClasses(Scene.java:963)
    at soot.Main.run(Main.java:169)
    at soot.Main.main(Main.java:145)</pre></p>

<p>Setting the Soot <tt>-allow-phantom-refs</tt> option doesn&#8217;t really help; it gets past the initial stages, but later still has errors:</p>

<p><pre>Exception in thread "main" soot.AbstractSootMethodRef$ClassResolutionFailedException:
Class com.apple.eawt.ApplicationEvent doesn't have method setHandled([boolean]) : void;
failed to resolve in superclasses and interfacesLooking in com.apple.eawt.ApplicationEvent
which has methods []
    at soot.AbstractSootMethodRef.resolve(AbstractSootMethodRef.java:135)
    at soot.AbstractSootMethodRef.resolve(AbstractSootMethodRef.java:95)
    at soot.jimple.internal.AbstractInvokeExpr.getMethod(AbstractInvokeExpr.java:54)
    at soot.jimple.toolkits.callgraph.OnFlyCallGraphBuilder.getImplicitTargets
        (OnFlyCallGraphBuilder.java:234)
    at soot.jimple.toolkits.callgraph.OnFlyCallGraphBuilder.processNewMethod
        (OnFlyCallGraphBuilder.java:182)
    at soot.jimple.toolkits.callgraph.OnFlyCallGraphBuilder.processReachables
        (OnFlyCallGraphBuilder.java:81)
    at soot.jimple.toolkits.callgraph.CallGraphBuilder.build(CallGraphBuilder.java:84)
    at soot.jimple.toolkits.callgraph.CHATransformer.internalTransform(CHATransformer.java:43)
    at soot.SceneTransformer.transform(SceneTransformer.java:39)
    at soot.SceneTransformer.transform(SceneTransformer.java:45)
    at soot.SceneTransformer.transform(SceneTransformer.java:50)
    at dk.brics.soot.callgraphs.CallGraphExample$2.internalTransform(CallGraphExample.java:88)
    at soot.SceneTransformer.transform(SceneTransformer.java:39)
    at soot.Transform.apply(Transform.java:89)
    at soot.ScenePack.internalApply(ScenePack.java:43)
    at soot.Pack.apply(Pack.java:114)
    at soot.PackManager.runWholeProgramPacks(PackManager.java:409)
    at soot.PackManager.runPacks(PackManager.java:329)
    at soot.Main.run(Main.java:202)
    at soot.Main.main(Main.java:145)</pre></p>

<p>What I did instead was make the Apple classes available on Windows and Linux as well, just on the Soot classpath (they aren&#8217;t actually loaded by the JVM), but then I run into an <a href="http://www.concurrentaffair.org/2010/01/29/java-bug-4396719-mark-sweep-stack-overflow-on-deeply-nested-object-arrays/">8-year-old Java bug in the garbage collector</a>. Fixing Soot is more likely than fixing the JVM.</p>

<p><b>Update</b></p>

<p>After checking out Soot from the svn repository and building it from scratch, the Soot problem has gone away, but now I still run into the <a href="http://www.concurrentaffair.org/2010/01/29/java-bug-4396719-mark-sweep-stack-overflow-on-deeply-nested-object-arrays/">8-year-old Java bug in the garbage collector</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.concurrentaffair.org/2010/01/29/more-details-on-soot-and-allow-phantom-refs/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Java Bug 4396719 &#8211; Mark Sweep stack overflow on deeply nested Object arrays</title>
		<link>http://www.concurrentaffair.org/2010/01/29/java-bug-4396719-mark-sweep-stack-overflow-on-deeply-nested-object-arrays/</link>
		<comments>http://www.concurrentaffair.org/2010/01/29/java-bug-4396719-mark-sweep-stack-overflow-on-deeply-nested-object-arrays/#comments</comments>
		<pubDate>Fri, 29 Jan 2010 11:39:07 +0000</pubDate>
		<dc:creator>Mathias</dc:creator>
				<category><![CDATA[Concurrent Unit Testing]]></category>
		<category><![CDATA[DrJava]]></category>
		<category><![CDATA[Ramblings]]></category>

		<guid isPermaLink="false">http://www.concurrentaffair.org/?p=1461</guid>
		<description><![CDATA[I&#8217;m trying to create a call graph of all of DrJava using Soot. DrJava is a cross-platform application that has some classes that get compiled and used only on certain operating systems; for example, the com.apple.eawt package is only used &#8230; <a href="http://www.concurrentaffair.org/2010/01/29/java-bug-4396719-mark-sweep-stack-overflow-on-deeply-nested-object-arrays/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m trying to create a call graph of all of DrJava using <a href="http://www.sable.mcgill.ca/soot/">Soot</a>. DrJava is a cross-platform application that has some classes that get compiled and used only on certain operating systems; for example, the <tt>com.apple.eawt</tt> package is only used on the Mac. That means that Soot doesn&#8217;t normally find these classes when generating the call graph with Sun JDKs. Setting the Soot <tt>-allow-phantom-refs</tt> option doesn&#8217;t really help; it gets past the initial stages, but later still has errors. What I did instead was make the Apple classes available on Windows and Linux as well, just on the Soot classpath (they aren&#8217;t actually loaded by the JVM).</p>

<p>Now I&#8217;m getting a HotSpot Java error. Except for memory addresses, it is identical to this <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6849033">bug 6849033</a>, filed in June 2009. The bug report, however, is closed because it is a duplicate of <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4396719">bug 4396719 &#8211; Mark Sweep stack overflow on deeply nested Object arrays</a>&#8230; which isn&#8217;t in the database.</p>

<p>Why is that bug not in the database? Probably for <a href="http://developers.sun.com/resources/bugsFAQ.html#s4q3">security reasons</a>, which isn&#8217;t immediately obvious. The fact that the original bug report to which all other bugs are referring isn&#8217;t available makes it hard to figure out what&#8217;s going on. What I find really shocking, though, is that the first bug I can find that lists the ominous bug 4396719 as original bug report is from February 2002: <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4641910">bug 4641910</a>. That means this bug has been known and not fixed for eight years!</p>

<p>Some <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4944300">other duplicate bug reports</a> provide a description of the problem:</p>

<blockquote>The problem is in the Garbage collection subsystem, dealing with
the very deeply nested arrays (an array who&#8217;s element is an array who&#8217;s
element is an array&#8230;)</blockquote>

<p>This also makes it clear why there are security concerns that lead to the removal of the bug report: It is fairly simple to write Java code that is perfectly legal and that passes the Java verifier, but that will cause the JVM to crash. This can be used for a <a href="http://www.securityfocus.com/bid/18058/discuss">denial-of-service attack</a> in Java plugins.</p>

<p>The source for exploits is out there, this bug has been known for over eight years, some duplicate bug reports still describe the problem. Security through obscurity won&#8217;t work, especially not if you are this sloppy. I&#8217;m disappointed, Sun!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.concurrentaffair.org/2010/01/29/java-bug-4396719-mark-sweep-stack-overflow-on-deeply-nested-object-arrays/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Another Possible Improvement</title>
		<link>http://www.concurrentaffair.org/2010/01/12/another-possible-improvement/</link>
		<comments>http://www.concurrentaffair.org/2010/01/12/another-possible-improvement/#comments</comments>
		<pubDate>Tue, 12 Jan 2010 22:04:15 +0000</pubDate>
		<dc:creator>Mathias</dc:creator>
				<category><![CDATA[Concurrent Unit Testing]]></category>

		<guid isPermaLink="false">http://www.concurrentaffair.org/?p=1437</guid>
		<description><![CDATA[On the other hand, I think I can re-enable checking if the event thread has finished and generating EventThreadStillProcessingErrors in the &#8220;update&#8221; Runnable that sets the test thread group the event thread uses, at least in certain cases. It is &#8230; <a href="http://www.concurrentaffair.org/2010/01/12/another-possible-improvement/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>On the other hand, I think I can re-enable checking if the event thread has finished and generating <code class="codecolorer text mac-classic"><span class="text">EventThreadStillProcessingError</span></code>s in the &#8220;update&#8221; <code class="codecolorer text mac-classic"><span class="text">Runnable</span></code> that sets the test thread group the event thread uses, at least in certain cases.</p>

<p>It is possible that test A has generated the <code class="codecolorer text mac-classic"><span class="text">EventThreadStillProcessingError</span></code> by putting a long <code class="codecolorer text mac-classic"><span class="text">Runnable aRunnable</span></code> on the event queue. When test B starts executing, it puts an update <code class="codecolorer text mac-classic"><span class="text">Runnable updateB</span></code> on the event queue, but it doesn&#8217;t execute yet.</p>

<p>If <code class="codecolorer text mac-classic"><span class="text">aRunnable</span></code> finishes now and <code class="codecolorer text mac-classic"><span class="text">updateB</span></code> executes while test B is still running, we can enable checking the event thread again. The event thread has &#8220;caught up&#8221; with the tests, so to speak.</p>

<p>If, on the other hand, test B finishes before <code class="codecolorer text mac-classic"><span class="text">aRunnable</span></code> finishes, then test C will begin and enqueue an update <code class="codecolorer text mac-classic"><span class="text">Runnable updateC</span></code>. Now <code class="codecolorer text mac-classic"><span class="text">aRunnable</span></code> finishes and <code class="codecolorer text mac-classic"><span class="text">updateB</span></code> executes. Here we clearly don&#8217;t want to enable checking, because test C is already executing.</p>

<p>So, if the test&#8217;s thread group and the new thread group for the event thread are identical, we can re-enable checking the event thread, because that means the event thread has caught up sufficiently.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.concurrentaffair.org/2010/01/12/another-possible-improvement/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Another Possible Problem</title>
		<link>http://www.concurrentaffair.org/2010/01/12/another-possible-problem/</link>
		<comments>http://www.concurrentaffair.org/2010/01/12/another-possible-problem/#comments</comments>
		<pubDate>Tue, 12 Jan 2010 21:29:05 +0000</pubDate>
		<dc:creator>Mathias</dc:creator>
				<category><![CDATA[Concurrent Unit Testing]]></category>

		<guid isPermaLink="false">http://www.concurrentaffair.org/?p=1431</guid>
		<description><![CDATA[I think I have just realized that this still isn&#8217;t good enough. Now we know that there aren&#8217;t any more events, but it is conceivable that a Runnable executing just before the token Runnable has started new threads. Those threads &#8230; <a href="http://www.concurrentaffair.org/2010/01/12/another-possible-problem/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I think I have just realized that this still isn&#8217;t good enough. Now we know that there aren&#8217;t any more events, but it is conceivable that a <code class="codecolorer text mac-classic"><span class="text">Runnable</span></code> executing just before the token <code class="codecolorer text mac-classic"><span class="text">Runnable</span></code> has started new threads. Those threads could fail, or add new &#8220;token&#8221; <code class="codecolorer text mac-classic"><span class="text">Runnable</span></code>s. It seems like the whole thing needs to be put in a loop.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.concurrentaffair.org/2010/01/12/another-possible-problem/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New Release of ConcJUnit: 20100112</title>
		<link>http://www.concurrentaffair.org/2010/01/12/new-release-of-concjunit-20100112/</link>
		<comments>http://www.concurrentaffair.org/2010/01/12/new-release-of-concjunit-20100112/#comments</comments>
		<pubDate>Tue, 12 Jan 2010 21:28:42 +0000</pubDate>
		<dc:creator>Mathias</dc:creator>
				<category><![CDATA[Concurrent Unit Testing]]></category>

		<guid isPermaLink="false">http://www.concurrentaffair.org/?p=1426</guid>
		<description><![CDATA[I&#8217;ve just made a new release of ConcJUnit: 20100112. This release contains an important addition that I had been thinking about for a while. ConcJUnit already detected failures and uncaught exceptions in the event thread, but since the event thread &#8230; <a href="http://www.concurrentaffair.org/2010/01/12/new-release-of-concjunit-20100112/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve just made a new release of ConcJUnit: <a href="https://sourceforge.net/projects/concutest/files/concjunit/20100112/">20100112</a>. This release contains an important addition that I had been thinking about <a href="http://www.concurrentaffair.org/2009/09/10/possible-concjunit-enhancement/">for a while</a>.</p>

<p>ConcJUnit already detected failures and uncaught exceptions in the event thread, but since the event thread is a daemon thread started by the system, it is not part of the &#8220;join&#8221; and &#8220;lucky&#8221; checks. It is not required to join the event thread with the test&#8217;s main thread (in fact, it&#8217;s not really possible, since there is no way to terminate the event thread), and that also means that I do not check if the event thread finished processing.</p>

<p>That was a problem, of course. It was possible to put a <code class="codecolorer text mac-classic"><span class="text">Runnable</span></code> on the event queue and then end the test, resulting in a success, even though the code in the <code class="codecolorer text mac-classic"><span class="text">Runnable</span></code> may still fail.</p>

<p>I have now added code that checks if the event thread is running, and if that is the case, we check if the event queue is empty, as it should be. If it isn&#8217;t, then we issue an <code class="codecolorer text mac-classic"><span class="text">EventThreadStillProcessingError</span></code>, which is a subclass of a <code class="codecolorer text mac-classic"><span class="text">NoJoinError</span></code>.</p>

<p>However, an empty event queue does not guarantee that the event thread has finished processing. There way still be a <code class="codecolorer text mac-classic"><span class="text">Runnable</span></code> executing in the event thread; there just aren&#8217;t any more events queued up after it. So we need to make sure that there isn&#8217;t an event being processed right now; I currently do that by adding a &#8220;token&#8221; <code class="codecolorer text mac-classic"><span class="text">Runnable</span></code> to the event queue and requiring that it executes immediately<sup><a href="#footnote-1-1426" id="footnote-link-1-1426" title="See the footnote.">1</a></sup>.</p>

<p>But even if the token <code class="codecolorer text mac-classic"><span class="text">Runnable</span></code> gets to execute right away, it isn&#8217;t guaranteed that the test&#8217;s events have all been processed. We also have to ensure that <em>after</em> we checked that the event queue was empty and <em>before</em> the token <code class="codecolorer text mac-classic"><span class="text">Runnable</span></code> began executing, no additional <code class="codecolorer text mac-classic"><span class="text">Runnable</span></code> objects were added to the event queue. Those additional events would have been added after the token <code class="codecolorer text mac-classic"><span class="text">Runnable</span></code>, so inside the token <code class="codecolorer text mac-classic"><span class="text">Runnable</span></code> we check again if the event queue is empty.</p>

<p>If the token <code class="codecolorer text mac-classic"><span class="text">Runnable</span></code> executed immediately and the event queue is still empty when it executes, then we know that there aren&#8217;t anymore events that need to be processed and that could fail, and the test has completed in its entirety. We already checked that there aren&#8217;t any more regular threads around that could add new events, and the event thread has finished processing all <code class="codecolorer text mac-classic"><span class="text">Runnable</span></code>s.</p>

<p>When a <code class="codecolorer text mac-classic"><span class="text">EventThreadStillProcessingError</span></code> is generated, then the event thread is still executing code belonging to a test that has just ended. I didn&#8217;t want to let the test wait for the event thread to finish, I want to allow it to move on. This is sort of a greedy process: Let&#8217;s run as many tests as we can. Waiting for the event thread, if not specified by the test code, could mean waiting forever if the event thread is deadlocked. However, if it isn&#8217;t  deadlocked, and code there is still making progress, then it may also still fail after a new test has already started to execute. The event thread is shared among all tests, so I had to make sure that a failure in the event thread caused by a <code class="codecolorer text mac-classic"><span class="text">Runnable</span></code> belonging to the previous test doesn&#8217;t fail the test currently executing.</p>

<p>I do this by maintaining a field containing the test thread group belonging to the current <code class="codecolorer text mac-classic"><span class="text">Runnable</span></code> in the event thread. If the event thread is <em>not</em> running yet, then that field is updated directly at the beginning of each test. If the event thread <em>is</em> running, then we want all <code class="codecolorer text mac-classic"><span class="text">Runnable</span></code>s already in the event queue to still notify the test group of the previous test. All future <code class="codecolorer text mac-classic"><span class="text">Runnable</span></code>s, however, should use the current test&#8217;s thread group, so we update the field in an &#8220;update&#8221; <code class="codecolorer text mac-classic"><span class="text">Runnable</span></code> which will execute when all <code class="codecolorer text mac-classic"><span class="text">Runnable</span></code>s belonging to the previous test have been processed.</p>

<p>Of course, if the event thread is deadlocked, then the update <code class="codecolorer text mac-classic"><span class="text">Runnable</span></code> will never execute. This isn&#8217;t any worse, though, than JUnit already behaves. ConcJUnit will still allow tests that do not need the event thread to execute. When a test is executed that requires the event thread, for example by executing a <code class="codecolorer text mac-classic"><span class="text">invokeAndWait</span></code>, then that test will hang. But at least there will have been a <code class="codecolorer text mac-classic"><span class="text">EventThreadStillProcessingError</span></code> pointing out which test is responsible for it.</p>

<p>Another small problem is that once an <code class="codecolorer text mac-classic"><span class="text">EventThreadStillProcessingError</span></code> has been generated, I do not want all following tests to also fail with that error. The event thread may still contain <code class="codecolorer text mac-classic"><span class="text">Runnable</span></code>s from the first test that was flawed that way, for example if the event thread is deadlocked. Therefore, once an <code class="codecolorer text mac-classic"><span class="text">EventThreadStillProcessingError</span></code> has occurred, checking whether the event thread has finished is disabled. That means that only one <code class="codecolorer text mac-classic"><span class="text">EventThreadStillProcessingError</span></code> will ever be generated. Later tests that also have this problem may go undetected until the first test has been fixed.</p>
<br />Footnotes:<br /><ol class="footnotes"><li id="footnote-1-1426"> Immediately practically means &#8220;very quickly&#8221;; currently within 100 ms. That&#8217;s not exactly the same, but hopefully close enough.   [<a href="#footnote-link-1-1426">back</a>]</li></ol>]]></content:encoded>
			<wfw:commentRss>http://www.concurrentaffair.org/2010/01/12/new-release-of-concjunit-20100112/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Submitted Publication Version of SIGCSE 2010 Paper</title>
		<link>http://www.concurrentaffair.org/2009/12/04/submitted-publication-version-of-sigcse-2010-paper/</link>
		<comments>http://www.concurrentaffair.org/2009/12/04/submitted-publication-version-of-sigcse-2010-paper/#comments</comments>
		<pubDate>Fri, 04 Dec 2009 22:10:51 +0000</pubDate>
		<dc:creator>Mathias</dc:creator>
				<category><![CDATA[Concurrent Unit Testing]]></category>

		<guid isPermaLink="false">http://www.concurrentaffair.org/?p=1403</guid>
		<description><![CDATA[I just submitted the publication version of our SIGCSE 2010 paper, Test-First Java Concurrency for the Classroom. Now I&#8217;m waiting for the copyright form to be sent, and I&#8217;m wondering why that&#8217;s not done automatically&#8230;]]></description>
			<content:encoded><![CDATA[<p>I just submitted the publication version of our <a href="http://sigcse.org/sigcse2010/">SIGCSE 2010</a> paper, <a href="http://www.concurrentaffair.org/2009/10/24/paper-test-first-java-concurrency-for-the-classroom/">Test-First Java Concurrency for the Classroom</a>.</p>

<p>Now I&#8217;m waiting for the copyright form to be sent, and I&#8217;m wondering why that&#8217;s not done automatically&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.concurrentaffair.org/2009/12/04/submitted-publication-version-of-sigcse-2010-paper/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

