- status: open --> open-fixed
FIXED
From
http://www.eros-os.org/pipermail/e-lang/2004-August/009977.html
In
src/jsrc/org/erights/e/elang/interp/UnsafeLoader.java#90:4::106:5
:
/**
*
*/
private Slot getLocalSlot(String fqName) {
Slot result;
synchronized (myLocals) {
result = (Slot)myLocals.fetch(fqName,
ValueThunk.NULL_THUNK);
}
if (null != result) {
return result;
}
result = new FinalSlot(getWrapped(fqName));
synchronized (myLocals) {
myLocals.put(fqName, result, true);
}
return result;
}
If this code is executed from multiple threads with the
same fqName, it
is possible that both instances will decide that
myLocals needs the
entry added, in which case the one which finishes later
will fail
(affecting the code that called it) due to myLocals.put
being strict.
---
Solutions I see:
1.
if (!myLocals.maps(fqName)) {
myLocals.put(fqName, result, true);
}
2.
myLocals.put(fqName, result, false);
3. Use only one synchronized block that includes all of
the code
between the existing ones.
---
An example failure, caused by multiple vats being
simultaneously
started and seeded with the same code:
java.net.Socket already in map
- Loader#get(String)
. <unsafe:*>.get("java.net.Socket")
@ get/1:
<file:/Stuff/jlib/keio/networkAuthor.emaker#:span::48:36::48:59>
- keio.networkAuthor$networkAuthor__C#run/2:
<file:/Stuff/jlib/keio/networkAuthor.emaker#:span::41:5::41:7>
. <networkAuthor>(<a Scope>, [<dummy sealer>, <dummy
unsealer>])
@ run/2:
<file:/Stuff/jlib/keio/networkAuthor.emaker#:span::38:24::38:24>
- keio.networkAuthor$networkAuthor__C#run/1:
<file:/Stuff/jlib/keio/networkAuthor.emaker#:span::37:5::37:7>
. <networkAuthor>(<a Scope>)
@ run/1:
<file:/Stuff/jlib/makeRunebotContext.emaker#:span::25:44::25:44>
- makeRunebotContext$makeContext__C#run/5:
<file:/Stuff/jlib/makeRunebotContext.emaker#:span::21:15::21:15>
. <makeContext>(<a Scope>, <Far ref>, "#erights", <Vat
evaluator for #erig...aluator for #erights>>, <Far ref>)
@ run/5
- __main$seedBootstrap__C#run/3
. <seedBootstrap>(<Far ref>, "#erights", <Far ref>)
java.lang.IllegalArgumentException: java.net.Socket
already in map
at
org.erights.e.elib.tables.FlexMapImpl.put(FlexMapImpl.java:342)
at
org.erights.e.elang.interp.UnsafeLoader.getLocalSlot(UnsafeLoader.java:
103)
at
org.erights.e.elang.interp.UnsafeLoader.get(UnsafeLoader.java:110)
at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown
Source)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessor
Impl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at
org.erights.e.elib.prim.InstanceMethodNode.innerExecute(InstanceMethodNo
de.java:113)
at
org.erights.e.elib.prim.JavaMemberNode.execute(JavaMemberNode.java:183)
at
org.erights.e.elib.prim.Selector.callIt(Selector.java:99)
at
org.erights.e.elang.evm.CallExpr.subEval(CallExpr.java:132)
at
org.erights.e.elang.evm.DefineExpr.subEval(DefineExpr.java:125)
at org.erights.e.elang.evm.SeqExpr.subEval(SeqExpr.java:97)
at
org.erights.e.elang.evm.EscapeExpr.subEval(EscapeExpr.java:154)
at
org.erights.e.elang.evm.EMethod.execute(EMethod.java:169)
at
org.erights.e.elang.evm.EMethodNode.execute(EMethodNode.java:136)
at
org.erights.e.elib.prim.Selector.callIt(Selector.java:99)
at
org.erights.e.elang.evm.CallExpr.subEval(CallExpr.java:132)
at
org.erights.e.elang.evm.CallExpr.subEval(CallExpr.java:127)
at org.erights.e.elang.evm.SeqExpr.subEval(SeqExpr.java:97)
at
org.erights.e.elang.evm.EscapeExpr.subEval(EscapeExpr.java:154)
at
org.erights.e.elang.evm.EMethod.execute(EMethod.java:169)
at
org.erights.e.elang.evm.EMethodNode.execute(EMethodNode.java:136)
at
org.erights.e.elib.prim.Selector.callIt(Selector.java:99)
at
org.erights.e.elang.evm.CallExpr.subEval(CallExpr.java:132)
at
org.erights.e.elang.evm.DefineExpr.subEval(DefineExpr.java:125)
at org.erights.e.elang.evm.SeqExpr.subEval(SeqExpr.java:97)
at
org.erights.e.elang.evm.EscapeExpr.subEval(EscapeExpr.java:154)
at
org.erights.e.elang.evm.EMethod.execute(EMethod.java:169)
at
org.erights.e.elang.evm.EMethodNode.execute(EMethodNode.java:136)
at
org.erights.e.elib.prim.Selector.callIt(Selector.java:99)
at
org.erights.e.elang.evm.CallExpr.subEval(CallExpr.java:132)
at org.erights.e.elang.evm.SeqExpr.subEval(SeqExpr.java:99)
at
org.erights.e.elang.evm.EMethod.execute(EMethod.java:174)
at
org.erights.e.elang.evm.EMethodNode.execute(EMethodNode.java:136)
at org.erights.e.elib.prim.E.callAll(E.java:152)
at
org.erights.e.elib.vat.PendingDelivery.innerRun(PendingDelivery.java:
102)
at
org.erights.e.elib.vat.PendingEvent.run(PendingEvent.java:76)
at
org.erights.e.elib.vat.HeadlessRunner.run(HeadlessRunner.java:176)
at java.lang.Thread.run(Thread.java:552)
Followups
Comment Date By
I used solution #2 2004-Dec-20 03:31 markm