X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.db.impl%2Fsrc%2Forg%2Fsimantics%2Fdb%2Fimpl%2Fgraph%2FAsyncBarrierImpl.java;fp=bundles%2Forg.simantics.db.impl%2Fsrc%2Forg%2Fsimantics%2Fdb%2Fimpl%2Fgraph%2FAsyncBarrierImpl.java;h=232e5cbd7e358b4cfb7171c5e4c1e62f71fa3ab9;hp=229c3d6a9e965b5b14167896334c2e83b1b2508a;hb=782843a248c4f70d28e8146098f9a77977cc6b3c;hpb=a1696e5257fae039410c924155fdeffc1ce1b3e9 diff --git a/bundles/org.simantics.db.impl/src/org/simantics/db/impl/graph/AsyncBarrierImpl.java b/bundles/org.simantics.db.impl/src/org/simantics/db/impl/graph/AsyncBarrierImpl.java index 229c3d6a9..232e5cbd7 100644 --- a/bundles/org.simantics.db.impl/src/org/simantics/db/impl/graph/AsyncBarrierImpl.java +++ b/bundles/org.simantics.db.impl/src/org/simantics/db/impl/graph/AsyncBarrierImpl.java @@ -12,13 +12,14 @@ package org.simantics.db.impl.graph; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.HashMap; +import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; import org.simantics.db.common.utils.Logger; import org.simantics.db.exception.RuntimeDatabaseException; +import org.simantics.db.impl.query.CacheEntry; import org.simantics.db.impl.query.QueryProcessor.AsyncBarrier; final public class AsyncBarrierImpl extends AtomicInteger implements AsyncBarrier { @@ -26,22 +27,26 @@ final public class AsyncBarrierImpl extends AtomicInteger implements AsyncBarrie private static final long serialVersionUID = 4724463372850048672L; static final HashMap> reverseLookup = new HashMap>(); - static final HashMap debuggerMap = new HashMap(); + public static final HashMap debuggerMap = new HashMap(); + static final HashMap entryMap = new HashMap(); static final HashMap restartMap = new HashMap(); static final int WAIT_TIME = 600; - public static final boolean BOOKKEEPING = false; + public static final boolean BOOKKEEPING = true; public static final boolean PRINT = false; - static final boolean RESTART_GUARD = false; + static final boolean RESTART_GUARD = true; - final private AsyncBarrierImpl caller; + final public AsyncBarrierImpl caller; //private final Semaphore sema = new Semaphore(0); - public AsyncBarrierImpl(AsyncBarrierImpl caller) { + public AsyncBarrierImpl(AsyncBarrierImpl caller, CacheEntry entry) { super(0); if (BOOKKEEPING) { + synchronized (entryMap) { + entryMap.put(this, entry); + } synchronized (debuggerMap) { debuggerMap.put(this, new Debugger()); } @@ -59,82 +64,58 @@ final public class AsyncBarrierImpl extends AtomicInteger implements AsyncBarrie } public class Debugger { - public HashMap> infos = new HashMap>(); + + public Map infos = new HashMap<>(); - public synchronized void inc(Object id, String info) { + public synchronized void inc(AsyncBarrierImpl id, String info) { if (id == null) return; - ArrayList exist = infos.get(id); - if (exist == null) { - exist = new ArrayList(); - infos.put(id, exist); - } else { - // System.err.println("Appending " + id + " += " + info); - } - exist.add(info); - // String exist = infos.put(id, info); - // if(exist != null) System.err.println("replacing " + exist + - // " => " + info + " for " + id); + String exist = infos.get(id); + if (exist != null) + throw new IllegalStateException("Already existing info " + id + " " + info); + infos.put(id, exist); } - public synchronized void dec(Object id) { + public synchronized void dec(AsyncBarrierImpl id) { if (id == null) return; - ArrayList exist = infos.get(id); + String exist = infos.get(id); if (exist == null) { System.err.println("No data for " + id); } else { - exist.remove(0); - if (exist.isEmpty()) - infos.remove(id); + infos.remove(id); } } @Override public synchronized String toString() { StringBuilder b = new StringBuilder(); - for (ArrayList ss : infos.values()) { - for (String s : ss) - b.append("info " + s + "\r\n"); + for (String s : infos.values()) { + b.append("info " + s + "\r\n"); } return b.toString(); } - - public synchronized void toErr(int indent) { - char[] spaces = new char[indent]; - Arrays.fill(spaces, ' '); - for (ArrayList ss : infos.values()) { - for (String s : ss) { - if (!s.startsWith("#")) - continue; - StringBuilder b = new StringBuilder(); - b.append(spaces); - b.append(s); - System.err.println(b.toString()); - } - } + + public boolean isEmpty() { + return infos.isEmpty(); } - } - - public void inc() { - - if (BOOKKEEPING) - inc(new Object(), new Exception().getStackTrace()[1].toString()); - else - inc(null, null); } - public void inc(String debug) { + public void inc() { if (BOOKKEEPING) - inc(new Object(), new Exception().getStackTrace()[1].toString()); + inc(this, new Exception().getStackTrace()[2].toString()); else inc(null, null); + + if (RESTART_GUARD) + if(restartMap.containsKey(this)) + throw new IllegalStateException("Unplanned restart"); } - public void inc(Object id, String info) { + private void inc(Object id, String info) { // if (PRINT) { // if (get() < 5) @@ -142,27 +123,11 @@ final public class AsyncBarrierImpl extends AtomicInteger implements AsyncBarrie // } if (BOOKKEEPING) { - Debugger debugger = debuggerMap.get(this); - if (debugger != null) - debugger.inc(id, info); - // StackTraceElement[] tr = new Exception().getStackTrace(); - // if(tr.length == 4) - // debugger.inc(new String[] { debug, tr[2].toString(), - // tr[3].toString() }); - // else if(tr.length == 5) - // debugger.inc(new String[] { debug, tr[2].toString(), - // tr[3].toString(), tr[4].toString() }); - // else if(tr.length == 6) - // debugger.inc(new String[] { debug, tr[2].toString(), - // tr[3].toString(), tr[4].toString(), tr[5].toString() }); - // else - // debugger.inc(new String[] { debug, tr[2].toString(), - // tr[3].toString(), tr[4].toString(), tr[5].toString(), - // tr[6].toString() }); +// Debugger debugger = debuggerMap.get(this); +// if (debugger != null) +// debugger.inc(id, info); } - // new Exception().printStackTrace(); - if(PRINT) { System.err.println("inc barrier[" + get() + "] " + this); @@ -215,68 +180,50 @@ final public class AsyncBarrierImpl extends AtomicInteger implements AsyncBarrie } if (BOOKKEEPING) { - Debugger debugger = debuggerMap.get(this); - if (debugger != null) - debugger.dec(id); - // StackTraceElement[] tr = new Exception().getStackTrace(); - // if(tr.length == 3) - // debugger.dec(new String[] { debug, tr[2].toString() }); - // else if(tr.length == 4) - // debugger.dec(new String[] { debug, tr[2].toString(), - // tr[3].toString() }); - // else - // debugger.dec(new String[] { debug, tr[2].toString(), - // tr[3].toString(), tr[4].toString() }); +// Debugger debugger = debuggerMap.get(this); +// if (debugger != null) { +// debugger.dec(id); +// if(debugger.isEmpty()) +// debuggerMap.remove(this); +// } } - // System.err.println("barrier " + this); - // StackTraceElement[] elems = new Exception().getStackTrace(); - // for(int i=0;i<3;i++) System.err.println(elems[i]); - // new Exception().printStackTrace(); - int count = decrementAndGet(); if (count < 1) { if (count == 0) { + debuggerMap.remove(this); if (caller != null) caller.dec(this); if (RESTART_GUARD) restartMap.put(this, true); - // sema.release(); - // if(DEBUGGER) { - // debuggerMap.remove(this); - // } - // if(REVERSE_LOOKUP) { - // reverseLookup.remove(this); - // } } if (count < 0) { Logger.defaultLogError( "Database request processing error. The application code has performed illegal actions (probably called multiple times the execute or exception method of a single result request.", new Exception()); - // String message = ; - // System.out.println(message); - // if (DEBUGGER) { - // JOptionPane.showMessageDialog(null, message); - // System.out.println(debugger); - // } - // sema.release(); System.exit(-1); } assert (count >= 0); } } - private static void printReverse(AsyncBarrierImpl barrier, int indent) { + public static String report(AsyncBarrierImpl barrier) { + CacheEntry e = entryMap.get(barrier); + if(e != null) return e.toString(); + else return "Barrier@" + System.identityHashCode(barrier); + } + + public static void printReverse(AsyncBarrierImpl barrier, int indent) { if (barrier.get() == 0) return; for (int i = 0; i < indent; i++) System.err.print(" "); - System.err.println("[" + barrier.get() + " requests]: " + barrier); - if (BOOKKEEPING) { - Debugger debugger = debuggerMap.get(barrier); - debugger.toErr(indent + 2); - } + System.err.println("[" + barrier.get() + " requests]: " + report(barrier)); +// if (BOOKKEEPING) { +// Debugger debugger = debuggerMap.get(barrier); +// debugger.toErr(indent + 2); +// } Collection children = reverseLookup.get(barrier); if (children != null) { @@ -374,8 +321,9 @@ final public class AsyncBarrierImpl extends AtomicInteger implements AsyncBarrie @Override public String toString() { - return "AsyncBarrierImpl@" + System.identityHashCode(this) - + " - counter = " + get() + " - caller = " + caller; + return report(this); +// return "AsyncBarrierImpl@" + System.identityHashCode(this) +// + " - counter = " + get() + " - caller = " + caller; } }