Navigation Menu

Skip to content
This repository has been archived by the owner on Jul 8, 2022. It is now read-only.

Do not depend on atomicfu on Klogger to prevent kotlin-reflect issues on Android #126

Merged
merged 1 commit into from Jan 21, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion build.gradle.kts
Expand Up @@ -18,7 +18,7 @@ buildscript {
classpath("com.android.tools.build:gradle:4.0.1")
//classpath("com.android.tools.build:gradle:4.1.0-rc03")
//classpath("com.android.tools.build:gradle:4.2.0-alpha12")
classpath("org.jetbrains.kotlinx:atomicfu-gradle-plugin:0.15.1")
//classpath("org.jetbrains.kotlinx:atomicfu-gradle-plugin:0.15.1")
}
}

Expand Down
2 changes: 1 addition & 1 deletion klogger/build.gradle
@@ -1 +1 @@
apply plugin: 'kotlinx-atomicfu'
//apply plugin: 'kotlinx-atomicfu'
24 changes: 12 additions & 12 deletions klogger/src/commonMain/kotlin/com/soywiz/klogger/Logger.kt
@@ -1,6 +1,7 @@
package com.soywiz.klogger

import kotlinx.atomicfu.*
import com.soywiz.klogger.atomic.*
import com.soywiz.klogger.internal.*

/**
* Utility to log messages.
Expand Down Expand Up @@ -29,15 +30,15 @@ class Logger private constructor(val name: String, val dummy: Boolean) {
val isLocalOutputSet: Boolean get() = Logger_outputs[name] != null

companion object {
private val Logger_loggers: AtomicLinkedHashMap<String, Logger> = atomic(LinkedHashMap())
private val Logger_levels: AtomicLinkedHashMap<String, Level?> = atomic(LinkedHashMap())
private val Logger_outputs: AtomicLinkedHashMap<String, Output?> = atomic(LinkedHashMap())
private val Logger_loggers: AtomicMap<String, Logger> = kloggerAtomicRef(emptyMap())
private val Logger_levels: AtomicMap<String, Level?> = kloggerAtomicRef(emptyMap())
private val Logger_outputs: AtomicMap<String, Output?> = kloggerAtomicRef(emptyMap())

/** The default [Level] used for all [Logger] that doesn't have its [Logger.level] set */
var defaultLevel: Level? by atomic(null)
var defaultLevel: Level? by kloggerAtomicRef(null)

/** The default [Output] used for all [Logger] that doesn't have its [Logger.output] set */
var defaultOutput: Output by atomic(DefaultLogOutput)
var defaultOutput: Output by kloggerAtomicRef(DefaultLogOutput)

/** Gets a [Logger] from its [name] */
operator fun invoke(name: String) = Logger_loggers[name] ?: Logger(name, true)
Expand Down Expand Up @@ -120,11 +121,10 @@ fun Logger.setLevel(level: Logger.Level): Logger = this.apply { this.level = lev
/** Sets the [Logger.output] */
fun Logger.setOutput(output: Logger.Output): Logger = this.apply { this.output = output }

private typealias AtomicLinkedHashMap<K, V> = AtomicRef<LinkedHashMap<K, V>>
private typealias AtomicMap<K, V> = KloggerAtomicRef<Map<K, V>>

private inline operator fun <K, V> AtomicLinkedHashMap<K, V>.get(key: K) = value[key]
private inline operator fun <K, V> AtomicLinkedHashMap<K, V>.set(key: K, value: V) = updateMap { this[key] = value }

private inline fun <K, V> AtomicLinkedHashMap<K, V>.updateMap(updater: LinkedHashMap<K, V>.() -> Unit) =
this.update { LinkedHashMap(it).apply(updater) }
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 }
}

@@ -0,0 +1,20 @@
package com.soywiz.klogger.atomic

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 fun <T> kloggerAtomicRef(initial: T): KloggerAtomicRef<T>

Expand Up @@ -12,4 +12,4 @@ class Logger2Test {
fun test() {
mylogger.level = Logger.Level.INFO
}
}
}
@@ -1,14 +1,13 @@
package com.soywiz.klogger.test

import com.soywiz.klogger.Logger
import kotlinx.atomicfu.atomic
import kotlinx.atomicfu.update
import com.soywiz.klogger.atomic.*
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertTrue

class LoggerTest {
val out = atomic(listOf<String>())
val out = kloggerAtomicRef(listOf<String>())

@Test
fun simple() {
Expand Down
@@ -0,0 +1,5 @@
package com.soywiz.klogger.atomic

actual fun <T> kloggerAtomicRef(initial: T): KloggerAtomicRef<T> = object : KloggerAtomicRef<T>() {
override var value: T = initial
}
@@ -0,0 +1,10 @@
package com.soywiz.klogger.atomic

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) }
}

This file was deleted.

@@ -0,0 +1,11 @@
package com.soywiz.klogger.atomic

import kotlin.native.concurrent.*

actual fun <T> kloggerAtomicRef(initial: T): KloggerAtomicRef<T> = object : KloggerAtomicRef<T>() {
private val ref = FreezableAtomicReference<T>(initial.freeze())

override var value: T
get() = ref.value
set(value) { ref.value = value.freeze() }
}