@@ -2,7 +2,7 @@ use std::{
2
2
fmt, io, mem,
3
3
os:: unix:: io:: AsRawFd ,
4
4
ptr, slice,
5
- sync:: atomic:: { AtomicBool , AtomicUsize , Ordering } ,
5
+ sync:: atomic:: { AtomicBool , Ordering } ,
6
6
} ;
7
7
8
8
pub trait RingBufferData
@@ -37,17 +37,17 @@ impl AsRawFd for RingBuffer {
37
37
38
38
struct RingBufferObserver {
39
39
page_size : usize ,
40
- data : Box < [ AtomicUsize ] > ,
41
- consumer_pos : Box < AtomicUsize > ,
42
- producer_pos : Box < AtomicUsize > ,
40
+ data : Box < [ usize ] > ,
41
+ consumer_pos : Box < usize > ,
42
+ producer_pos : Box < usize > ,
43
43
epfd : i32 ,
44
44
event : [ epoll:: Event ; 1 ] ,
45
45
}
46
46
47
47
impl RingBufferObserver {
48
48
#[ allow( clippy:: len_without_is_empty) ]
49
49
fn len ( & self ) -> usize {
50
- self . data . len ( ) * mem:: size_of :: < AtomicUsize > ( )
50
+ self . data . len ( ) * mem:: size_of :: < usize > ( )
51
51
}
52
52
}
53
53
@@ -89,7 +89,7 @@ impl RingBuffer {
89
89
return Err ( io:: Error :: last_os_error ( ) ) ;
90
90
}
91
91
92
- Box :: from_raw ( p as * mut AtomicUsize )
92
+ Box :: from_raw ( p as * mut usize )
93
93
} ;
94
94
95
95
// producers page and the buffer itself,
@@ -112,12 +112,12 @@ impl RingBuffer {
112
112
return Err ( io:: Error :: last_os_error ( ) ) ;
113
113
}
114
114
115
- let length = max_length * 2 / mem:: size_of :: < AtomicUsize > ( ) ;
115
+ let length = max_length * 2 / mem:: size_of :: < usize > ( ) ;
116
116
let q = ( p as usize ) + page_size;
117
- let q = slice:: from_raw_parts_mut ( q as * mut AtomicUsize , length) ;
117
+ let q = slice:: from_raw_parts_mut ( q as * mut usize , length) ;
118
118
(
119
- Box :: from_raw ( p as * mut AtomicUsize ) ,
120
- Box :: from_raw ( q as * mut [ AtomicUsize ] ) ,
119
+ Box :: from_raw ( p as * mut usize ) ,
120
+ Box :: from_raw ( q as * mut [ usize ] ) ,
121
121
)
122
122
} ;
123
123
@@ -163,9 +163,7 @@ impl RingBuffer {
163
163
}
164
164
165
165
fn read_finish ( & mut self ) {
166
- self . observer
167
- . consumer_pos
168
- . store ( self . consumer_pos_value , Ordering :: Release ) ;
166
+ * self . observer . consumer_pos = self . consumer_pos_value ;
169
167
}
170
168
171
169
fn read_slice < D > ( & mut self ) -> Result < ( Option < D > , usize ) , Error >
@@ -176,7 +174,7 @@ impl RingBuffer {
176
174
const BUSY_BIT : usize = 1 << 31 ;
177
175
const DISCARD_BIT : usize = 1 << 30 ;
178
176
179
- let pr_pos = self . observer . producer_pos . load ( Ordering :: Acquire ) ;
177
+ let pr_pos = * self . observer . producer_pos ;
180
178
if self . consumer_pos_value < pr_pos {
181
179
// determine how far we are, how many unseen data is in the buffer
182
180
let distance = pr_pos - self . consumer_pos_value ;
@@ -194,8 +192,8 @@ impl RingBuffer {
194
192
// the first 8 bytes of the memory slice is a header (length and flags)
195
193
let ( header, data_offset) = {
196
194
let masked_pos = self . consumer_pos_value & self . mask ;
197
- let index_in_array = masked_pos / mem:: size_of :: < AtomicUsize > ( ) ;
198
- let header = self . observer . data [ index_in_array] . load ( Ordering :: Acquire ) ;
195
+ let index_in_array = masked_pos / mem:: size_of :: < usize > ( ) ;
196
+ let header = self . observer . data [ index_in_array] ;
199
197
// keep only 32 bits
200
198
( header & 0xffffffff , masked_pos + HEADER_SIZE )
201
199
} ;
@@ -334,8 +332,8 @@ impl Drop for RingBufferObserver {
334
332
fn drop ( & mut self ) {
335
333
epoll:: close ( self . epfd ) . unwrap_or_default ( ) ;
336
334
let len = self . len ( ) ;
337
- let p = mem:: replace ( & mut self . consumer_pos , Box :: new ( AtomicUsize :: new ( 0 ) ) ) ;
338
- let q = mem:: replace ( & mut self . producer_pos , Box :: new ( AtomicUsize :: new ( 0 ) ) ) ;
335
+ let p = mem:: replace ( & mut self . consumer_pos , Box :: new ( 0 ) ) ;
336
+ let q = mem:: replace ( & mut self . producer_pos , Box :: new ( 0 ) ) ;
339
337
let data = mem:: replace ( & mut self . data , Box :: new ( [ ] ) ) ;
340
338
unsafe {
341
339
libc:: munmap ( Box :: into_raw ( p) as * mut _ , self . page_size ) ;
0 commit comments