1
1
package scala .scalanative .loop
2
2
package internals
3
3
4
+ import scala .scalanative .runtime ._
4
5
import scala .scalanative .runtime .Intrinsics ._
5
6
import scala .scalanative .unsafe .Ptr
6
7
import scala .scalanative .libc .stdlib
7
8
import scala .collection .mutable
8
9
import LibUV ._
9
10
10
11
private [loop] object HandleUtils {
11
- private val references = mutable.Map .empty[Long , Int ]
12
+ private val references = mutable.Map .empty[Object , Int ]
12
13
13
14
@ inline def getData [T <: Object ](handle : Ptr [Byte ]): T = {
14
- val data = LibUV .uv_handle_get_data(handle)
15
- val rawptr = castLongToRawPtr(data)
15
+ // data is the first member of uv_loop_t
16
+ val ptrOfPtr = handle.asInstanceOf [Ptr [Ptr [Byte ]]]
17
+ val rawptr = toRawPtr(! ptrOfPtr)
16
18
castRawPtrToObject(rawptr).asInstanceOf [T ]
17
19
}
18
- @ inline def setData [T <: Object ](handle : Ptr [Byte ], function : T ): Unit = {
19
- val rawptr = castObjectToRawPtr(function)
20
- val data = castRawPtrToLong(rawptr)
21
- if (references.contains(data)) references(data) += 1
22
- else references(data) = 1
23
- LibUV .uv_handle_set_data(handle, data)
20
+ @ inline def setData (handle : Ptr [Byte ], obj : Object ): Unit = {
21
+ if (references.contains(obj)) references(obj) += 1
22
+ else references(obj) = 1
23
+
24
+ // data is the first member of uv_loop_t
25
+ val ptrOfPtr = handle.asInstanceOf [Ptr [Ptr [Byte ]]]
26
+ val rawptr = castObjectToRawPtr(obj)
27
+ ! ptrOfPtr = fromRawPtr[Byte ](rawptr)
24
28
}
25
29
private val onCloseCB = new CloseCB {
26
30
def apply (handle : UVHandle ): Unit = {
@@ -29,7 +33,7 @@ private[loop] object HandleUtils {
29
33
}
30
34
@ inline def close (handle : Ptr [Byte ]): Unit = {
31
35
uv_close(handle, onCloseCB)
32
- val data = LibUV .uv_handle_get_data (handle)
36
+ val data = getData[ Object ] (handle)
33
37
val current = references(data)
34
38
if (current > 1 ) references(data) -= 1
35
39
else references.remove(data)
0 commit comments