From 73f2dcbf9e79d81d52eaad67f7a8dbb36f3fa84d Mon Sep 17 00:00:00 2001 From: "Maxim.Mossienko" Date: Tue, 2 Jul 2013 10:51:23 +0200 Subject: [PATCH] striping on vfs file id for index stamp locks --- .../intellij/util/indexing/IndexingStamp.java | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/util/indexing/IndexingStamp.java b/platform/lang-impl/src/com/intellij/util/indexing/IndexingStamp.java index 3086e91e4840..55a899a9a78b 100644 --- a/platform/lang-impl/src/com/intellij/util/indexing/IndexingStamp.java +++ b/platform/lang-impl/src/com/intellij/util/indexing/IndexingStamp.java @@ -18,6 +18,7 @@ package com.intellij.util.indexing; import com.intellij.openapi.vfs.InvalidVirtualFileAccessException; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.openapi.vfs.VirtualFileWithId; import com.intellij.openapi.vfs.newvfs.FileAttribute; import com.intellij.openapi.vfs.newvfs.NewVirtualFile; import com.intellij.util.containers.ConcurrentHashMap; @@ -141,7 +142,7 @@ public class IndexingStamp { } public static long getIndexStamp(VirtualFile file, ID indexName) { - synchronized (myTimestampsCache) { + synchronized (getStripedLock(file)) { Timestamps stamp = createOrGetTimeStamp(file); if (stamp != null) return stamp.get(indexName); return 0; @@ -172,7 +173,7 @@ public class IndexingStamp { } public static void update(final VirtualFile file, final ID indexName, final long indexCreationStamp) { - synchronized (myTimestampsCache) { + synchronized (getStripedLock(file)) { try { Timestamps stamp = createOrGetTimeStamp(file); if (stamp != null) stamp.set(indexName, indexCreationStamp); @@ -200,7 +201,7 @@ public class IndexingStamp { if (files != null) { for(VirtualFile file:files) { - synchronized (myTimestampsCache) { + synchronized (getStripedLock(file)) { Timestamps timestamp = myTimestampsCache.remove(file); if (timestamp == null) continue; try { @@ -219,4 +220,14 @@ public class IndexingStamp { if (finishedFile != null) myFinishedFiles.offer(finishedFile); } } + + private static final Object[] ourLocks = new Object[16]; + static { + for(int i = 0; i < ourLocks.length; ++i) ourLocks[i] = new Object(); + } + + private static Object getStripedLock(VirtualFile file) { + int id = ((VirtualFileWithId)file).getId(); + return (id & 0xFF) % ourLocks.length; + } }