提交 127c1275 编写于 作者: S Serge Rider

#9705 Lock data read during row refresh


Former-commit-id: 68c8898b
上级 c11987b9
...@@ -1022,6 +1022,9 @@ class ResultSetPersister { ...@@ -1022,6 +1022,9 @@ class ResultSetPersister {
@Override @Override
protected IStatus run(DBRProgressMonitor monitor) { protected IStatus run(DBRProgressMonitor monitor) {
if (!viewer.acquireDataReadLock()) {
return Status.CANCEL_STATUS;
}
monitor.beginTask("Refresh updated rows", 1); monitor.beginTask("Refresh updated rows", 1);
try { try {
final Object[][] refreshValues = new Object[rows.size()][]; final Object[][] refreshValues = new Object[rows.size()][];
...@@ -1090,6 +1093,7 @@ class ResultSetPersister { ...@@ -1090,6 +1093,7 @@ class ResultSetPersister {
} }
} finally { } finally {
monitor.done(); monitor.done();
viewer.releaseDataReadLock();
} }
return Status.OK_STATUS; return Status.OK_STATUS;
} }
......
...@@ -3695,6 +3695,26 @@ public class ResultSetViewer extends Viewer ...@@ -3695,6 +3695,26 @@ public class ResultSetViewer extends Viewer
} }
} }
void releaseDataReadLock() {
synchronized (dataPumpJobQueue) {
if (!dataPumpRunning.get()) {
log.debug("Internal error: data read status is empty");
}
dataPumpRunning.set(false);
}
}
boolean acquireDataReadLock() {
synchronized (dataPumpJobQueue) {
if (dataPumpRunning.get()) {
log.debug("Internal error: multiple data reads started (" + dataPumpJobQueue + ")");
return false;
}
dataPumpRunning.set(true);
}
return true;
}
public void clearData() public void clearData()
{ {
this.model.releaseAllData(); this.model.releaseAllData();
...@@ -4413,12 +4433,8 @@ public class ResultSetViewer extends Viewer ...@@ -4413,12 +4433,8 @@ public class ResultSetViewer extends Viewer
@Override @Override
protected IStatus run(DBRProgressMonitor monitor) { protected IStatus run(DBRProgressMonitor monitor) {
synchronized (dataPumpJobQueue) { if (!acquireDataReadLock()) {
if (dataPumpRunning.get()) { return Status.CANCEL_STATUS;
log.debug("Internal error: multiple data reads started (" + dataPumpJobQueue + ")");
return Status.CANCEL_STATUS;
}
dataPumpRunning.set(true);
} }
beforeDataRead(); beforeDataRead();
try { try {
...@@ -4426,12 +4442,7 @@ public class ResultSetViewer extends Viewer ...@@ -4426,12 +4442,7 @@ public class ResultSetViewer extends Viewer
afterDataRead(); afterDataRead();
return status; return status;
} finally { } finally {
synchronized (dataPumpJobQueue) { releaseDataReadLock();
if (!dataPumpRunning.get()) {
log.debug("Internal error: data read status is empty");
}
dataPumpRunning.set(false);
}
} }
} }
...@@ -4559,4 +4570,5 @@ public class ResultSetViewer extends Viewer ...@@ -4559,4 +4570,5 @@ public class ResultSetViewer extends Viewer
}); });
} }
} }
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册