Skip to content

Commit 229d5a2

Browse files
feat!: Use Arc instead of Rc in bam::buffer, such that the buffer can be used in a multithreaded context (#495)
* feat!: Use Arc instead of Rc in bam::buffer, such that the buffer can be used in a multithreaded context * fmt * fix
1 parent 8f1cdd7 commit 229d5a2

File tree

1 file changed

+11
-10
lines changed

1 file changed

+11
-10
lines changed

src/bam/buffer.rs

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55

66
use std::collections::{vec_deque, VecDeque};
77
use std::mem;
8-
use std::rc::Rc;
98
use std::str;
9+
use std::sync::Arc;
1010

1111
use crate::bam;
1212
use crate::bam::Read;
@@ -19,11 +19,11 @@ use crate::errors::{Error, Result};
1919
#[derive(Debug)]
2020
pub struct RecordBuffer {
2121
reader: bam::IndexedReader,
22-
inner: VecDeque<Rc<bam::Record>>,
23-
overflow: Option<Rc<bam::Record>>,
22+
inner: VecDeque<Arc<bam::Record>>,
23+
overflow: Option<Arc<bam::Record>>,
2424
cache_cigar: bool,
2525
min_refetch_distance: u64,
26-
buffer_record: Rc<bam::Record>,
26+
buffer_record: Arc<bam::Record>,
2727
start_pos: Option<u64>,
2828
}
2929

@@ -44,7 +44,7 @@ impl RecordBuffer {
4444
overflow: None,
4545
cache_cigar,
4646
min_refetch_distance: 1,
47-
buffer_record: Rc::new(bam::Record::new()),
47+
buffer_record: Arc::new(bam::Record::new()),
4848
start_pos: Some(0),
4949
}
5050
}
@@ -113,7 +113,7 @@ impl RecordBuffer {
113113
loop {
114114
match self
115115
.reader
116-
.read(Rc::get_mut(&mut self.buffer_record).unwrap())
116+
.read(Arc::get_mut(&mut self.buffer_record).unwrap())
117117
{
118118
None => break,
119119
Some(res) => res?,
@@ -132,10 +132,11 @@ impl RecordBuffer {
132132

133133
// Record is kept, do not reuse it for next iteration
134134
// and thus create a new one.
135-
let mut record = mem::replace(&mut self.buffer_record, Rc::new(bam::Record::new()));
135+
let mut record =
136+
mem::replace(&mut self.buffer_record, Arc::new(bam::Record::new()));
136137

137138
if self.cache_cigar {
138-
Rc::get_mut(&mut record).unwrap().cache_cigar();
139+
Arc::get_mut(&mut record).unwrap().cache_cigar();
139140
}
140141

141142
if pos >= end as i64 {
@@ -157,12 +158,12 @@ impl RecordBuffer {
157158
}
158159

159160
/// Iterate over records that have been fetched with `fetch`.
160-
pub fn iter(&self) -> vec_deque::Iter<'_, Rc<bam::Record>> {
161+
pub fn iter(&self) -> vec_deque::Iter<'_, Arc<bam::Record>> {
161162
self.inner.iter()
162163
}
163164

164165
/// Iterate over mutable references to records that have been fetched with `fetch`.
165-
pub fn iter_mut(&mut self) -> vec_deque::IterMut<'_, Rc<bam::Record>> {
166+
pub fn iter_mut(&mut self) -> vec_deque::IterMut<'_, Arc<bam::Record>> {
166167
self.inner.iter_mut()
167168
}
168169

0 commit comments

Comments
 (0)