RFR [9]: default Serialization should issue a fence after reconstructing an Object with final fields

Chris Hegarty chris.hegarty at oracle.com
Mon Feb 23 15:40:22 UTC 2015


On 23/02/15 15:30, Vitaly Davidovich wrote:
> Ok Chris, sounds good.
>
>     It could be, but I omitted it as it requires a pesky explicit
>     assignment of false in the case where there are not final fields!
>
>
> You could use a local (non-final) boolean to track this state (assigned
> with false), and then set the field with it after the looping is over.
> Anyway, your call.

That is better. Done.

Thanks,
-Chris.

> On Mon, Feb 23, 2015 at 10:32 AM, Chris Hegarty
> <chris.hegarty at oracle.com <mailto:chris.hegarty at oracle.com>> wrote:
>
>     On 23/02/15 14:08, Vitaly Davidovich wrote:
>
>         Likewise, seems fine.
>
>
>     Thanks Vitaly.
>
>           By the way, is there a reason not to call
>         freeze() right before returning obj? Is there something special
>         about
>         the place it's invoked at now?
>
>
>     Probably not. The freeze should probably happen before the
>     ObjectInputValidation callback, as this justs opens another
>     opportunity for early publication of the object, but probably after
>     the handle update and check.
>
>         Also, hasFinal field can be final, unless I missed some context
>         in the
>         webrev.
>
>
>     It could be, but I omitted it as it requires a pesky explicit
>     assignment of false in the case where there are not final fields!
>
>     For completeness, updated webrev in-place, which I intend to push,
>     unless there are further comments:
>     http://cr.openjdk.java.net/~__chegar/deserialFence/webrev.__02/webrev/
>     <http://cr.openjdk.java.net/~chegar/deserialFence/webrev.02/webrev/>
>
>     -Chris.
>
>         sent from my phone
>
>         On Feb 23, 2015 7:30 AM, "David Holmes" <david.holmes at oracle.com
>         <mailto:david.holmes at oracle.com>
>         <mailto:david.holmes at oracle.__com
>         <mailto:david.holmes at oracle.com>>> wrote:
>
>              Hi Chris,
>
>              On 23/02/2015 9:01 PM, Chris Hegarty wrote:
>
>                  Peter, David, Vitaly,
>
>                  Can you please take a look at the latest version of
>         this change:
>
>         http://cr.openjdk.java.net/~____chegar/deserialFence/webrev.____02/webrev/
>         <http://cr.openjdk.java.net/~__chegar/deserialFence/webrev.__02/webrev/>
>
>
>         <http://cr.openjdk.java.net/~__chegar/deserialFence/webrev.__02/webrev/
>         <http://cr.openjdk.java.net/~chegar/deserialFence/webrev.02/webrev/>>
>
>
>              It seems reasonable but I don't have a clear picture of the
>              connection between readObject and readSerialData.
>
>              David
>
>                  On 20/02/15 15:09, Peter Levart wrote:
>
>                      ...
>                      This looks good now. But I wonder if issuing fences
>         after
>                      nested calls
>                      to readObject() makes much sense. If cycles are
>         present in a
>                      subgraph
>                      deserialized by nested call to readObject(), a field
>                      pointing back to an
>                      object not part of the subgraph stream will point
>         to the
>                      object that
>                      will not be fully initialized yet, so nested calls to
>                      readObject()
>                      should not be expected to return a reference to a fully
>                      constructed
>                      subgraph anyway. Only top-level call is guaranteed
>         to return
>                      a fully
>                      constructed graph.
>
>
>                  Right. I was never convinced of this myself either.
>         Removed.
>                  Unnecessary
>                  complication.
>
>                      If you optimize this and only issue one fence for
>         top-level
>                      call to
>                      readObject(), tracking of 'requiresFence' (I would
>         call it
>                      requiresFreeze to be in line with JMM terminology - the
>                      fence is just a
>
>
>                  'requiresFreeze' is better. Updated
>
>                      way to achieve freeze) can also be micro-optimized. You
>                      currently do it
>                      like this:
>
>                      1900             requiresFence |=
>         slotDesc.hasFinalField();
>
>                      which is a shortcut for:
>
>                      requiresFence = requiresFence |
>         slotDesc.hasFinalField();
>
>                      ...which means that the field is overwritten
>         multiple times
>                      unnecessarily and slotDesc.hasFinalField() is
>         called every
>                      time. You can
>                      write the same logic as:
>
>                      if (!requiresFence && slotDesc.hasFinalField()) {
>                            requiresFence = true;
>                      }
>
>
>                  ... and it is more readable. Updated.
>
>                      There will be at most one write to the field and
>         potentially
>                      less calls
>                      to slotDesc.hasFinalField().
>
>
>                  -Chris.
>
>



More information about the core-libs-dev mailing list