4
4
5
5
package kotlinx.coroutines.experimental.internal
6
6
7
+ import kotlinx.coroutines.experimental.*
7
8
import java.util.*
8
9
9
10
/* *
@@ -26,42 +27,48 @@ public class ThreadSafeHeap<T> : SynchronizedObject() where T: ThreadSafeHeapNod
26
27
27
28
public val isEmpty: Boolean get() = size == 0
28
29
29
- public fun clear () = synchronized(this ) {
30
+ @Synchronized
31
+ public fun clear () {
30
32
Arrays .fill(a, 0 , size, null )
31
33
size = 0
32
34
}
33
35
34
- public fun peek (): T ? = synchronized(this ) { firstImpl() }
36
+ @Synchronized
37
+ public fun peek (): T ? = firstImpl()
35
38
36
- public fun removeFirstOrNull (): T ? = synchronized(this ) {
39
+ @Synchronized
40
+ public fun removeFirstOrNull (): T ? =
37
41
if (size > 0 ) {
38
42
removeAtImpl(0 )
39
- } else
43
+ } else {
40
44
null
41
- }
45
+ }
42
46
43
- public inline fun removeFirstIf (predicate : (T ) -> Boolean ): T ? = synchronized(this ) {
44
- val first = firstImpl() ? : return @synchronized null
45
- if (predicate(first)) {
47
+ @Synchronized
48
+ public inline fun removeFirstIf (predicate : (T ) -> Boolean ): T ? {
49
+ val first = firstImpl() ? : return null
50
+ return if (predicate(first)) {
46
51
removeAtImpl(0 )
47
- } else
52
+ } else {
48
53
null
54
+ }
49
55
}
50
56
51
- public fun addLast (node : T ) = synchronized(this ) {
52
- addImpl(node)
53
- }
57
+ @Synchronized
58
+ public fun addLast (node : T ) = addImpl(node)
54
59
55
- public fun addLastIf (node : T , cond : () -> Boolean ): Boolean = synchronized(this ) {
60
+ @Synchronized
61
+ public fun addLastIf (node : T , cond : () -> Boolean ): Boolean =
56
62
if (cond()) {
57
63
addImpl(node)
58
64
true
59
- } else
65
+ } else {
60
66
false
61
- }
67
+ }
62
68
63
- public fun remove (node : T ): Boolean = synchronized(this ) {
64
- if (node.index < 0 ) {
69
+ @Synchronized
70
+ public fun remove (node : T ): Boolean {
71
+ return if (node.index < 0 ) {
65
72
false
66
73
} else {
67
74
removeAtImpl(node.index)
@@ -95,6 +102,11 @@ public class ThreadSafeHeap<T> : SynchronizedObject() where T: ThreadSafeHeapNod
95
102
96
103
@PublishedApi
97
104
internal fun addImpl (node : T ) {
105
+ // TODO remove this after #541 when ThreadSafeHeapNode is gone
106
+ if (node is EventLoopBase .DelayedTask && node.state == REMOVED ) {
107
+ return
108
+ }
109
+
98
110
val a = realloc()
99
111
val i = size++
100
112
a[i] = node
@@ -140,4 +152,4 @@ public class ThreadSafeHeap<T> : SynchronizedObject() where T: ThreadSafeHeapNod
140
152
ni.index = i
141
153
nj.index = j
142
154
}
143
- }
155
+ }
0 commit comments