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

#9705 Lock data read during row refresh


Former-commit-id: 68c8898b
上级 c11987b9
......@@ -1022,6 +1022,9 @@ class ResultSetPersister {
@Override
protected IStatus run(DBRProgressMonitor monitor) {
if (!viewer.acquireDataReadLock()) {
return Status.CANCEL_STATUS;
}
monitor.beginTask("Refresh updated rows", 1);
try {
final Object[][] refreshValues = new Object[rows.size()][];
......@@ -1090,6 +1093,7 @@ class ResultSetPersister {
}
} finally {
monitor.done();
viewer.releaseDataReadLock();
}
return Status.OK_STATUS;
}
......
......@@ -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()
{
this.model.releaseAllData();
......@@ -4413,25 +4433,16 @@ public class ResultSetViewer extends Viewer
@Override
protected IStatus run(DBRProgressMonitor monitor) {
synchronized (dataPumpJobQueue) {
if (dataPumpRunning.get()) {
log.debug("Internal error: multiple data reads started (" + dataPumpJobQueue + ")");
if (!acquireDataReadLock()) {
return Status.CANCEL_STATUS;
}
dataPumpRunning.set(true);
}
beforeDataRead();
try {
IStatus status = super.run(monitor);
afterDataRead();
return status;
} finally {
synchronized (dataPumpJobQueue) {
if (!dataPumpRunning.get()) {
log.debug("Internal error: data read status is empty");
}
dataPumpRunning.set(false);
}
releaseDataReadLock();
}
}
......@@ -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.
先完成此消息的编辑!
想要评论请 注册