0
0
mirror of https://github.com/tursom/TursomServer.git synced 2025-04-26 13:01:22 +08:00

update ReleasableReference

This commit is contained in:
tursom 2021-07-13 14:10:45 +08:00
parent 5a19df7feb
commit 05d90029ae
6 changed files with 42 additions and 4 deletions
ts-core
src/main/kotlin/cn/tursom/core/reference
ts-buffer/src/main/kotlin/cn/tursom/core/buffer/impl
ts-delegation

View File

@ -10,6 +10,11 @@ abstract class FreeReference<T>(
private var cancel: Boolean = false
init {
@Suppress("LeakingThis")
ReleasableReference.hosting(this)
}
override fun enqueue(): Boolean {
return if (cancel) {
false
@ -18,7 +23,8 @@ abstract class FreeReference<T>(
}
}
fun cancel() {
override fun cancel() {
super.cancel()
cancel = true
}
}

View File

@ -10,6 +10,11 @@ abstract class FreeSoftReference<T>(
private var cancel: Boolean = false
init {
@Suppress("LeakingThis")
ReleasableReference.hosting(this)
}
override fun enqueue(): Boolean {
return if (cancel) {
false
@ -18,7 +23,8 @@ abstract class FreeSoftReference<T>(
}
}
fun cancel() {
override fun cancel() {
super.cancel()
cancel = true
}
}

View File

@ -10,6 +10,11 @@ abstract class FreeWeakReference<T>(
private var cancel: Boolean = false
init {
@Suppress("LeakingThis")
ReleasableReference.hosting(this)
}
override fun enqueue(): Boolean {
return if (cancel) {
false
@ -18,7 +23,8 @@ abstract class FreeWeakReference<T>(
}
}
fun cancel() {
override fun cancel() {
super.cancel()
cancel = true
}
}

View File

@ -2,25 +2,42 @@ package cn.tursom.core.reference
import org.slf4j.LoggerFactory
import java.lang.ref.ReferenceQueue
import java.util.concurrent.ConcurrentHashMap
import kotlin.concurrent.thread
interface ReleasableReference {
companion object {
private val logger = LoggerFactory.getLogger(ReleasableReference::class.java)
private val referenceSet: MutableSet<ReleasableReference> =
ConcurrentHashMap<ReleasableReference, Unit>().keySet(Unit)
val referenceQueue = ReferenceQueue<Any?>()
private val freeThread = thread(isDaemon = true) {
while (true) {
val freeReference = referenceQueue.remove(1000) ?: continue
try {
if (freeReference is ReleasableReference) {
freeReference.release()
referenceSet.remove(freeReference)
}
} catch (e: Throwable) {
logger.error("an exception caused on free reference", e)
}
}
}
fun hosting(reference: ReleasableReference) {
referenceSet.add(reference)
}
fun free(reference: ReleasableReference) {
referenceSet.remove(reference)
}
}
fun release()
fun cancel() {
referenceSet.remove(this)
}
}

View File

@ -3,6 +3,7 @@ package cn.tursom.core.buffer.impl
import cn.tursom.core.AsyncFile
import cn.tursom.core.buffer.ByteBuffer
import cn.tursom.core.reference.FreeReference
import cn.tursom.log.impl.Slf4jImpl
import io.netty.buffer.ByteBuf
import java.io.OutputStream
import java.nio.ByteOrder
@ -13,6 +14,8 @@ class NettyByteBuffer(
val byteBuf: ByteBuf,
autoClose: Boolean = false,
) : ByteBuffer {
companion object : Slf4jImpl()
constructor(
byteBuf: ByteBuf,
readPosition: Int = byteBuf.readerIndex(),

View File

@ -4,7 +4,7 @@ plugins {
}
dependencies {
implementation(project(":ts-core"))
api(project(":ts-core"))
compileOnly(group = "io.netty", name = "netty-all", version = "4.1.43.Final")
}