@@ -19,11 +19,11 @@ pub struct IdleWatcher {
19
19
handle : * uvll:: uv_idle_t ,
20
20
idle_flag : bool ,
21
21
closed : bool ,
22
- callback : Option < ~Callback > ,
22
+ callback : ~Callback ,
23
23
}
24
24
25
25
impl IdleWatcher {
26
- pub fn new ( loop_ : & mut Loop ) -> ~IdleWatcher {
26
+ pub fn new ( loop_ : & mut Loop , cb : ~ Callback ) -> ~IdleWatcher {
27
27
let handle = UvHandle :: alloc ( None :: < IdleWatcher > , uvll:: UV_IDLE ) ;
28
28
assert_eq ! ( unsafe {
29
29
uvll:: uv_idle_init( loop_. handle, handle)
@@ -32,7 +32,7 @@ impl IdleWatcher {
32
32
handle : handle,
33
33
idle_flag : false ,
34
34
closed : false ,
35
- callback : None ,
35
+ callback : cb ,
36
36
} ;
37
37
return me. install ( ) ;
38
38
}
@@ -64,12 +64,6 @@ impl IdleWatcher {
64
64
}
65
65
66
66
impl PausibleIdleCallback for IdleWatcher {
67
- fn start ( & mut self , cb : ~Callback ) {
68
- assert ! ( self . callback. is_none( ) ) ;
69
- self . callback = Some ( cb) ;
70
- assert_eq ! ( unsafe { uvll:: uv_idle_start( self . handle, idle_cb) } , 0 )
71
- self . idle_flag = true ;
72
- }
73
67
fn pause ( & mut self ) {
74
68
if self . idle_flag == true {
75
69
assert_eq ! ( unsafe { uvll:: uv_idle_stop( self . handle) } , 0 ) ;
@@ -82,84 +76,93 @@ impl PausibleIdleCallback for IdleWatcher {
82
76
self . idle_flag = true ;
83
77
}
84
78
}
85
- fn close ( & mut self ) {
86
- self . pause ( ) ;
87
- if !self . closed {
88
- self . closed = true ;
89
- self . close_async_ ( ) ;
90
- }
91
- }
92
79
}
93
80
94
81
impl UvHandle < uvll:: uv_idle_t > for IdleWatcher {
95
82
fn uv_handle ( & self ) -> * uvll:: uv_idle_t { self . handle }
96
83
}
97
84
98
85
extern fn idle_cb ( handle : * uvll:: uv_idle_t , status : c_int ) {
86
+ if status == uvll:: ECANCELED { return }
99
87
assert_eq ! ( status, 0 ) ;
100
88
let idle: & mut IdleWatcher = unsafe { UvHandle :: from_uv_handle ( & handle) } ;
101
- assert ! ( idle. callback. is_some( ) ) ;
102
- idle. callback . get_mut_ref ( ) . call ( ) ;
89
+ idle. callback . call ( ) ;
90
+ }
91
+
92
+ impl Drop for IdleWatcher {
93
+ fn drop ( & mut self ) {
94
+ self . pause ( ) ;
95
+ self . close_async_ ( ) ;
96
+ }
103
97
}
104
98
105
99
#[ cfg( test) ]
106
100
mod test {
107
-
108
- use Loop ;
109
101
use super :: * ;
110
- use std:: unstable:: run_in_bare_thread;
102
+ use std:: rt:: tube:: Tube ;
103
+ use std:: rt:: rtio:: { Callback , PausibleIdleCallback } ;
104
+ use super :: super :: run_uv_loop;
105
+
106
+ struct MyCallback ( Tube < int > , int ) ;
107
+ impl Callback for MyCallback {
108
+ fn call ( & mut self ) {
109
+ match * self {
110
+ MyCallback ( ref mut tube, val) => tube. send ( val)
111
+ }
112
+ }
113
+ }
111
114
112
115
#[ test]
113
- #[ ignore( reason = "valgrind - loop destroyed before watcher?" ) ]
114
- fn idle_new_then_close ( ) {
115
- do run_in_bare_thread {
116
- let mut loop_ = Loop :: new ( ) ;
117
- let idle_watcher = { IdleWatcher :: new ( & mut loop_) } ;
118
- idle_watcher. close ( ||( ) ) ;
116
+ fn not_used ( ) {
117
+ do run_uv_loop |l| {
118
+ let cb = ~MyCallback ( Tube :: new ( ) , 1 ) ;
119
+ let _idle = IdleWatcher :: new ( l, cb as ~Callback ) ;
119
120
}
120
121
}
121
122
122
123
#[ test]
123
- fn idle_smoke_test ( ) {
124
- do run_in_bare_thread {
125
- let mut loop_ = Loop :: new ( ) ;
126
- let mut idle_watcher = { IdleWatcher :: new ( & mut loop_) } ;
127
- let mut count = 10 ;
128
- let count_ptr: * mut int = & mut count;
129
- do idle_watcher. start |idle_watcher, status| {
130
- let mut idle_watcher = idle_watcher;
131
- assert ! ( status. is_none( ) ) ;
132
- if unsafe { * count_ptr == 10 } {
133
- idle_watcher. stop ( ) ;
134
- idle_watcher. close ( ||( ) ) ;
135
- } else {
136
- unsafe { * count_ptr = * count_ptr + 1 ; }
137
- }
138
- }
139
- loop_. run ( ) ;
140
- loop_. close ( ) ;
141
- assert_eq ! ( count, 10 ) ;
124
+ fn smoke_test ( ) {
125
+ do run_uv_loop |l| {
126
+ let mut tube = Tube :: new ( ) ;
127
+ let cb = ~MyCallback ( tube. clone ( ) , 1 ) ;
128
+ let mut idle = IdleWatcher :: new ( l, cb as ~Callback ) ;
129
+ idle. resume ( ) ;
130
+ tube. recv ( ) ;
142
131
}
143
132
}
144
133
145
134
#[ test]
146
- fn idle_start_stop_start ( ) {
147
- do run_in_bare_thread {
148
- let mut loop_ = Loop :: new ( ) ;
149
- let mut idle_watcher = { IdleWatcher :: new ( & mut loop_) } ;
150
- do idle_watcher. start |idle_watcher, status| {
151
- let mut idle_watcher = idle_watcher;
152
- assert ! ( status. is_none( ) ) ;
153
- idle_watcher. stop ( ) ;
154
- do idle_watcher. start |idle_watcher, status| {
155
- assert ! ( status. is_none( ) ) ;
156
- let mut idle_watcher = idle_watcher;
157
- idle_watcher. stop ( ) ;
158
- idle_watcher. close ( ||( ) ) ;
159
- }
160
- }
161
- loop_. run ( ) ;
162
- loop_. close ( ) ;
135
+ fn fun_combinations_of_methods ( ) {
136
+ do run_uv_loop |l| {
137
+ let mut tube = Tube :: new ( ) ;
138
+ let cb = ~MyCallback ( tube. clone ( ) , 1 ) ;
139
+ let mut idle = IdleWatcher :: new ( l, cb as ~Callback ) ;
140
+ idle. resume ( ) ;
141
+ tube. recv ( ) ;
142
+ idle. pause ( ) ;
143
+ idle. resume ( ) ;
144
+ idle. resume ( ) ;
145
+ tube. recv ( ) ;
146
+ idle. pause ( ) ;
147
+ idle. pause ( ) ;
148
+ idle. resume ( ) ;
149
+ tube. recv ( ) ;
150
+ }
151
+ }
152
+
153
+ #[ test]
154
+ fn pause_pauses ( ) {
155
+ do run_uv_loop |l| {
156
+ let mut tube = Tube :: new ( ) ;
157
+ let cb = ~MyCallback ( tube. clone ( ) , 1 ) ;
158
+ let mut idle1 = IdleWatcher :: new ( l, cb as ~Callback ) ;
159
+ let cb = ~MyCallback ( tube. clone ( ) , 2 ) ;
160
+ let mut idle2 = IdleWatcher :: new ( l, cb as ~Callback ) ;
161
+ idle2. resume ( ) ;
162
+ assert_eq ! ( tube. recv( ) , 2 ) ;
163
+ idle2. pause ( ) ;
164
+ idle1. resume ( ) ;
165
+ assert_eq ! ( tube. recv( ) , 1 ) ;
163
166
}
164
167
}
165
168
}
0 commit comments