public static void flushCache(@Nullable VirtualFile finishedFile) { if (finishedFile == null || !myFinishedFiles.offer(finishedFile)) { VirtualFile[] files = null; synchronized (myFinishedFiles) { int size = myFinishedFiles.size(); if ((finishedFile == null && size > 0) || size == CAPACITY) { files = myFinishedFiles.toArray(new VirtualFile[size]); myFinishedFiles.clear(); } } if (files != null) { for (VirtualFile file : files) { synchronized (getStripedLock(file)) { Timestamps timestamp = myTimestampsCache.remove(file); if (timestamp == null) continue; try { if (timestamp.isDirty() && file.isValid()) { final DataOutputStream sink = Timestamps.PERSISTENCE.writeAttribute(file); timestamp.writeToStream(sink); sink.close(); } } catch (IOException e) { throw new RuntimeException(e); } } } } if (finishedFile != null) myFinishedFiles.offer(finishedFile); } }
@Override protected void onDropFromCache(final VirtualFile key, final Timestamps value) { try { if (value.isDirty()) { final DataOutputStream sink = Timestamps.PERSISTENCE.writeAttribute(key); value.writeToStream(sink); sink.close(); } } catch (InvalidVirtualFileAccessException ignored /*ok to ignore it here*/) { } catch (IOException e) { throw new RuntimeException(e); } }