提交 e115f05b authored 作者: Andrei Tokar's avatar Andrei Tokar

misc

上级 a4b3367e
...@@ -1757,9 +1757,13 @@ public class MVMap<K, V> extends AbstractMap<K, V> ...@@ -1757,9 +1757,13 @@ public class MVMap<K, V> extends AbstractMap<K, V>
} }
p = replacePage(pos, p, unsavedMemoryHolder); p = replacePage(pos, p, unsavedMemoryHolder);
rootPage = p; rootPage = p;
if(lockedRootReference == null && !updateRoot(rootReference, p, attempt)) { if (lockedRootReference == null) {
decisionMaker.reset(); if (!updateRoot(rootReference, p, attempt)) {
continue; decisionMaker.reset();
continue;
} else {
notifyWaiters();
}
} }
} finally { } finally {
if(lockedRootReference != null) { if(lockedRootReference != null) {
...@@ -1810,9 +1814,9 @@ public class MVMap<K, V> extends AbstractMap<K, V> ...@@ -1810,9 +1814,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 +1824,7 @@ public class MVMap<K, V> extends AbstractMap<K, V> ...@@ -1820,7 +1824,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 +1854,17 @@ public class MVMap<K, V> extends AbstractMap<K, V> ...@@ -1850,13 +1854,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 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论