@@ -10,20 +10,16 @@ import scala.Option
1010import scala .concurrent .duration ._
1111import LibUV ._ , LibUVConstants ._
1212
13- object Timer extends LoopExtension {
14- EventLoop .addExtension(this )
13+ object Timer {
1514
1615 var serial = 0L
17- var timers = mutable.HashMap [Long ,Promise [Unit ]]()
18-
19- override def activeRequests (): Int =
20- timers.size
16+ var callbacks = mutable.HashMap [Long ,() => Unit ]()
2117
2218 def delay (dur: Duration ): Future [Unit ] = {
2319 val promise = Promise [Unit ]()
2420 serial += 1
2521 val timer_id = serial
26- timers (timer_id) = promise
22+ callbacks (timer_id) = () => promise.success(())
2723 val millis = dur.toMillis
2824
2925 val timer_handle = stdlib.malloc(uv_handle_size(UV_TIMER_T ))
@@ -37,13 +33,46 @@ object Timer extends LoopExtension {
3733
3834 val timerCB = new TimerCB {
3935 def apply (handle: TimerHandle ): Unit = {
40- println(" callback fired!" )
4136 val timer_data = handle.asInstanceOf [Ptr [Long ]]
4237 val timer_id = ! timer_data
43- val timer_promise = timers(timer_id)
44- timers.remove(timer_id)
45- println(s " completing promise ${timer_id}" )
46- timer_promise.success(())
38+ val callback = callbacks(timer_id)
39+ callbacks.remove(timer_id)
40+ callback()
41+ stdlib.free(handle)
42+ }
43+ }
44+
45+ // low-level, intended for use in scala.js compat layer - leaks memory if
46+ // caller does not free() returned handle
47+ def oneTime (dur: Double , callback : () => Unit ): PrepareHandle = {
48+ serial += 1
49+ val timer_id = serial
50+
51+ val timer_handle = stdlib.malloc(uv_handle_size(UV_TIMER_T ))
52+ uv_timer_init(EventLoop .loop,timer_handle)
53+ val timer_data = timer_handle.asInstanceOf [Ptr [Long ]]
54+ ! timer_data = timer_id
55+
56+ callbacks(timer_id) = () => {
57+ callback()
4758 }
59+
60+ uv_timer_start(timer_handle, timerCB, dur.toLong, 0 )
61+ timer_handle
62+ }
63+
64+ // low-level, intended for use in scala.js compat layer - leaks memory if
65+ // caller does not free() returned handle
66+ def repeat (dur: Double , callback : () => Unit ): PrepareHandle = {
67+ serial += 1
68+ val timer_id = serial
69+
70+ callbacks(timer_id) = () => callback()
71+ val timer_handle = stdlib.malloc(uv_handle_size(UV_TIMER_T ))
72+ uv_timer_init(EventLoop .loop,timer_handle)
73+ val timer_data = timer_handle.asInstanceOf [Ptr [Long ]]
74+ ! timer_data = timer_id
75+ uv_timer_start(timer_handle, timerCB, dur.toLong, dur.toLong)
76+ timer_handle
4877 }
4978}
0 commit comments