Same pattern here: minimize the weirding (by having createMarshallers look like

a non-weird function that just returns a useful value), and comment the
weirding (in this case, only in CustomClassStreamer.{read|write}Object, since
that's the only place where a race condition may occur.

git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@6634 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
Michael Bayne
2011-04-26 23:24:44 +00:00
parent 10df7639b2
commit cdff0031fe
+12 -7
View File
@@ -325,7 +325,7 @@ public abstract class Streamer
{ {
_target = target; _target = target;
initConstructor(); initConstructor();
initMarshallers(); _marshallers = createMarshallers();
} }
@Override @Override
@@ -445,9 +445,9 @@ public abstract class Streamer
} }
/** /**
* Initialize the reading and writing marshallers. * Creates and returns the reading and writing marshallers.
*/ */
protected void initMarshallers () protected FieldMarshaller[] createMarshallers ()
{ {
// reflect on all the object's fields // reflect on all the object's fields
List<Field> fields = Lists.newArrayList(); List<Field> fields = Lists.newArrayList();
@@ -483,7 +483,7 @@ public abstract class Streamer
_fields[ii].getName() + "."); _fields[ii].getName() + ".");
} }
} }
_marshallers = marshallers; return marshallers;
} }
@Override @Override
@@ -551,7 +551,9 @@ public abstract class Streamer
// otherwise, ensure the marshallers are initialized and call super // otherwise, ensure the marshallers are initialized and call super
if (_marshallers == null) { if (_marshallers == null) {
super.initMarshallers(); // this can race with other threads, but the worst that can happen is that the work
// done in createMarshallers() is duplicated
_marshallers = super.createMarshallers();
} }
super.writeObject(object, out, useWriter); super.writeObject(object, out, useWriter);
} }
@@ -589,18 +591,21 @@ public abstract class Streamer
// otherwise, ensure the marshallers are iniitalized and call super // otherwise, ensure the marshallers are iniitalized and call super
if (_marshallers == null) { if (_marshallers == null) {
super.initMarshallers(); // this can race with other threads, but the worst that can happen is that the work
// done in createMarshallers() is duplicated
_marshallers = super.createMarshallers();
} }
super.readObject(object, in, useReader); super.readObject(object, in, useReader);
} }
@Override @Override
protected void initMarshallers () protected FieldMarshaller[] createMarshallers ()
{ {
// we will lazy-initialize the marshallers only if needed, so we don't call super // we will lazy-initialize the marshallers only if needed, so we don't call super
// (It's possible there is only a writer method, but the object is never read from // (It's possible there is only a writer method, but the object is never read from
// clients, so don't get cute and set up the marshallers at construct time if one of // clients, so don't get cute and set up the marshallers at construct time if one of
// the methods is null). // the methods is null).
return null;
} }
@Override @Override