1
- use std:: sync:: atomic:: { AtomicBool , AtomicUsize , Ordering } ;
1
+ use std:: sync:: atomic:: { AtomicUsize , Ordering } ;
2
2
use std:: sync:: Mutex ;
3
3
4
4
use crate :: current_num_threads;
@@ -77,13 +77,11 @@ where
77
77
{
78
78
let split_count = AtomicUsize :: new ( current_num_threads ( ) ) ;
79
79
80
- let done = AtomicBool :: new ( false ) ;
81
80
let iter = Mutex :: new ( self . iter . fuse ( ) ) ;
82
81
83
82
bridge_unindexed (
84
83
IterParallelProducer {
85
84
split_count : & split_count,
86
- done : & done,
87
85
iter : & iter,
88
86
} ,
89
87
consumer,
93
91
94
92
struct IterParallelProducer < ' a , Iter : Iterator > {
95
93
split_count : & ' a AtomicUsize ,
96
- done : & ' a AtomicBool ,
97
94
iter : & ' a Mutex < std:: iter:: Fuse < Iter > > ,
98
95
}
99
96
@@ -102,7 +99,6 @@ impl<'a, Iter: Iterator + 'a> Clone for IterParallelProducer<'a, Iter> {
102
99
fn clone ( & self ) -> Self {
103
100
IterParallelProducer {
104
101
split_count : self . split_count ,
105
- done : self . done ,
106
102
iter : self . iter ,
107
103
}
108
104
}
@@ -119,22 +115,18 @@ where
119
115
120
116
loop {
121
117
// Check if the iterator is exhausted
122
- let done = self . done . load ( Ordering :: SeqCst ) ;
123
- match count. checked_sub ( 1 ) {
124
- Some ( new_count) if !done => {
125
- match self . split_count . compare_exchange_weak (
126
- count,
127
- new_count,
128
- Ordering :: SeqCst ,
129
- Ordering :: SeqCst ,
130
- ) {
131
- Ok ( _) => return ( self . clone ( ) , Some ( self ) ) ,
132
- Err ( last_count) => count = last_count,
133
- }
134
- }
135
- _ => {
136
- return ( self , None ) ;
118
+ if let Some ( new_count) = count. checked_sub ( 1 ) {
119
+ match self . split_count . compare_exchange_weak (
120
+ count,
121
+ new_count,
122
+ Ordering :: SeqCst ,
123
+ Ordering :: SeqCst ,
124
+ ) {
125
+ Ok ( _) => return ( self . clone ( ) , Some ( self ) ) ,
126
+ Err ( last_count) => count = last_count,
137
127
}
128
+ } else {
129
+ return ( self , None ) ;
138
130
}
139
131
}
140
132
}
@@ -152,13 +144,11 @@ where
152
144
return folder;
153
145
}
154
146
} else {
155
- self . done . store ( true , Ordering :: SeqCst ) ;
156
147
return folder;
157
148
}
158
149
} else {
159
150
// any panics from other threads will have been caught by the pool,
160
151
// and will be re-thrown when joined - just exit
161
- self . done . store ( true , Ordering :: SeqCst ) ;
162
152
return folder;
163
153
}
164
154
}
0 commit comments