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