From 6769513e2de9b37c2dfe87b7b4459f937710f5e6 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Wed, 1 Mar 2023 12:53:34 +0100 Subject: [PATCH] fixes database reopening problem due to locking --- .../minres/scviewer/database/IWaveformDb.java | 9 ++++ .../database/internal/WaveformDb.java | 9 ++++ .../elements/RelationTypeToolControl.java | 2 +- .../handlers/AddSeparatorHandler.java | 8 ++- .../handlers/SelectAllHandler.java | 4 +- .../e4/application/parts/WaveformViewer.java | 7 +++ .../inputs/my_db.fst | Bin 1431 -> 805 bytes .../inputs/my_db.ftr | Bin 1774 -> 1793 bytes .../inputs/my_db.scview | 49 ++++++++++++++++++ 9 files changed, 83 insertions(+), 5 deletions(-) create mode 100644 tests/com.minres.scviewer.database.test/inputs/my_db.scview diff --git a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/IWaveformDb.java b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/IWaveformDb.java index f7d1aa5..700cc04 100644 --- a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/IWaveformDb.java +++ b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/IWaveformDb.java @@ -62,4 +62,13 @@ public interface IWaveformDb extends IHierNode { */ public boolean isLoaded(); + /** + * close an open database. + * + * @param inp the inp + * @return true, if successful + */ + public void close(); + + } diff --git a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/internal/WaveformDb.java b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/internal/WaveformDb.java index 6530b57..d56f2df 100644 --- a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/internal/WaveformDb.java +++ b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/internal/WaveformDb.java @@ -18,6 +18,7 @@ import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.concurrent.ConcurrentHashMap; import org.slf4j.Logger; @@ -39,6 +40,7 @@ public class WaveformDb extends HierNode implements IWaveformDb, PropertyChangeL /** The loaders. */ private static List loaderFactories = new LinkedList<>(); + private List activeLoader = new ArrayList<>(); /** The loaded. */ private boolean loaded; @@ -136,6 +138,7 @@ public class WaveformDb extends HierNode implements IWaveformDb, PropertyChangeL loader.addPropertyChangeListener(this); try { loader.load(inp); + activeLoader.add(loader); } catch (Exception e) { LOG.error("error loading file "+inp.getName(), e); retval=false; @@ -158,6 +161,12 @@ public class WaveformDb extends HierNode implements IWaveformDb, PropertyChangeL return retval; } + @Override + public void close() { + for (IWaveformDbLoader entry : activeLoader) { + entry.dispose(); + } + } /** * Gets the file basename. * diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/elements/RelationTypeToolControl.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/elements/RelationTypeToolControl.java index bb24484..358282a 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/elements/RelationTypeToolControl.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/elements/RelationTypeToolControl.java @@ -124,7 +124,7 @@ public class RelationTypeToolControl extends PartListener implements ISelectionC return; } } - if(comboViewer!=null) comboViewer.getCombo().setEnabled(false); + if(comboViewer!=null && !comboViewer.getCombo().isDisposed()) comboViewer.getCombo().setEnabled(false); } /* (non-Javadoc) diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/AddSeparatorHandler.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/AddSeparatorHandler.java index 2af596a..91686c5 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/AddSeparatorHandler.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/AddSeparatorHandler.java @@ -35,8 +35,12 @@ public class AddSeparatorHandler { Object sel = ((WaveformViewer)part.getObject()).getSelection(); if( sel instanceof IStructuredSelection) { if(((IStructuredSelection)sel).isEmpty()) return false; - Object o= ((IStructuredSelection)sel).getFirstElement(); - return o instanceof TrackEntry; + IStructuredSelection isel = (IStructuredSelection) sel; + if(isel.size()==1) + return isel.getFirstElement() instanceof TrackEntry; + else if(isel.size()==2) { + return isel.toArray()[1] instanceof TrackEntry; + } } } return false; diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/SelectAllHandler.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/SelectAllHandler.java index 2c7aa58..00e8207 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/SelectAllHandler.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/SelectAllHandler.java @@ -23,13 +23,13 @@ public class SelectAllHandler { @CanExecute public boolean canExecute(EPartService partService) { MPart part = partService.getActivePart(); - return part.getObject() instanceof WaveformViewer; + return part!=null && part.getObject() instanceof WaveformViewer; } @Execute public void execute(EPartService partService) { MPart part = partService.getActivePart(); - if(part.getObject() instanceof WaveformViewer) + if(part!=null && part.getObject() instanceof WaveformViewer) ((WaveformViewer) part.getObject()).selectAll(); } diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/WaveformViewer.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/WaveformViewer.java index 79e964a..760107a 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/WaveformViewer.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/parts/WaveformViewer.java @@ -29,6 +29,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; import javax.inject.Inject; import javax.inject.Named; @@ -512,6 +513,12 @@ public class WaveformViewer implements IFileChangeListener, IPreferenceChangeLis showTxDetails(false); } + @PreDestroy + public void closeDatabase() { + if(database.isLoaded()) + database.close(); + } + @Inject @Optional public void reactOnPrefsChange(@Preference(nodePath = PreferenceConstants.PREFERENCES_SCOPE) IEclipsePreferences prefs) { diff --git a/tests/com.minres.scviewer.database.test/inputs/my_db.fst b/tests/com.minres.scviewer.database.test/inputs/my_db.fst index 42f3e3eb17f9da8728ec53994df1121c9d5325ac..79137db3541211053959379ca12590302d2f8850 100644 GIT binary patch literal 805 zcmchV&ubGw6vw|a+3t>Oc4_MhIV^REsVqh8X44-Mgrpi`tVkskRstF}*$Ax#+wE4{ zTMl{>ya~M)FGbOdr=BX_R79_O(p!!m#Dj;Xvu1keKhSy1eBS%M2k*@=!2d;V3@Fd- zhpS7z^-SL%Dkln)vH+E?DXB@4^!@eNkCx(2B$bnf-wFAxAmTjF^Ip*_6uoKgxn4m( zp+V#$k?CXo#7hoh<;B_4+UC92yYDGh?w z`_I}E>6p~$oeW>#BJI@NJ%w1;9Ls%Y-E?<*T8SzuMZe$wc3V+}jqhNYT@|x59%{NvG`_01pc?Vq#y^4Xi FwL?Y+WYquw literal 1431 zcmZQz00Tx(2n`{vXD#}W87|VzwV%}iB*Fm^29bSF>-iuNO5Fw1aTMv=_rmWFwcuaiKB}V zC=|uv1Y|OVF}g5CRLF2^Ox8#?Fqfz^IHU2&pj}5wV}ptngB^z!P*oO?wBkqt>hR(a z;wS>rLL8GAff7+b1B^Hr9Qai1c-(aORLpq%WaM1>1ctm>B+#fnb!{Lh1+17v28vxR6q?%!^Df^F>t~^V4A4@HfkA*FrL;^hskAsgC9xz?A==!^AeMncoPj}@AvwM%rILYBkbyyi z!8KdPzoUH*8HZ4jm6l72>D(7ZUO3u+>&@U+}XJFJSDJo-N2D&MbfxVQ$ iprlAoh=H|)fkl9UrIGfjV!O&0P0c=)c^nh delta 13 VcmZqVd&kRi^XB*Y8^vF-0RSwa29E#$ diff --git a/tests/com.minres.scviewer.database.test/inputs/my_db.scview b/tests/com.minres.scviewer.database.test/inputs/my_db.scview new file mode 100644 index 0000000..819e4d1 --- /dev/null +++ b/tests/com.minres.scviewer.database.test/inputs/my_db.scview @@ -0,0 +1,49 @@ +#Written by SCViewer +#Wed Mar 01 08:49:19 CET 2023 +SHOWN_WAVEFORM0=tr.addr_ack +SHOWN_WAVEFORM2=tr.bus_addr[7\:0] +SHOWN_WAVEFORM1=tr.addr_req +SHOWN_WAVEFORM7=tr.rw +SHOWN_WAVEFORM5.WAVEFORM_TYPE=SIGNAL +SHOWN_WAVEFORM4=tr.bus_data[7\:0] +SHOWN_WAVEFORM3=Blank +SHOWN_WAVEFORM6=tr.data_rdy +SHOWN_WAVEFORM5=tr.clk +SHOWN_CURSOR1=100000000 +SHOWN_CURSOR0=10000000 +SHOWN_WAVEFORM0.WAVEFORM_TYPE=SIGNAL +SHOWN_WAVEFORM5.VALUE_DISPLAY=DEFAULT +SHOWN_WAVEFORM0.VALUE_DISPLAY=DEFAULT +SHOWN_WAVEFORMS=8 +SCALING_FACTOR=1000000 +SHOWN_CURSORS=2 +SHOWN_WAVEFORM0.WAVEFORM_SELECTED=FALSE +SHOWN_WAVEFORM7.WAVEFORM_SELECTED=FALSE +SHOWN_WAVEFORM3.WAVEFORM_TYPE=EMPTY +SHOWN_WAVEFORM2.WAVEFORM_TYPE=SIGNAL +SHOWN_WAVEFORM6.VALUE_DISPLAY=DEFAULT +SHOWN_WAVEFORM2.WAVEFORM_SELECTED=FALSE +SHOWN_WAVEFORM4.WAVEFORM_TYPE=SIGNAL +DATABASE_FILE0=/scratch/eyck/workarea/MINRES/SCViewer/tests/com.minres.scviewer.database.test/inputs/my_db.vcd +SHOWN_WAVEFORM7.WAVE_DISPLAY=DEFAULT +SHOWN_WAVEFORM7.VALUE_DISPLAY=DEFAULT +SHOWN_WAVEFORM4.WAVEFORM_SELECTED=FALSE +SHOWN_WAVEFORM5.WAVE_DISPLAY=DEFAULT +DATABASE_FILES=1 +SHOWN_WAVEFORM1.WAVE_DISPLAY=DEFAULT +SHOWN_WAVEFORM4.VALUE_DISPLAY=DEFAULT +SHOWN_WAVEFORM5.WAVEFORM_SELECTED=FALSE +SHOWN_WAVEFORM1.WAVEFORM_TYPE=SIGNAL +SHOWN_WAVEFORM6.WAVEFORM_SELECTED=FALSE +SHOWN_WAVEFORM6.WAVEFORM_TYPE=SIGNAL +SHOWN_WAVEFORM1.WAVEFORM_SELECTED=FALSE +SHOWN_WAVEFORM4.WAVE_DISPLAY=DEFAULT +SHOWN_WAVEFORM1.VALUE_DISPLAY=DEFAULT +SHOWN_WAVEFORM7.WAVEFORM_TYPE=SIGNAL +TX_DETAILS_SHOWN=false +SHOWN_WAVEFORM2.VALUE_DISPLAY=DEFAULT +SHOWN_WAVEFORM2.WAVE_DISPLAY=DEFAULT +SHOWN_WAVEFORM0.WAVE_DISPLAY=DEFAULT +SHOWN_WAVEFORM6.WAVE_DISPLAY=DEFAULT +BASE_LINE_TIME=0 +SHOWN_WAVEFORM3.WAVEFORM_SELECTED=TRUE