fixes various NPE related to selection while reloading database

This commit is contained in:
2026-04-10 08:11:38 +02:00
parent e4ba753f82
commit 17015f1bbc
6 changed files with 19 additions and 8 deletions

View File

@@ -153,8 +153,11 @@ abstract class AbstractTxStream extends HierNode implements IWaveform {
switch(evt.getKind()) { switch(evt.getKind()) {
case END: //TODO: might throw NPE in concurrent execution case END: //TODO: might throw NPE in concurrent execution
Long txId = txEvt.getTransaction().getId(); Long txId = txEvt.getTransaction().getId();
txEvt.setConcurrencyIndex(rowByTxId.get(txId)); Integer row = rowByTxId.get(txId);
rowByTxId.remove(txId); if(row!=null) {
txEvt.setConcurrencyIndex(row);
rowByTxId.remove(txId);
}
break; break;
case SINGLE: case SINGLE:
for (; rowIdx < rowEndTime.size() && rowEndTime.get(rowIdx)>tx.getBeginTime(); rowIdx++); for (; rowIdx < rowEndTime.size() && rowEndTime.get(rowIdx)>tx.getBeginTime(); rowIdx++);

View File

@@ -238,6 +238,8 @@ public class FtrDbLoader implements IWaveformDbLoader {
genId = cborDecoder.readInt(); genId = cborDecoder.readInt();
long startTime = cborDecoder.readInt()*time_scale_factor; long startTime = cborDecoder.readInt()*time_scale_factor;
long endTime = cborDecoder.readInt()*time_scale_factor; long endTime = cborDecoder.readInt()*time_scale_factor;
if(endTime<startTime) // fix buggy recording, end time needs to be later or equal start time
endTime=startTime;
TxGenerator gen = txGenerators.get(genId); TxGenerator gen = txGenerators.get(genId);
TxStream stream = gen.stream; TxStream stream = gen.stream;
FtrTx scvTx = new FtrTx(txId, stream.getId(), genId, startTime, endTime, blockId, blockOffset); FtrTx scvTx = new FtrTx(txId, stream.getId(), genId, startTime, endTime, blockId, blockOffset);

View File

@@ -124,7 +124,8 @@ public class StreamPainter extends TrackPainter{
protected void drawTx(Projection proj, Rectangle area, ITx tx, int concurrencyIndex, boolean highlighted ) { protected void drawTx(Projection proj, Rectangle area, ITx tx, int concurrencyIndex, boolean highlighted ) {
// compute colors // compute colors
Color[] transColor = waveCanvas.styleProvider.computeColor( tx.getGenerator().getName()); IWaveform generator = tx.getGenerator();
Color[] transColor = waveCanvas.styleProvider.computeColor( generator!=null?generator.getName():"unknown");
proj.setBackground(transColor[highlighted?1:0]); proj.setBackground(transColor[highlighted?1:0]);

View File

@@ -653,7 +653,9 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis
public void reloadDatabase() { public void reloadDatabase() {
Map<String, String> state = new HashMap<>(); Map<String, String> state = new HashMap<>();
saveWaveformViewerState(state); saveWaveformViewerState(state);
setSelection(null);
waveformPane.getStreamList().clear(); waveformPane.getStreamList().clear();
waveformPane.update();
if(database.isLoaded()) if(database.isLoaded())
database.close(); database.close();
database = dbFactory.getDatabase(); database = dbFactory.getDatabase();

View File

@@ -5,6 +5,7 @@ import java.util.Vector;
import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.Viewer;
import com.minres.scviewer.database.IWaveform;
import com.minres.scviewer.database.tx.ITx; import com.minres.scviewer.database.tx.ITx;
import com.minres.scviewer.database.tx.ITxRelation; import com.minres.scviewer.database.tx.ITxRelation;
import com.minres.scviewer.e4.application.Messages; import com.minres.scviewer.e4.application.Messages;
@@ -51,9 +52,11 @@ public abstract class AbstractTransactionTreeContentProvider implements ITreeCon
TransactionTreeNode node=(TransactionTreeNode) element; TransactionTreeNode node=(TransactionTreeNode) element;
switch(node.type) { switch(node.type) {
case PROPS: case PROPS:
IWaveform stream = node.element.getStream();
IWaveform generator = node.element.getGenerator();
return new Object[][]{ return new Object[][]{
{Messages.TransactionDetails_1, Messages.TransactionDetails_16, node.element.getStream().getFullName()}, {Messages.TransactionDetails_1, Messages.TransactionDetails_16, stream!=null?stream.getFullName():"[unknown]"},
{Messages.TransactionDetails_2, Messages.TransactionDetails_16, node.element.getGenerator().getName()}, {Messages.TransactionDetails_2, Messages.TransactionDetails_16, generator!=null?generator.getName():"[unknown]"},
{Messages.TransactionDetails_19, Messages.TransactionDetails_20, waveformViewerPart.getScaledTime(node.element.getBeginTime())}, {Messages.TransactionDetails_19, Messages.TransactionDetails_20, waveformViewerPart.getScaledTime(node.element.getBeginTime())},
{Messages.TransactionDetails_21, Messages.TransactionDetails_20, waveformViewerPart.getScaledTime(node.element.getEndTime())} {Messages.TransactionDetails_21, Messages.TransactionDetails_20, waveformViewerPart.getScaledTime(node.element.getEndTime())}
}; };

View File

@@ -16,12 +16,12 @@ import com.minres.scviewer.e4.application.Messages;
public class TransactionTreeNode implements Comparable<TransactionTreeNode>{ public class TransactionTreeNode implements Comparable<TransactionTreeNode>{
/** The type. */ /** The type. */
public TransactionTreeNodeType type; public final TransactionTreeNodeType type;
/** The element. */ /** The element. */
public ITx element; public final ITx element;
private String hier_path; private final String hier_path;
/** /**
* Instantiates a new tree node. * Instantiates a new tree node.
* *