Extract BasicMap from IncrementalCacheImpl

Original commit: bde78c2df2
This commit is contained in:
Alexey Tsvetkov
2015-07-28 15:32:49 +03:00
parent 20db45c3cf
commit a7cf6bbf9a
2 changed files with 100 additions and 68 deletions
@@ -17,7 +17,10 @@
package org.jetbrains.kotlin.jps.incremental
import com.intellij.openapi.util.io.FileUtil
import com.intellij.util.io.*
import com.intellij.util.io.BooleanDataDescriptor
import com.intellij.util.io.DataExternalizer
import com.intellij.util.io.IOUtil
import com.intellij.util.io.KeyDescriptor
import gnu.trove.THashMap
import gnu.trove.THashSet
import org.jetbrains.annotations.TestOnly
@@ -33,6 +36,7 @@ import org.jetbrains.kotlin.jps.build.KotlinBuilder
import org.jetbrains.kotlin.jps.incremental.IncrementalCacheImpl.RecompilationDecision.DO_NOTHING
import org.jetbrains.kotlin.jps.incremental.IncrementalCacheImpl.RecompilationDecision.RECOMPILE_OTHER_IN_CHUNK_AND_DEPENDANTS
import org.jetbrains.kotlin.jps.incremental.IncrementalCacheImpl.RecompilationDecision.RECOMPILE_OTHER_KOTLIN_IN_CHUNK
import org.jetbrains.kotlin.jps.incremental.storage.BasicMap
import org.jetbrains.kotlin.load.java.JvmAbi
import org.jetbrains.kotlin.load.java.JvmAnnotationNames
import org.jetbrains.kotlin.load.kotlin.ModuleMapping
@@ -48,9 +52,11 @@ import org.jetbrains.kotlin.serialization.ProtoBuf
import org.jetbrains.kotlin.serialization.deserialization.visibility
import org.jetbrains.kotlin.serialization.jvm.BitEncoding
import org.jetbrains.kotlin.serialization.jvm.JvmProtoBufUtil
import org.jetbrains.kotlin.utils.Printer
import org.jetbrains.org.objectweb.asm.*
import java.io.*
import java.io.DataInput
import java.io.DataInputStream
import java.io.DataOutput
import java.io.File
import java.security.MessageDigest
import java.util.*
@@ -309,71 +315,6 @@ public class IncrementalCacheImpl(targetDataRoot: File) : StorageOwner, Incremen
maps.forEach { it.close () }
}
private inner abstract class BasicMap<V>(
private val storageFile: File,
private val valueExternalizer: DataExternalizer<V>
) {
protected open val keyDescriptor: KeyDescriptor<String>
get() = EnumeratorStringDescriptor()
protected var storage: PersistentHashMap<String, V> = createMap()
public fun contains(key: String): Boolean = storage.containsMapping(key)
public open fun clean() {
try {
storage.close()
}
catch (ignored: IOException) {
}
PersistentHashMap.deleteFilesStartingWith(storage.getBaseFile()!!)
try {
storage = createMap()
}
catch (ignored: IOException) {
}
}
public open fun flush(memoryCachesOnly: Boolean) {
if (memoryCachesOnly) {
if (storage.isDirty()) {
storage.dropMemoryCaches()
}
}
else {
storage.force()
}
}
public fun close() {
storage.close()
}
TestOnly
public fun dump(): String {
return with(StringBuilder()) {
with(Printer(this)) {
println(this@BasicMap.javaClass.getSimpleName())
pushIndent()
for (key in storage.getAllKeysWithExistingMapping().sort()) {
println("$key -> ${dumpValue(storage[key])}")
}
popIndent()
}
this
}.toString()
}
protected abstract fun dumpValue(value: V): String
private fun createMap(): PersistentHashMap<String, V> =
PersistentHashMap(storageFile, keyDescriptor, valueExternalizer)
}
private inner class ProtoMap(storageFile: File) : BasicMap<ByteArray>(storageFile, ByteArrayExternalizer) {
public fun put(className: JvmClassName, data: ByteArray, isPackage: Boolean, checkChangesIsOpenPart: Boolean = true): Boolean {
@@ -0,0 +1,91 @@
/*
* Copyright 2010-2015 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.kotlin.jps.incremental.storage
import com.intellij.util.io.DataExternalizer
import com.intellij.util.io.EnumeratorStringDescriptor
import com.intellij.util.io.KeyDescriptor
import com.intellij.util.io.PersistentHashMap
import org.jetbrains.annotations.TestOnly
import org.jetbrains.kotlin.utils.Printer
import java.io.File
import java.io.IOException
public abstract class BasicMap<V>(
private val storageFile: File,
private val valueExternalizer: DataExternalizer<V>
) {
protected open val keyDescriptor: KeyDescriptor<String>
get() = EnumeratorStringDescriptor()
protected var storage: PersistentHashMap<String, V> = createMap()
public fun contains(key: String): Boolean = storage.containsMapping(key)
public open fun clean() {
try {
storage.close()
}
catch (ignored: IOException) {
}
PersistentHashMap.deleteFilesStartingWith(storage.getBaseFile()!!)
try {
storage = createMap()
}
catch (ignored: IOException) {
}
}
public open fun flush(memoryCachesOnly: Boolean) {
if (memoryCachesOnly) {
if (storage.isDirty()) {
storage.dropMemoryCaches()
}
}
else {
storage.force()
}
}
public fun close() {
storage.close()
}
TestOnly
public fun dump(): String {
return with(StringBuilder()) {
with(Printer(this)) {
println(this@BasicMap.javaClass.getSimpleName())
pushIndent()
for (key in storage.getAllKeysWithExistingMapping().sort()) {
println("$key -> ${dumpValue(storage[key])}")
}
popIndent()
}
this
}.toString()
}
protected abstract fun dumpValue(value: V): String
private fun createMap(): PersistentHashMap<String, V> =
PersistentHashMap(storageFile, keyDescriptor, valueExternalizer)
}