LockFreeListLinearizabilityTest using Lincheck
diff --git a/kotlinx-coroutines-core/pom.xml b/kotlinx-coroutines-core/pom.xml
index 462a9b8..1f00939 100644
--- a/kotlinx-coroutines-core/pom.xml
+++ b/kotlinx-coroutines-core/pom.xml
@@ -33,6 +33,22 @@
         <kotlin.compiler.jdkHome>${env.JDK_16}</kotlin.compiler.jdkHome>
     </properties>
 
+    <repositories>
+        <repository>
+            <id>bintray-devexperts</id>
+            <url>https://dl.bintray.com/devexperts/Maven/</url>
+        </repository>
+    </repositories>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.devexperts.lincheck</groupId>
+            <artifactId>core</artifactId>
+            <version>1.8.1</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
     <build>
         <sourceDirectory>src/main/kotlin</sourceDirectory>
         <testSourceDirectory>src/test/kotlin</testSourceDirectory>
diff --git a/kotlinx-coroutines-core/src/test/kotlin/kotlinx/coroutines/experimental/internal/LockFreeListLinearizabilityTest.kt b/kotlinx-coroutines-core/src/test/kotlin/kotlinx/coroutines/experimental/internal/LockFreeListLinearizabilityTest.kt
new file mode 100644
index 0000000..96c3c19
--- /dev/null
+++ b/kotlinx-coroutines-core/src/test/kotlin/kotlinx/coroutines/experimental/internal/LockFreeListLinearizabilityTest.kt
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2016-2017 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package kotlinx.coroutines.experimental.internal
+
+import com.devexperts.dxlab.lincheck.LinChecker
+import com.devexperts.dxlab.lincheck.annotations.CTest
+import com.devexperts.dxlab.lincheck.annotations.Operation
+import com.devexperts.dxlab.lincheck.annotations.Param
+import com.devexperts.dxlab.lincheck.annotations.Reset
+import com.devexperts.dxlab.lincheck.generators.IntGen
+import org.junit.Test
+
+
+@CTest(iterations = 100, actorsPerThread = arrayOf("1:2", "1:2", "1:2", "1:2"))
+@Param(name = "value", gen = IntGen::class, conf = "1:3")
+class LockFreeListLinearizabilityTest {
+    class Node(val value: Int): LockFreeLinkedListNode()
+
+    lateinit var q: LockFreeLinkedListHead
+
+    @Reset
+    fun reset() {
+        q = LockFreeLinkedListHead()
+    }
+
+    @Operation
+    fun addLast(@Param(name = "value") value: Int) {
+        q.addLast(Node(value))
+    }
+
+    @Operation
+    fun addLastIfNotSame(@Param(name = "value") value: Int) {
+        q.addLastIfPrev(Node(value)) { !it.isSame(value) }
+    }
+
+    @Operation
+    fun removeFirst(): Int? {
+        val node = q.removeFirstOrNull() ?: return null
+        return (node as Node).value
+    }
+
+    @Operation
+    fun removeFirstOrPeekIfNotSame(@Param(name = "value") value: Int): Int? {
+        val node = q.removeFirstIfIsInstanceOfOrPeekIf<Node> { !it.isSame(value) } ?: return null
+        return (node as Node).value
+    }
+
+    fun Any.isSame(value: Int) = this is Node && this.value == value
+
+    @Test
+    fun testAddRemoveLinearizability() {
+        LinChecker.check(this)
+    }
+}
\ No newline at end of file