Unverified 提交 619092cb authored 作者: Andrei Tokar's avatar Andrei Tokar 提交者: GitHub

Merge pull request #1747 from h2database/try-lock

Bug fix and tuneup for MVMap.tryLock()
......@@ -1755,11 +1755,14 @@ public class MVMap<K, V> extends AbstractMap<K, V>
break;
}
}
p = replacePage(pos, p, unsavedMemoryHolder);
rootPage = p;
if(lockedRootReference == null && !updateRoot(rootReference, p, attempt)) {
rootPage = replacePage(pos, p, unsavedMemoryHolder);
if (lockedRootReference == null) {
if (!updateRoot(rootReference, rootPage, attempt)) {
decisionMaker.reset();
continue;
} else {
notifyWaiters();
}
}
} finally {
if(lockedRootReference != null) {
......@@ -1810,9 +1813,9 @@ public class MVMap<K, V> extends AbstractMap<K, V>
if(attempt > 4) {
if (attempt <= 12) {
Thread.yield();
} else if (attempt <= 24) {
} else if (attempt <= 70 - 2 * contention) {
try {
Thread.sleep(0, 10 * contention + 5);
Thread.sleep(contention);
} catch (InterruptedException ex) {
throw new RuntimeException(ex);
}
......@@ -1820,7 +1823,7 @@ public class MVMap<K, V> extends AbstractMap<K, V>
synchronized (lock) {
notificationRequested = true;
try {
lock.wait(100);
lock.wait(5);
} catch (InterruptedException ignore) {
}
}
......@@ -1850,13 +1853,17 @@ public class MVMap<K, V> extends AbstractMap<K, V>
success = root.compareAndSet(rootReference, updatedRootReference);
} while(!success);
notifyWaiters();
return updatedRootReference;
}
private void notifyWaiters() {
if (notificationRequested) {
synchronized (lock) {
notificationRequested = false;
lock.notifyAll();
lock.notify();
}
}
return updatedRootReference;
}
private static CursorPos traverseDown(Page p, Object key) {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论