@@ -20,7 +20,7 @@ use std::sync::atomics;
2020use std:: mem;
2121use std:: rt:: rtio:: { EventLoop , IoFactory , RemoteCallback } ;
2222use std:: rt:: rtio:: { PausableIdleCallback , Callback } ;
23- use std:: unstable :: sync :: Exclusive ;
23+ use std:: rt :: exclusive :: Exclusive ;
2424
2525/// This is the only exported function from this module.
2626pub fn event_loop ( ) -> Box < EventLoop : Send > {
@@ -31,7 +31,7 @@ struct BasicLoop {
3131 work : Vec < proc ( ) : Send > , // pending work
3232 remotes : Vec < ( uint , Box < Callback : Send > ) > ,
3333 next_remote : uint ,
34- messages : Exclusive < Vec < Message > > ,
34+ messages : Arc < Exclusive < Vec < Message > > > ,
3535 idle : Option < Box < Callback : Send > > ,
3636 idle_active : Option < Arc < atomics:: AtomicBool > > ,
3737}
@@ -46,7 +46,7 @@ impl BasicLoop {
4646 idle_active : None ,
4747 next_remote : 0 ,
4848 remotes : vec ! [ ] ,
49- messages : Exclusive :: new ( vec ! [ ] ) ,
49+ messages : Arc :: new ( Exclusive :: new ( Vec :: new ( ) ) ) ,
5050 }
5151 }
5252
@@ -61,19 +61,10 @@ impl BasicLoop {
6161
6262 fn remote_work ( & mut self ) {
6363 let messages = unsafe {
64- self . messages . with ( |messages| {
65- if messages. len ( ) > 0 {
66- Some ( mem:: replace ( messages, vec ! [ ] ) )
67- } else {
68- None
69- }
70- } )
71- } ;
72- let messages = match messages {
73- Some ( m) => m, None => return
64+ mem:: replace ( & mut * self . messages . lock ( ) , Vec :: new ( ) )
7465 } ;
75- for message in messages. iter ( ) {
76- self . message ( * message) ;
66+ for message in messages. move_iter ( ) {
67+ self . message ( message) ;
7768 }
7869 }
7970
@@ -125,13 +116,13 @@ impl EventLoop for BasicLoop {
125116 }
126117
127118 unsafe {
119+ let mut messages = self . messages . lock ( ) ;
128120 // We block here if we have no messages to process and we may
129121 // receive a message at a later date
130- self . messages . hold_and_wait ( |messages| {
131- self . remotes . len ( ) > 0 &&
132- messages. len ( ) == 0 &&
133- self . work . len ( ) == 0
134- } )
122+ if self . remotes . len ( ) > 0 && messages. len ( ) == 0 &&
123+ self . work . len ( ) == 0 {
124+ messages. wait ( )
125+ }
135126 }
136127 }
137128 }
@@ -165,33 +156,29 @@ impl EventLoop for BasicLoop {
165156}
166157
167158struct BasicRemote {
168- queue : Exclusive < Vec < Message > > ,
159+ queue : Arc < Exclusive < Vec < Message > > > ,
169160 id : uint ,
170161}
171162
172163impl BasicRemote {
173- fn new ( queue : Exclusive < Vec < Message > > , id : uint ) -> BasicRemote {
164+ fn new ( queue : Arc < Exclusive < Vec < Message > > > , id : uint ) -> BasicRemote {
174165 BasicRemote { queue : queue, id : id }
175166 }
176167}
177168
178169impl RemoteCallback for BasicRemote {
179170 fn fire ( & mut self ) {
180- unsafe {
181- self . queue . hold_and_signal ( |queue| {
182- queue. push ( RunRemote ( self . id ) ) ;
183- } )
184- }
171+ let mut queue = unsafe { self . queue . lock ( ) } ;
172+ queue. push ( RunRemote ( self . id ) ) ;
173+ queue. signal ( ) ;
185174 }
186175}
187176
188177impl Drop for BasicRemote {
189178 fn drop ( & mut self ) {
190- unsafe {
191- self . queue . hold_and_signal ( |queue| {
192- queue. push ( RemoveRemote ( self . id ) ) ;
193- } )
194- }
179+ let mut queue = unsafe { self . queue . lock ( ) } ;
180+ queue. push ( RemoveRemote ( self . id ) ) ;
181+ queue. signal ( ) ;
195182 }
196183}
197184
@@ -216,7 +203,7 @@ impl Drop for BasicPausable {
216203
217204#[ cfg( test) ]
218205mod test {
219- use std:: task:: TaskOpts ;
206+ use std:: rt :: task:: TaskOpts ;
220207
221208 use basic;
222209 use PoolConfig ;
0 commit comments