Made LockFreeLinkedList internal
diff --git a/kotlinx-coroutines-core/src/main/kotlin/kotlinx/coroutines/experimental/Job.kt b/kotlinx-coroutines-core/src/main/kotlin/kotlinx/coroutines/experimental/Job.kt
index fc89287..e8851d6 100644
--- a/kotlinx-coroutines-core/src/main/kotlin/kotlinx/coroutines/experimental/Job.kt
+++ b/kotlinx-coroutines-core/src/main/kotlin/kotlinx/coroutines/experimental/Job.kt
@@ -1,7 +1,7 @@
package kotlinx.coroutines.experimental
-import kotlinx.coroutines.experimental.util.LockFreeLinkedListHead
-import kotlinx.coroutines.experimental.util.LockFreeLinkedListNode
+import kotlinx.coroutines.experimental.internal.LockFreeLinkedListHead
+import kotlinx.coroutines.experimental.internal.LockFreeLinkedListNode
import java.util.concurrent.CancellationException
import java.util.concurrent.Future
import java.util.concurrent.atomic.AtomicReferenceFieldUpdater
@@ -120,7 +120,7 @@
) : AbstractCoroutineContextElement(Job), Job {
// keeps a stack of cancel listeners or a special CANCELLED, other values denote completed scope
@Volatile
- private var state: Any? = Active() // will drop the list on cancel
+ private var state: Any? = ActiveList() // will drop the list on cancel
// directly pass HandlerNode to parent scope to optimize one closure object (see makeNode)
private val registration: Job.Registration? = parent?.onCompletion(CancelOnCompletion(parent, this))
@@ -134,7 +134,7 @@
protected fun getState(): Any? = state
protected fun updateState(expect: Any, update: Any?): Boolean {
- expect as Active // assert type
+ expect as ActiveList // assert type
require(update !is Active) // only active -> inactive transition is allowed
if (!STATE.compareAndSet(this, expect, update)) return false
// #1. Unregister from parent job
@@ -169,6 +169,7 @@
return EmptyRegistration
}
val node = nodeCache ?: makeNode(handler).apply { nodeCache = this }
+ state as ActiveList // assert type
if (state.addLastIf(node) { this.state == state }) return node
}
}
@@ -188,7 +189,9 @@
(handler as? JobNode)?.also { require(it.job === this) }
?: InvokeOnCompletion(this, handler)
- protected class Active : LockFreeLinkedListHead()
+ protected interface Active
+
+ private class ActiveList : LockFreeLinkedListHead(), Active
protected abstract class CompletedExceptionally {
abstract val cancelReason: Throwable?
diff --git a/kotlinx-coroutines-core/src/main/kotlin/kotlinx/coroutines/experimental/util/LockFreeLinkedList.kt b/kotlinx-coroutines-core/src/main/kotlin/kotlinx/coroutines/experimental/internal/LockFreeLinkedList.kt
similarity index 98%
rename from kotlinx-coroutines-core/src/main/kotlin/kotlinx/coroutines/experimental/util/LockFreeLinkedList.kt
rename to kotlinx-coroutines-core/src/main/kotlin/kotlinx/coroutines/experimental/internal/LockFreeLinkedList.kt
index fb8e531..6fed21e 100644
--- a/kotlinx-coroutines-core/src/main/kotlin/kotlinx/coroutines/experimental/util/LockFreeLinkedList.kt
+++ b/kotlinx-coroutines-core/src/main/kotlin/kotlinx/coroutines/experimental/internal/LockFreeLinkedList.kt
@@ -1,4 +1,4 @@
-package kotlinx.coroutines.experimental.util
+package kotlinx.coroutines.experimental.internal
import java.util.concurrent.atomic.AtomicIntegerFieldUpdater
import java.util.concurrent.atomic.AtomicReferenceFieldUpdater
@@ -14,7 +14,7 @@
* Sentinel node should be never removed.
*/
@Suppress("LeakingThis")
-public open class LockFreeLinkedListNode {
+internal open class LockFreeLinkedListNode {
@Volatile
private var _next: Any = this // DoubleLinkedNode | Removed | CondAdd
@Volatile
@@ -241,7 +241,7 @@
}
}
-public open class LockFreeLinkedListHead : LockFreeLinkedListNode() {
+internal open class LockFreeLinkedListHead : LockFreeLinkedListNode() {
/**
* Iterates over all elements in this list of a specified type.
*/
diff --git a/kotlinx-coroutines-core/src/test/kotlin/kotlinx/coroutines/experimental/util/LockFreeLinkedListStressTest.kt b/kotlinx-coroutines-core/src/test/kotlin/kotlinx/coroutines/experimental/internal/LockFreeLinkedListStressTest.kt
similarity index 92%
rename from kotlinx-coroutines-core/src/test/kotlin/kotlinx/coroutines/experimental/util/LockFreeLinkedListStressTest.kt
rename to kotlinx-coroutines-core/src/test/kotlin/kotlinx/coroutines/experimental/internal/LockFreeLinkedListStressTest.kt
index 9b28381..9aeabd3 100644
--- a/kotlinx-coroutines-core/src/test/kotlin/kotlinx/coroutines/experimental/util/LockFreeLinkedListStressTest.kt
+++ b/kotlinx-coroutines-core/src/test/kotlin/kotlinx/coroutines/experimental/internal/LockFreeLinkedListStressTest.kt
@@ -1,4 +1,4 @@
-package kotlinx.coroutines.experimental.util
+package kotlinx.coroutines.experimental.internal
import org.junit.Test
import java.util.*
@@ -6,9 +6,8 @@
import kotlin.concurrent.thread
class LockFreeLinkedListStressTest {
- data class IntNode(val i: Int) : LockFreeLinkedListNode()
-
- val list = LockFreeLinkedListHead()
+ private data class IntNode(val i: Int) : LockFreeLinkedListNode()
+ private val list = LockFreeLinkedListHead()
val threads = mutableListOf<Thread>()
val nAdded = 10_000_000
diff --git a/kotlinx-coroutines-core/src/test/kotlin/kotlinx/coroutines/experimental/util/LockFreeLinkedListTest.kt b/kotlinx-coroutines-core/src/test/kotlin/kotlinx/coroutines/experimental/internal/LockFreeLinkedListTest.kt
similarity index 97%
rename from kotlinx-coroutines-core/src/test/kotlin/kotlinx/coroutines/experimental/util/LockFreeLinkedListTest.kt
rename to kotlinx-coroutines-core/src/test/kotlin/kotlinx/coroutines/experimental/internal/LockFreeLinkedListTest.kt
index e8d40df..90c8de6 100644
--- a/kotlinx-coroutines-core/src/test/kotlin/kotlinx/coroutines/experimental/util/LockFreeLinkedListTest.kt
+++ b/kotlinx-coroutines-core/src/test/kotlin/kotlinx/coroutines/experimental/internal/LockFreeLinkedListTest.kt
@@ -1,4 +1,4 @@
-package kotlinx.coroutines.experimental.util
+package kotlinx.coroutines.experimental.internal
import org.junit.Assert.*
import org.junit.Test
diff --git a/pom.xml b/pom.xml
index 06a1510..d7187c1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -174,6 +174,9 @@
</goals>
</execution>
</executions>
+ <configuration>
+ <args>-Xcoroutines=enable</args>
+ </configuration>
</plugin>
</plugins>