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