From c30c585f7620fbe935c5efe49f2016678245598e Mon Sep 17 00:00:00 2001 From: Andrew Golovashevich Date: Sun, 24 Aug 2025 00:43:25 +0300 Subject: [PATCH] UsagesCounter implementation on java --- build.gradle.kts | 1 + .../closeable_state_1/CloseableState.kt | 4 +- .../closeable_state_1/jUsagesCounter.java | 66 +++++++++++++++++++ .../jUsagesCounter$Errors.kt | 13 ++++ .../closeable_state_1/UsagesCounter.kt | 0 5 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 src/jvmMain/java/ru/landgrafhomyak/utility/closeable_state_1/jUsagesCounter.java create mode 100644 src/jvmMain/kotlin/ru/landgrafhomyak/utility/closeable_state_1/jUsagesCounter$Errors.kt rename src/{commonMain => nonJvmMain}/kotlin/ru/landgrafhomyak/utility/closeable_state_1/UsagesCounter.kt (100%) diff --git a/build.gradle.kts b/build.gradle.kts index 4a3ce8d..7e29b4f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -38,6 +38,7 @@ xomrk { compilations.configureEach { compileJavaTaskProvider?.configure { targetCompatibility = "1.8" + sourceCompatibility = "1.8" } compileTaskProvider.configure { compilerOptions { diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/utility/closeable_state_1/CloseableState.kt b/src/commonMain/kotlin/ru/landgrafhomyak/utility/closeable_state_1/CloseableState.kt index 2017dc6..94ac59a 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/utility/closeable_state_1/CloseableState.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/utility/closeable_state_1/CloseableState.kt @@ -1,10 +1,10 @@ package ru.landgrafhomyak.utility.closeable_state_1 public interface CloseableState { - public fun assertNotClosed() - public val isClosed: Boolean + public fun assertNotClosed() + @ManualStateManipulation public fun startUsage() diff --git a/src/jvmMain/java/ru/landgrafhomyak/utility/closeable_state_1/jUsagesCounter.java b/src/jvmMain/java/ru/landgrafhomyak/utility/closeable_state_1/jUsagesCounter.java new file mode 100644 index 0000000..7afae9e --- /dev/null +++ b/src/jvmMain/java/ru/landgrafhomyak/utility/closeable_state_1/jUsagesCounter.java @@ -0,0 +1,66 @@ +package ru.landgrafhomyak.utility.closeable_state_1; + +import ru.landgrafhomyak.utility.closeable_state_1.internal.Misc; + +import java.util.concurrent.atomic.AtomicLong; + +public class jUsagesCounter extends jUsagesCounter$Errors implements CloseableState.AllowsConcurrency { + private final AtomicLong _referencesCounter; + + public jUsagesCounter() { + this._referencesCounter = new AtomicLong(0); + } + + @Override + public boolean isClosed() { + return this._referencesCounter.get() < 0; + } + + @Override + public void assertNotClosed() { + if (this._referencesCounter.get() < 0) + this.throwClosed(); + } + + @Override + public void startUsage() { + while (true) { + final long cur = this._referencesCounter.get(); + if (cur < 0) { + this.throwClosed(); + return; + } + + if (this._referencesCounter.compareAndSet(cur, cur + 1)) + return; + } + } + + @Override + public void finishUsage() { + while (true) { + final long cur = this._referencesCounter.get(); + if (cur < 0) { + this.throwClosed(); + return; + } + + if (this._referencesCounter.compareAndSet(cur, cur - 1)) + return; + } + } + + @Override + public void close() { + long currentReferencesCount; + while (true) { + currentReferencesCount = this._referencesCounter.get(); + if (currentReferencesCount != 0) break; + if (this._referencesCounter.compareAndSet(currentReferencesCount, Misc.CLOSED_STATE_VALUE)) + break; + } + + if (currentReferencesCount > 0) this.throwInUse(); + if (currentReferencesCount < 0) this.throwClosed(); + } +} diff --git a/src/jvmMain/kotlin/ru/landgrafhomyak/utility/closeable_state_1/jUsagesCounter$Errors.kt b/src/jvmMain/kotlin/ru/landgrafhomyak/utility/closeable_state_1/jUsagesCounter$Errors.kt new file mode 100644 index 0000000..cb1bc9c --- /dev/null +++ b/src/jvmMain/kotlin/ru/landgrafhomyak/utility/closeable_state_1/jUsagesCounter$Errors.kt @@ -0,0 +1,13 @@ +package ru.landgrafhomyak.utility.closeable_state_1 + +import kotlin.IllegalStateException + +internal abstract class `jUsagesCounter$Errors` { + protected open fun throwClosed(): Nothing { + throw IllegalStateException("Object is closed") + } + + protected open fun throwInUse(): Nothing { + throw IllegalStateException("Failed close object because it is in use") + } +} \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/utility/closeable_state_1/UsagesCounter.kt b/src/nonJvmMain/kotlin/ru/landgrafhomyak/utility/closeable_state_1/UsagesCounter.kt similarity index 100% rename from src/commonMain/kotlin/ru/landgrafhomyak/utility/closeable_state_1/UsagesCounter.kt rename to src/nonJvmMain/kotlin/ru/landgrafhomyak/utility/closeable_state_1/UsagesCounter.kt