Merge pull request #2927 from eldpswp99/make-dict-iterator-use-atomic-operation

make dict iterator use atomic operation
This commit is contained in:
Jeong YunWon
2021-08-22 20:27:17 +09:00
committed by GitHub
2 changed files with 18 additions and 8 deletions

View File

@@ -718,12 +718,8 @@ macro_rules! dict_iterator {
"dictionary changed size during iteration".to_owned(),
));
}
let mut position = zelf.position.load();
match zelf.dict.entries.next_entry(&mut position) {
Some((key, value)) => {
zelf.position.store(position);
Ok(($result_fn)(vm, key, value))
}
match zelf.dict.entries.next_entry_atomic(&zelf.position) {
Some((key, value)) => Ok(($result_fn)(vm, key, value)),
None => {
zelf.status.store(IterStatus::Exhausted);
Err(vm.new_stop_iteration())
@@ -782,7 +778,7 @@ macro_rules! dict_iterator {
"dictionary changed size during iteration".to_owned(),
));
}
match zelf.dict.entries.next_entry_reversed(&zelf.position) {
match zelf.dict.entries.next_entry_atomic_reversed(&zelf.position) {
Some((key, value)) => Ok(($result_fn)(vm, key, value)),
None => {
zelf.status.store(IterStatus::Exhausted);

View File

@@ -488,7 +488,21 @@ impl<T: Clone> Dict<T> {
}
}
pub fn next_entry_reversed(&self, position: &AtomicCell<usize>) -> Option<(PyObjectRef, T)> {
pub fn next_entry_atomic(&self, position: &AtomicCell<usize>) -> Option<(PyObjectRef, T)> {
let inner = self.read();
loop {
let position_usize = position.fetch_add(1);
let entry = inner.entries.get(position_usize)?;
if let Some(entry) = entry {
break Some((entry.key.clone(), entry.value.clone()));
}
}
}
pub fn next_entry_atomic_reversed(
&self,
position: &AtomicCell<usize>,
) -> Option<(PyObjectRef, T)> {
let inner = self.read();
loop {
let position_usize = position.fetch_add(1);