From 07c2353911c21ca2ab3700a47155f470e93431a5 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Sun, 25 Feb 2024 14:26:13 +0700 Subject: [PATCH] Proxy listeners of synched delegates (so they are removed when slot is removed) --- gradle.properties | 2 +- .../dbotthepony/kommons/io/DelegateSyncher.kt | 57 ++++++++++++++++++- 2 files changed, 57 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index f6cc9d6..65476b1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ kotlin.code.style=official specifyKotlinAsDependency=false projectGroup=ru.dbotthepony.kommons -projectVersion=2.9.7 +projectVersion=2.9.8 guavaDepVersion=33.0.0 gsonDepVersion=2.8.9 diff --git a/src/main/kotlin/ru/dbotthepony/kommons/io/DelegateSyncher.kt b/src/main/kotlin/ru/dbotthepony/kommons/io/DelegateSyncher.kt index 6226057..5a7a34f 100644 --- a/src/main/kotlin/ru/dbotthepony/kommons/io/DelegateSyncher.kt +++ b/src/main/kotlin/ru/dbotthepony/kommons/io/DelegateSyncher.kt @@ -138,8 +138,9 @@ class DelegateSyncher : Observer { } inner class Slot(val delegate: ListenableDelegate, val codec: StreamCodec) : AbstractSlot(), ListenableDelegate { - private val l = delegate.addListener(Runnable { + private val l = delegate.addListener(Consumer { markDirty() + listeners.accept(it) }) init { @@ -314,9 +315,36 @@ class DelegateSyncher : Observer { } private val l = delegate.addListener(listener) + private val listeners = CopyOnWriteArrayList() override fun remove0() { l.remove() + listeners.clear() + } + + private inner class Listener(val listener: ListenableSet.SetListener): Listenable.L { + private var isRemoved = false + + init { + listeners.add(this) + } + + override fun remove() { + if (!isRemoved) { + isRemoved = true + listeners.remove(this) + } + } + } + + fun addListener(listener: ListenableSet.SetListener): Listenable.L { + check(!isRemoved.get()) { "This network slot was removed" } + return Listener(listener) + } + + fun addListener(listener: Runnable): Listenable.L { + check(!isRemoved.get()) { "This network slot was removed" } + return Listener(ListenableSet.RunnableAdapter(listener)) } override fun read(stream: DataInputStream) { @@ -391,9 +419,36 @@ class DelegateSyncher : Observer { } private val l = delegate.addListener(listener) + private val listeners = CopyOnWriteArrayList() override fun remove0() { l.remove() + listeners.clear() + } + + private inner class Listener(val listener: ListenableMap.MapListener): Listenable.L { + private var isRemoved = false + + init { + listeners.add(this) + } + + override fun remove() { + if (!isRemoved) { + isRemoved = true + listeners.remove(this) + } + } + } + + fun addListener(listener: ListenableMap.MapListener): Listenable.L { + check(!isRemoved.get()) { "This network slot was removed" } + return Listener(listener) + } + + fun addListener(listener: Runnable): Listenable.L { + check(!isRemoved.get()) { "This network slot was removed" } + return Listener(ListenableMap.RunnableAdapter(listener)) } override fun read(stream: DataInputStream) {