[Fwd: Re: JavaMemoryModel: Interaction between the memory model and exc eptions, Tread.stop()]

From: Vijay Saraswat (vijay@saraswat.org)
Date: Sun Apr 11 2004 - 18:59:04 EDT


Reposting, havent seen this on the list yet, though I have seen
subsequent responses to it...

-------- Original Message --------
Subject: Re: JavaMemoryModel: Interaction between the memory model and
exc eptions, Tread.stop()
Date: Sun, 11 Apr 2004 07:37:37 -0400
From: Vijay Saraswat <vijay@saraswat.org>
To: Bill Pugh <pugh@cs.umd.edu>
CC: javamemorymodel-cs.umd.edu <javamemorymodel@cs.umd.edu>
References: <0C3EFB691636964BBF914AE56AE83A89502093@hplex4.hpl.hp.com>
<40769302.1030000@saraswat.org>
<B75F77CE-8A60-11D8-8B4C-000A95DA1AE8@cs.umd.edu>

Bill Pugh wrote:

>
> On Apr 9, 2004, at 8:11 AM, Vijay Saraswat wrote:
>
>> Boehm, Hans wrote:
>>
>>> As far as I can tell, requiring the precise exception model for
>>> Thread.stop()
>>>
>>
>> I am not worried about Thread.stop(). Lets ignore it -- its
>> deprecated after all.
>>
>> Let me make the high-level argument of my previous message concrete.
>> I hope this helps to better communicate my worry.
>>
>> Consider Test Case 6Ex, a variant of test case 6.
>> ----------------------------------------------------
>> Causality test case 6Ex
>>
>> Initially, x = y = 0, z = null
>>
>> Thread 1
>> r1 = x
>> if r1 == 1
>> y = 1
>>
>> Thread 2
>> r2 = y
>> if (r2 == 1)
>> x=1
>> z = comp()
>> r4 = z.a
>> if (r2 == 0)
>> x=1
>>
>> Behavior in question: r1 == r2 == 1
>>
>> ----------------------------------------------
>>
>> Here, comp() is some terminating computation and the compiler cant
>> establish after the assignment to z that z is not null.
>>
>> Should the behavior be allowed?
>
>
> OK, so this is really just the same as
> Initially, x = y = 0, z = null
>
> Thread 1
> r1 = x
> if r1 == 1
> y = 1
>
> Thread 2
> r2 = y
> if (r2 == 1)
> x=1
> z = comp()
> if (z == null) throw new NullPointerException();
> else {
> r4 = z.a
> if (r2 == 0)
> x=1
> }
>
> Behavior in question: r1 == r2 == 1
>
> OK, I'm going to assume that comp does not interact with other threads.
> In that case, since Java is deterministic although than for thread
> scheduling, then comp either returns null or
> it doesn't. If comp does not return null, then r1 = r2 = 1 is legal.
> This is just normal reasoning
> about control flow, nothing more.

Hmm... Why make that assumption --- cant make assumptions simply because
they simplify one's life! On the contrary!

Java is of course not deterministic. (a) It has math.random, (b) it has
native method calls (c) it has input (!!), (d) it has assignment and
thread scheduling....The semantics cannot depend on "since Java is
deterministic".

The worrisome issue here is that as soon as you have the possibility of
throwing errors, then because of precise exceptions, the implementation
has to wait (at runtime) to determine whether the exception is actually
thrown or not. (Is there any other way of ensuring precise exception
semantics? I cant see mechanisms for rolling back other threads who
might have been contiminated by seeing values that should not have been
generated because the exception got thrown...)

So effectively there is a barrier here of some sort. Does it translate
to some implicit "happens before" edges....? (I think Sarita is asking
the same thing..)

Consider the "compile-time" reasoning that was used in Test 6 to
establish this case: "Intrathread analysis could determine that thread
2 always writes 1 to A and hoist the write to the beginning of thread 2."

Well, this reasoning is invalid for Test 6Ex.

So back to my question. This is a test case. How do we determine what
this test case should do, independent of what a candidate model says
this should do (or doesnt)?

Need to think this through....

-------------------------------
JavaMemoryModel mailing list - http://www.cs.umd.edu/~pugh/java/memoryModel



This archive was generated by hypermail 2b29 : Thu Oct 13 2005 - 07:01:03 EDT