Skip to content

Commit 2701d6c

Browse files
author
Sergey Mashkov
committed
Fix ability to implement DefaultPool in common
1 parent 088ef53 commit 2701d6c

File tree

5 files changed

+41
-17
lines changed

5 files changed

+41
-17
lines changed

kotlinx-io-js/src/main/kotlin/kotlinx/io/pool/DefaultPool.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package kotlinx.io.pool
22

3-
actual abstract class DefaultPool<T : Any>(actual final override val capacity: Int) : ObjectPool<T> {
3+
actual abstract class DefaultPool<T : Any> actual constructor(actual final override val capacity: Int) : ObjectPool<T> {
44
private val instances = arrayOfNulls<Any?>(capacity)
55
private var size = 0
66

@@ -10,7 +10,7 @@ actual abstract class DefaultPool<T : Any>(actual final override val capacity: I
1010
protected actual open fun clearInstance(instance: T): T = instance
1111
protected actual open fun validateInstance(instance: T) {}
1212

13-
final override fun borrow(): T {
13+
actual final override fun borrow(): T {
1414
if (size == 0) return produceInstance()
1515
val idx = --size
1616

@@ -21,13 +21,13 @@ actual abstract class DefaultPool<T : Any>(actual final override val capacity: I
2121
return clearInstance(instance)
2222
}
2323

24-
final override fun recycle(instance: T) {
24+
actual final override fun recycle(instance: T) {
2525
validateInstance(instance)
2626
if (size == capacity) disposeInstance(instance)
2727
instances[size++] = instance
2828
}
2929

30-
final override fun dispose() {
30+
actual final override fun dispose() {
3131
for (i in 0 until size) {
3232
@Suppress("UNCHECKED_CAST")
3333
val instance = instances[i] as T
@@ -36,4 +36,4 @@ actual abstract class DefaultPool<T : Any>(actual final override val capacity: I
3636
}
3737
size = 0
3838
}
39-
}
39+
}

kotlinx-io-jvm/src/main/kotlin/kotlinx/io/pool/DefaultPool.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ private const val PROBE_COUNT = 8 // number of attempts to find a slot
99
private const val MAGIC = 2654435769.toInt() // fractional part of golden ratio
1010
private const val MAX_CAPACITY = Int.MAX_VALUE / MULTIPLIER
1111

12-
actual abstract class DefaultPool<T : Any>(actual final override val capacity: Int) : ObjectPool<T> {
12+
actual abstract class DefaultPool<T : Any> actual constructor(actual final override val capacity: Int) : ObjectPool<T> {
1313
init {
1414
require(capacity > 0) { "capacity should be positive but it is $capacity" }
1515
require(capacity <= MAX_CAPACITY) { "capacity should be less or equal to $MAX_CAPACITY but it is $capacity"}
@@ -31,15 +31,15 @@ actual abstract class DefaultPool<T : Any>(actual final override val capacity: I
3131
private val instances = AtomicReferenceArray<T?>(maxIndex + 1)
3232
private val next = IntArray(maxIndex + 1)
3333

34-
final override fun borrow(): T =
34+
actual final override fun borrow(): T =
3535
tryPop()?.let { clearInstance(it) } ?: produceInstance()
3636

37-
final override fun recycle(instance: T) {
37+
actual final override fun recycle(instance: T) {
3838
validateInstance(instance)
3939
if (!tryPush(instance)) disposeInstance(instance)
4040
}
4141

42-
final override fun dispose() {
42+
actual final override fun dispose() {
4343
while (true) {
4444
val instance = tryPop() ?: return
4545
disposeInstance(instance)
@@ -92,4 +92,4 @@ actual abstract class DefaultPool<T : Any>(actual final override val capacity: I
9292
// todo: replace with atomicfu, remove companion object
9393
private val Top = longUpdater(DefaultPool<*>::top)
9494
}
95-
}
95+
}

kotlinx-io-native/src/main/kotlin/kotlinx/io/pool/DefaultPool.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package kotlinx.io.pool
22

3-
actual abstract class DefaultPool<T : Any>(actual override final val capacity: Int) : ObjectPool<T> {
3+
actual abstract class DefaultPool<T : Any> actual constructor(actual override final val capacity: Int) : ObjectPool<T> {
44
private val instances = arrayOfNulls<Any?>(capacity)
55
private var size = 0
66

@@ -10,7 +10,7 @@ actual abstract class DefaultPool<T : Any>(actual override final val capacity: I
1010
actual protected open fun clearInstance(instance: T): T = instance
1111
actual protected open fun validateInstance(instance: T) {}
1212

13-
override final fun borrow(): T {
13+
actual final override fun borrow(): T {
1414
if (size == 0) return produceInstance()
1515
val idx = --size
1616

@@ -21,13 +21,13 @@ actual abstract class DefaultPool<T : Any>(actual override final val capacity: I
2121
return clearInstance(instance)
2222
}
2323

24-
override final fun recycle(instance: T) {
24+
actual final override fun recycle(instance: T) {
2525
validateInstance(instance)
2626
if (size == capacity) disposeInstance(instance)
2727
instances[size++] = instance
2828
}
2929

30-
override final fun dispose() {
30+
actual final override fun dispose() {
3131
for (i in 0 until size) {
3232
@Suppress("UNCHECKED_CAST")
3333
val instance = instances[i] as T
@@ -36,4 +36,4 @@ actual abstract class DefaultPool<T : Any>(actual override final val capacity: I
3636
}
3737
size = 0
3838
}
39-
}
39+
}

src/main/kotlin/kotlinx/io/pool/Pool.kt

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,9 +109,12 @@ abstract class SingleInstancePool<T : Any> : ObjectPool<T> {
109109
}
110110

111111
/**
112-
* Default object pool implementation
112+
* Default object pool implementation.
113113
*/
114-
expect abstract class DefaultPool<T : Any> : ObjectPool<T> {
114+
expect abstract class DefaultPool<T : Any>(capacity: Int) : ObjectPool<T> {
115+
/**
116+
* Pool capacity.
117+
*/
115118
final override val capacity: Int
116119

117120
/**
@@ -133,6 +136,12 @@ expect abstract class DefaultPool<T : Any> : ObjectPool<T> {
133136
* Validate [instance] of [T]. Could verify that the object has been borrowed from this pool
134137
*/
135138
protected open fun validateInstance(instance: T)
139+
140+
final override fun borrow(): T
141+
142+
final override fun recycle(instance: T)
143+
144+
final override fun dispose()
136145
}
137146

138147
/**
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package kotlinx.io.tests
2+
3+
import kotlinx.io.pool.*
4+
import kotlin.test.*
5+
6+
class DefaultPoolImplementationTest {
7+
@Test
8+
fun instantiateTest() {
9+
assertEquals(1, Impl().borrow())
10+
}
11+
12+
private class Impl : DefaultPool<Int>(10) {
13+
override fun produceInstance() = 1
14+
}
15+
}

0 commit comments

Comments
 (0)