File tree Expand file tree Collapse file tree 1 file changed +22
-13
lines changed Expand file tree Collapse file tree 1 file changed +22
-13
lines changed Original file line number Diff line number Diff line change 11
11
use container:: Container ;
12
12
use option:: * ;
13
13
use vec:: OwnedVector ;
14
+ use unstable:: sync:: { Exclusive , exclusive} ;
15
+ use cell:: Cell ;
16
+ use kinds:: Owned ;
14
17
15
18
pub struct WorkQueue < T > {
16
- priv queue : ~[ T ]
19
+ // XXX: Another mystery bug fixed by boxing this lock
20
+ priv queue : ~Exclusive < ~[ T ] >
17
21
}
18
22
19
- pub impl < T > WorkQueue < T > {
23
+ pub impl < T : Owned > WorkQueue < T > {
20
24
fn new ( ) -> WorkQueue < T > {
21
25
WorkQueue {
22
- queue : ~[ ]
26
+ queue : ~exclusive ( ~ [ ] )
23
27
}
24
28
}
25
29
26
30
fn push ( & mut self , value : T ) {
27
- self . queue . unshift ( value)
31
+ let value = Cell ( value) ;
32
+ self . queue . with ( |q| q. unshift ( value. take ( ) ) ) ;
28
33
}
29
34
30
35
fn pop ( & mut self ) -> Option < T > {
31
- if !self . queue . is_empty ( ) {
32
- Some ( self . queue . shift ( ) )
33
- } else {
34
- None
36
+ do self . queue . with |q| {
37
+ if !q. is_empty ( ) {
38
+ Some ( q. shift ( ) )
39
+ } else {
40
+ None
41
+ }
35
42
}
36
43
}
37
44
38
45
fn steal ( & mut self ) -> Option < T > {
39
- if !self . queue . is_empty ( ) {
40
- Some ( self . queue . pop ( ) )
41
- } else {
42
- None
46
+ do self . queue . with |q| {
47
+ if !q. is_empty ( ) {
48
+ Some ( q. pop ( ) )
49
+ } else {
50
+ None
51
+ }
43
52
}
44
53
}
45
54
46
55
fn is_empty ( & self ) -> bool {
47
- return self . queue . is_empty ( ) ;
56
+ self . queue . with_imm ( |q| q . is_empty ( ) )
48
57
}
49
58
}
You can’t perform that action at this time.
0 commit comments