Compare commits

...

5 commits

3 changed files with 14 additions and 10 deletions

View file

@ -1606,14 +1606,13 @@ public class ElfHeader implements StructConverter {
* @return the section header that contains the address * @return the section header that contains the address
*/ */
public ElfSectionHeader getSectionLoadHeaderContaining(long address) { public ElfSectionHeader getSectionLoadHeaderContaining(long address) {
// FIXME: verify
for (ElfSectionHeader sectionHeader : sectionHeaders) { for (ElfSectionHeader sectionHeader : sectionHeaders) {
if (!sectionHeader.isAlloc()) { if (!sectionHeader.isAlloc()) {
continue; continue;
} }
long start = sectionHeader.getAddress(); long start = sectionHeader.getAddress();
long end = start + sectionHeader.getSize(); long end = start + sectionHeader.getSize();
if (start <= address && address <= end) { if (start <= address && address < end) {
return sectionHeader; return sectionHeader;
} }
} }

View file

@ -35,10 +35,9 @@ public class IncrementalLoadJob<ROW_OBJECT> extends Job implements ThreadedTable
/** /**
* Used to signal that the updateManager has finished loading the final contents gathered * Used to signal that the updateManager has finished loading the final contents gathered
* by this job. By default, the value is 0, which means there is nothing to wait for. If we * by this job. This is also updated if this job is cancelled.
* flush, this will be set to 1.
*/ */
private volatile CountDownLatch completedCallbackLatch = new CountDownLatch(0); private volatile CountDownLatch completedCallbackLatch = new CountDownLatch(1);
private volatile boolean isCancelled = false; private volatile boolean isCancelled = false;
private volatile IncrementalUpdatingAccumulator incrementalAccumulator; private volatile IncrementalUpdatingAccumulator incrementalAccumulator;
@ -141,13 +140,18 @@ public class IncrementalLoadJob<ROW_OBJECT> extends Job implements ThreadedTable
// -A block on jobDone() can now complete as we release the lock // -A block on jobDone() can now complete as we release the lock
// -jobDone() will notify listeners in an invokeLater(), which puts it behind ours // -jobDone() will notify listeners in an invokeLater(), which puts it behind ours
// //
completedCallbackLatch = new CountDownLatch(1);
Swing.runLater(() -> updateManager.addThreadedTableListener(IncrementalLoadJob.this)); Swing.runLater(() -> updateManager.addThreadedTableListener(IncrementalLoadJob.this));
} }
waitForThreadedTableUpdateManagerToFinish(); waitForThreadedTableUpdateManagerToFinish();
} }
/**
* Waits for the final flushed data to be added to the table. We will get called when the data
* is finished loading or cancelled. The latch will also be released if the cancel method of
* this job is called. This can happen if the work queue is told to cancel all jobs, which can
* happen if a new reload job is requested.
*/
private void waitForThreadedTableUpdateManagerToFinish() { private void waitForThreadedTableUpdateManagerToFinish() {
try { try {
completedCallbackLatch.await(); completedCallbackLatch.await();
@ -179,6 +183,7 @@ public class IncrementalLoadJob<ROW_OBJECT> extends Job implements ThreadedTable
super.cancel(); super.cancel();
isCancelled = true; isCancelled = true;
incrementalAccumulator.cancel(); incrementalAccumulator.cancel();
completedCallbackLatch.countDown();
// Note: cannot do this here, since the cancel() call may happen asynchronously and after // Note: cannot do this here, since the cancel() call may happen asynchronously and after
// a call to reload() on the table model. Assume that the model itself has already // a call to reload() on the table model. Assume that the model itself has already

View file

@ -203,7 +203,7 @@ public abstract class ThreadedTableModel<ROW_OBJECT, DATA_SOURCE>
} }
private void cancelCurrentWorkerJob() { private void cancelCurrentWorkerJob() {
if (worker != null && worker.isBusy()) { if (worker != null) {
worker.clearAllJobsWithInterrupt_IKnowTheRisks(); worker.clearAllJobsWithInterrupt_IKnowTheRisks();
} }
} }