mirror of
https://github.com/tursom/TursomServer.git
synced 2025-04-26 13:01:22 +08:00
update ReleasableReference
This commit is contained in:
parent
5a19df7feb
commit
05d90029ae
ts-core
src/main/kotlin/cn/tursom/core/reference
ts-buffer/src/main/kotlin/cn/tursom/core/buffer/impl
ts-delegation
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
@ -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(),
|
||||
|
@ -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")
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user