Mayank
01/03/2021, 1:20 PMDeactivated User
01/03/2021, 5:20 PMMayank
01/03/2021, 5:39 PMLogger_levels
and Logger_outputs
were global variable instead of each Logger instance having its own level
and output
?Deactivated User
01/13/2021, 1:53 PMMayank
01/22/2021, 9:30 AMupdate
did was use compareAndSet (https://github.com/Kotlin/kotlinx.atomicfu/blob/5ed01f453286cceca224b191f9e36e362b[…]micfu/src/commonMain/kotlin/kotlinx/atomicfu/AtomicFU.common.kt).Deactivated User
01/22/2021, 10:38 AMMayank
01/22/2021, 2:12 PMDeactivated User
01/22/2021, 2:14 PMMayank
01/22/2021, 2:31 PMDeactivated User
01/22/2021, 2:37 PMMayank
01/22/2021, 2:43 PMDeactivated User
01/22/2021, 2:43 PMIndex: klogger/src/commonMain/kotlin/com/soywiz/klogger/atomic/KloggerAtomicRef.kt
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/klogger/src/commonMain/kotlin/com/soywiz/klogger/atomic/KloggerAtomicRef.kt b/klogger/src/commonMain/kotlin/com/soywiz/klogger/atomic/KloggerAtomicRef.kt
--- a/klogger/src/commonMain/kotlin/com/soywiz/klogger/atomic/KloggerAtomicRef.kt (revision 41dd275d03f5e89e7a8792d415e26fbf5833b194)
+++ b/klogger/src/commonMain/kotlin/com/soywiz/klogger/atomic/KloggerAtomicRef.kt (date 1611326398353)
@@ -2,19 +2,17 @@
import kotlin.reflect.KProperty
-abstract class KloggerAtomicRef<T> {
- abstract var value: T
-
- inline fun update(func: (T) -> T) {
- value = func(value)
- }
- operator fun setValue(receiver: Any?, prop: KProperty<*>, newValue: T) {
- value = newValue
- }
- operator fun getValue(receiver: Any?, prop: KProperty<*>): T {
- return value
- }
+expect class KloggerAtomicRef<T>(initial: T) {
+ val value: T
+ inline fun update(block: (T) -> T)
+}
+
+operator fun <T> KloggerAtomicRef<T>.setValue(receiver: Any?, prop: KProperty<*>, newValue: T) {
+ update { newValue }
+}
+operator fun <T> KloggerAtomicRef<T>.getValue(receiver: Any?, prop: KProperty<*>): T {
+ return value
}
-expect fun <T> kloggerAtomicRef(initial: T): KloggerAtomicRef<T>
-
+//expect fun <T> kloggerAtomicRef(initial: T): KloggerAtomicRef<T>
+fun <T> kloggerAtomicRef(initial: T): KloggerAtomicRef<T> = KloggerAtomicRef(initial)
Index: klogger/src/nativeCommonMain/kotlin/com/soywiz/klogger/atomic/KloggerAtomicRefNative.kt
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/klogger/src/nativeCommonMain/kotlin/com/soywiz/klogger/atomic/KloggerAtomicRefNative.kt b/klogger/src/nativeCommonMain/kotlin/com/soywiz/klogger/atomic/KloggerAtomicRefNative.kt
--- a/klogger/src/nativeCommonMain/kotlin/com/soywiz/klogger/atomic/KloggerAtomicRefNative.kt (revision 41dd275d03f5e89e7a8792d415e26fbf5833b194)
+++ b/klogger/src/nativeCommonMain/kotlin/com/soywiz/klogger/atomic/KloggerAtomicRefNative.kt (date 1611326398355)
@@ -2,10 +2,16 @@
import kotlin.native.concurrent.*
-actual fun <T> kloggerAtomicRef(initial: T): KloggerAtomicRef<T> = object : KloggerAtomicRef<T>() {
- private val ref = FreezableAtomicReference<T>(initial.freeze())
+actual class KloggerAtomicRef<T> actual constructor(initial: T) {
+ @PublishedApi
+ internal val ref = FreezableAtomicReference<T>(initial.freeze())
- override var value: T
- get() = ref.value
- set(value) { ref.value = value.freeze() }
+ actual val value: T get() = ref.value
+ actual inline fun update(block: (T) -> T) {
+ //synchronized(ref) { ref.set(ref.get()) }
+ do {
+ val old = ref.value
+ val new = block(old).freeze()
+ } while (!ref.compareAndSet(old, new))
+ }
}
Index: klogger/src/commonMain/kotlin/com/soywiz/klogger/Logger.kt
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/klogger/src/commonMain/kotlin/com/soywiz/klogger/Logger.kt b/klogger/src/commonMain/kotlin/com/soywiz/klogger/Logger.kt
--- a/klogger/src/commonMain/kotlin/com/soywiz/klogger/Logger.kt (revision 41dd275d03f5e89e7a8792d415e26fbf5833b194)
+++ b/klogger/src/commonMain/kotlin/com/soywiz/klogger/Logger.kt (date 1611326398353)
@@ -125,6 +125,6 @@
private inline operator fun <K, V> AtomicMap<K, V>.get(key: K) = value[key]
private inline operator fun <K, V> AtomicMap<K, V>.set(key: K, value: V) {
- this.value = HashMap(this.value).also { it[key] = value }
+ this.update { HashMap(it).also { nmap -> nmap[key] = value } }
}
Index: klogger/src/jsMain/kotlin/com/soywiz/klogger/atomic/KloggerAtomicRefJs.kt
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/klogger/src/jsMain/kotlin/com/soywiz/klogger/atomic/KloggerAtomicRefJs.kt b/klogger/src/jsMain/kotlin/com/soywiz/klogger/atomic/KloggerAtomicRefJs.kt
--- a/klogger/src/jsMain/kotlin/com/soywiz/klogger/atomic/KloggerAtomicRefJs.kt (revision 41dd275d03f5e89e7a8792d415e26fbf5833b194)
+++ b/klogger/src/jsMain/kotlin/com/soywiz/klogger/atomic/KloggerAtomicRefJs.kt (date 1611326398354)
@@ -1,5 +1,11 @@
package com.soywiz.klogger.atomic
-actual fun <T> kloggerAtomicRef(initial: T): KloggerAtomicRef<T> = object : KloggerAtomicRef<T>() {
- override var value: T = initial
+actual class KloggerAtomicRef<T> actual constructor(initial: T) {
+ @PublishedApi
+ internal var _value: T = initial
+ actual val value: T get() = _value
+ actual inline fun update(block: (T) -> T) {
+ _value = block(_value)
+ }
}
+
Index: klogger/src/jvmAndroidMain/kotlin/com/soywiz/klogger/atomic/KloggerAtomicRefJvm.kt
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/klogger/src/jvmAndroidMain/kotlin/com/soywiz/klogger/atomic/KloggerAtomicRefJvm.kt b/klogger/src/jvmAndroidMain/kotlin/com/soywiz/klogger/atomic/KloggerAtomicRefJvm.kt
--- a/klogger/src/jvmAndroidMain/kotlin/com/soywiz/klogger/atomic/KloggerAtomicRefJvm.kt (revision 41dd275d03f5e89e7a8792d415e26fbf5833b194)
+++ b/klogger/src/jvmAndroidMain/kotlin/com/soywiz/klogger/atomic/KloggerAtomicRefJvm.kt (date 1611326398354)
@@ -2,9 +2,16 @@
import java.util.concurrent.atomic.AtomicReference
-actual fun <T> kloggerAtomicRef(initial: T): KloggerAtomicRef<T> = object : KloggerAtomicRef<T>() {
- private val ref = AtomicReference<T>(initial)
- override var value: T
- get() = ref.get()
- set(value) { ref.set(value) }
+actual class KloggerAtomicRef<T> actual constructor(initial: T) {
+ @PublishedApi
+ internal val ref = AtomicReference<T>(initial)
+
+ actual val value: T get() = ref.get()
+ actual inline fun update(block: (T) -> T) {
+ //synchronized(ref) { ref.set(ref.get()) }
+ do {
+ val old = ref.get()
+ val new = block(old)
+ } while (!ref.compareAndSet(old, new))
+ }
}
Mayank
01/22/2021, 2:50 PMDeactivated User
01/22/2021, 2:53 PMMayank
01/22/2021, 2:56 PMDeactivated User
01/22/2021, 2:57 PMMayank
01/22/2021, 3:00 PMDeactivated User
01/22/2021, 3:00 PMMayank
01/22/2021, 6:58 PMkloggerAtomicRef
fun had expect implementation but it is commented so I was wondering if it is required anymore. We can instead directly use the class instead of a functionDeactivated User
01/22/2021, 7:55 PMMayank
01/22/2021, 8:40 PM