@@ -34,24 +34,20 @@ use ptr::{mut_null, to_mut_unsafe_ptr};
34
34
use cast;
35
35
use option:: * ;
36
36
use clone:: Clone ;
37
- use default:: Default ;
38
37
use kinds:: Send ;
39
- use fmt;
40
38
41
39
struct Node < T > {
42
40
next : AtomicPtr < Node < T > > ,
43
41
value : Option < T > ,
44
42
}
45
43
46
44
impl < T > Node < T > {
47
- fn new ( value : T ) -> Node < T > {
48
- Node { next : AtomicPtr :: new ( mut_null ( ) ) , value : Some ( value ) }
45
+ fn empty ( ) -> Node < T > {
46
+ Node { next : AtomicPtr :: new ( mut_null ( ) ) , value : None }
49
47
}
50
- }
51
48
52
- impl < T > Default for Node < T > {
53
- fn default ( ) -> Node < T > {
54
- Node { next : AtomicPtr :: new ( mut_null ( ) ) , value : None }
49
+ fn with_value ( value : T ) -> Node < T > {
50
+ Node { next : AtomicPtr :: new ( mut_null ( ) ) , value : Some ( value) }
55
51
}
56
52
}
57
53
@@ -77,27 +73,23 @@ impl<T: Send> Clone for Queue<T> {
77
73
}
78
74
}
79
75
80
- impl < T : Send > fmt:: Default for Queue < T > {
81
- fn fmt ( value : & Queue < T > , f : & mut fmt:: Formatter ) {
82
- write ! ( f. buf, "Queue({})" , value. state. get( ) ) ;
83
- }
84
- }
85
-
86
76
impl < T : Send > State < T > {
87
77
pub fn new ( ) -> State < T > {
88
- let mut state = State {
78
+ State {
89
79
pad0 : [ 0 , ..64 ] ,
90
80
head : AtomicPtr :: new ( mut_null ( ) ) ,
91
81
pad1 : [ 0 , ..64 ] ,
92
- stub : Default :: default ( ) ,
82
+ stub : Node :: < T > :: empty ( ) ,
93
83
pad2 : [ 0 , ..64 ] ,
94
84
tail : mut_null ( ) ,
95
85
pad3 : [ 0 , ..64 ] ,
96
- } ;
97
- let stub = state. get_stub_unsafe ( ) ;
98
- state. head . store ( stub, Relaxed ) ;
99
- state. tail = stub;
100
- state
86
+ }
87
+ }
88
+
89
+ fn init ( & mut self ) {
90
+ let stub = self . get_stub_unsafe ( ) ;
91
+ self . head . store ( stub, Relaxed ) ;
92
+ self . tail = stub;
101
93
}
102
94
103
95
fn get_stub_unsafe ( & mut self ) -> * mut Node < T > {
@@ -106,7 +98,7 @@ impl<T: Send> State<T> {
106
98
107
99
fn push ( & mut self , value : T ) {
108
100
unsafe {
109
- let node = cast:: transmute ( ~Node :: new ( value) ) ;
101
+ let node = cast:: transmute ( ~Node :: with_value ( value) ) ;
110
102
self . push_node ( node) ;
111
103
}
112
104
}
@@ -155,7 +147,11 @@ impl<T: Send> State<T> {
155
147
156
148
impl < T : Send > Queue < T > {
157
149
pub fn new ( ) -> Queue < T > {
158
- Queue { state : UnsafeArc :: new ( State :: new ( ) ) }
150
+ unsafe {
151
+ let mut q = Queue { state : UnsafeArc :: new ( State :: new ( ) ) } ;
152
+ ( * q. state . get ( ) ) . init ( ) ;
153
+ q
154
+ }
159
155
}
160
156
161
157
pub fn push ( & mut self , value : T ) {
0 commit comments