On Apr 21, 2004, at 8:30 PM, Jerry Schwarz wrote:
>  At 12:02 PM 4/21/2004, Bill Pugh wrote:
>
> OK, here is a class that implements keepAlive:
>
>  public class FinalizerHelp {
>    static volatile Object v;
>    public static void keepAlive(Object o) {
>      v = o;
>      v = null;
>      }
>    public static void getReadyToFinalize() {
>      Object o = v;
>      }
>  }
>
>
>  Take Hans'es example and add a call to keepAlive.
>  for (i = 0; i < 10; ++i) {
>    sum += x.a[i];
>  }
>  FinalizerHelp.keepAlive(a)
>  ===
>
>  I don't think this has the desired effect. The compiler first moves 
> the reference to x outside the loop and inlines keepAlive to
>
>      v = o;
>      v = null;
>
>  Then it eliminates v=o.
Nope. This isn't allowed.
The semantics we introduced to make finalizer guardians work ensures 
that
if a reachable variable contains a reference to an object, that object 
is also reachable,
even if that field is never read.
Now it occurs to me that perhaps this is too strong a requirement, and 
it will prevent some useful optimizations.
I don't see a problem with keeping compilers from eliminating stores to 
volatile fields, but eliminating overwritten
stores to non-volatile fields is something we might want to allow.
Bill
-------------------------------
JavaMemoryModel mailing list - http://www.cs.umd.edu/~pugh/java/memoryModel
This archive was generated by hypermail 2b29 : Thu Oct 13 2005 - 07:01:05 EDT