On 20/02/15 14:25, Vitaly Davidovich wrote:
Chris,
I think it's fine if there are intra graph object references during
deserialization - nothing unexpected should happen since intra thread
semantics will be preserved. The freeze action is only a concern once
deserialization completes and user code may publish an object from the
graph unsafely to another thread; that's the only place where the fence
is needed, I think.
Agreed.
I'm happy the way this has turned out. The changes are minimal are
resolve an issue that has been outstanding for some time now.
Thanks,
-Chris.
sent from my phone
On Feb 20, 2015 6:28 AM, "Chris Hegarty" <chris.hega...@oracle.com
<mailto:chris.hega...@oracle.com>> wrote:
On 20/02/15 00:27, David Holmes wrote:
On 20/02/2015 10:13 AM, Vitaly Davidovich wrote:
In addition to Peter's comment, full fence seems
unnecessarily strong and
will cause performance issues (especially if the fence is
per object
in the
graph). A storeFence should be sufficient here, no?
It should be a fence per graph, or perhaps branches thereof, not per
object.
My original intent was to replicate the final-freeze action as
performed by constructors. What I am hearing is that we do better,
without any visible side-effect. Since the graph is not published
until readObject/Unshared returns, the fence can be added there.
That said, it may be possible for one leaf in the graph to reference
another, but to observe this ( in readObject ), there would have an
implicit dependency on re-constructor order, which is fragile, at best.
But yes a storeFence (horrible terminology :( ) would suffice
given that
the freeze action in constructors is only
OrderAccess::storestore(). And
Unsafe.storeFence() is OrderAccess::release() which is a
storestore|storeload barrier.
Thanks, updated.
Updated Webrev:
http://cr.openjdk.java.net/~__chegar/deserialFence/webrev.__01/webrev/
<http://cr.openjdk.java.net/~chegar/deserialFence/webrev.01/webrev/>
Note, the changes in this webrev are overly defensive in the face of
recursive calls to readObject/Unshared. This should be ok, but
probably not strictly necessary.
-Chris.
David
sent from my phone
On Feb 19, 2015 11:32 AM, "Chris Hegarty"
<chris.hega...@oracle.com <mailto:chris.hega...@oracle.com>>
wrote:
Additional note ( forgotten from original mail):
The fence is needed for "final-freeze" is a one-off
barrier at the
end of
deserialization, similar that of constructors . Under normal
circumstances
the object being deserialized is not visible until
deserialization
completes, so you don't need a "freeze" until
deserialization completes.
-Chris.
On 19 Feb 2015, at 16:25, Chris Hegarty
<chris.hega...@oracle.com <mailto:chris.hega...@oracle.com>>
wrote:
A number of years ago there was a proposal to use
Unsafe.put*Volatile
methods to set final fields during default
deserialisation [1][2],
but it
never made it due to concerns about the potential
negative impact of the
additional fences. Now we have a, private, fences API in
the platform, I
think it is time to revisit this.
Webrev:
http://cr.openjdk.java.net/~__chegar/deserialFence/webrev.__00/webrev/
<http://cr.openjdk.java.net/~chegar/deserialFence/webrev.00/webrev/>
Note:
- Section 17.5.3 in the JLS [3], “Freezes of a
final field occur both
at the end of the constructor in which the
final field is set, and
immediately after each modification of a final
field via reflection
or other special mechanism.” I believe this is
a consequence of
the way in which setting of final fields is
supported in the public
API, Field.setAccessible(), ( as defined by JSR
133 ) and should
not restrict an implementation from using a
more performant
means, as is suggested here. The statement in
the JLS should
be revisited.
- Default Serialization already has a dependency on
Unsafe, and
I don’t see this additional dependency as making
that any worse.
- Open question, should we include volatile fields
as well as final?
- The changes in the webrev will issue a fence even
if custom
deserialization is performed. I think this is
ok, as it will be more
consuming to try to determine if a custom
readObject set a final
through reflection, or not.
-Chris.
[1]
https://bugs.openjdk.java.net/__browse/JDK-6647361
<https://bugs.openjdk.java.net/browse/JDK-6647361>
[2]
http://mail.openjdk.java.net/__pipermail/core-libs-dev/2010-__November/005292.html
<http://mail.openjdk.java.net/pipermail/core-libs-dev/2010-November/005292.html>
http://mail.openjdk.java.net/__pipermail/core-libs-dev/2010-__December/005456.html
<http://mail.openjdk.java.net/pipermail/core-libs-dev/2010-December/005456.html>
[3]
http://docs.oracle.com/javase/__specs/jls/se8/html/jls-17.__html#jls-17.5.3
<http://docs.oracle.com/javase/specs/jls/se8/html/jls-17.html#jls-17.5.3>