Skip to content

Commit ebab829

Browse files
committed
Switch to using parking_lot::Mutex instead of std::sync::Mutex
1 parent 7ac07fd commit ebab829

28 files changed

+137
-158
lines changed

derive/src/pyclass.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,7 @@ fn extract_impl_items(mut items: Vec<ItemIdent>) -> Result<TokenStream2, Diagnos
275275
#transform(Self::#item_ident)
276276
};
277277
Some(quote! {
278-
(*class.slots.write().unwrap()).#slot_ident = Some(#into_func);
278+
(*class.slots.write()).#slot_ident = Some(#into_func);
279279
})
280280
}
281281
_ => None,

vm/src/dictdatatype.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@ use crate::pyhash;
33
use crate::pyobject::{IdProtocol, IntoPyObject, PyObjectRef, PyResult};
44
use crate::vm::VirtualMachine;
55
use num_bigint::ToBigInt;
6+
use parking_lot::{RwLock, RwLockReadGuard, RwLockWriteGuard};
67
/// Ordered dictionary implementation.
78
/// Inspired by: https://morepypy.blogspot.com/2015/01/faster-more-memory-efficient-and-more.html
89
/// And: https://www.youtube.com/watch?v=p33CVV29OG8
910
/// And: http://code.activestate.com/recipes/578375/
1011
use std::collections::{hash_map::DefaultHasher, HashMap};
1112
use std::hash::{Hash, Hasher};
1213
use std::mem::size_of;
13-
use std::sync::{RwLock, RwLockReadGuard, RwLockWriteGuard};
1414

1515
/// hash value of an object returned by __hash__
1616
type HashValue = pyhash::PyHash;
@@ -42,7 +42,7 @@ impl<T: Clone> Clone for InnerDict<T> {
4242
impl<T: Clone> Clone for Dict<T> {
4343
fn clone(&self) -> Self {
4444
Dict {
45-
inner: RwLock::new(self.inner.read().unwrap().clone()),
45+
inner: RwLock::new(self.inner.read().clone()),
4646
}
4747
}
4848
}
@@ -83,11 +83,11 @@ pub struct DictSize {
8383

8484
impl<T: Clone> Dict<T> {
8585
fn borrow_value(&self) -> RwLockReadGuard<'_, InnerDict<T>> {
86-
self.inner.read().unwrap()
86+
self.inner.read()
8787
}
8888

8989
fn borrow_value_mut(&self) -> RwLockWriteGuard<'_, InnerDict<T>> {
90-
self.inner.write().unwrap()
90+
self.inner.write()
9191
}
9292

9393
fn resize(&self) {

vm/src/exceptions.rs

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@ use crate::types::create_type;
1414
use crate::VirtualMachine;
1515

1616
use itertools::Itertools;
17+
use parking_lot::RwLock;
1718
use std::fmt;
1819
use std::fs::File;
1920
use std::io::{self, BufRead, BufReader, Write};
20-
use std::sync::RwLock;
2121

2222
use crossbeam_utils::atomic::AtomicCell;
2323

@@ -66,50 +66,50 @@ impl PyBaseException {
6666

6767
#[pymethod(name = "__init__")]
6868
fn init(&self, args: PyFuncArgs, vm: &VirtualMachine) -> PyResult<()> {
69-
*self.args.write().unwrap() = PyTuple::from(args.args).into_ref(vm);
69+
*self.args.write() = PyTuple::from(args.args).into_ref(vm);
7070
Ok(())
7171
}
7272

7373
#[pyproperty]
7474
pub fn args(&self) -> PyTupleRef {
75-
self.args.read().unwrap().clone()
75+
self.args.read().clone()
7676
}
7777

7878
#[pyproperty(setter)]
7979
fn set_args(&self, args: PyIterable, vm: &VirtualMachine) -> PyResult<()> {
8080
let args = args.iter(vm)?.collect::<PyResult<Vec<_>>>()?;
81-
*self.args.write().unwrap() = PyTuple::from(args).into_ref(vm);
81+
*self.args.write() = PyTuple::from(args).into_ref(vm);
8282
Ok(())
8383
}
8484

8585
#[pyproperty(name = "__traceback__")]
8686
pub fn traceback(&self) -> Option<PyTracebackRef> {
87-
self.traceback.read().unwrap().clone()
87+
self.traceback.read().clone()
8888
}
8989

9090
#[pyproperty(name = "__traceback__", setter)]
9191
pub fn set_traceback(&self, traceback: Option<PyTracebackRef>) {
92-
*self.traceback.write().unwrap() = traceback;
92+
*self.traceback.write() = traceback;
9393
}
9494

9595
#[pyproperty(name = "__cause__")]
9696
pub fn cause(&self) -> Option<PyBaseExceptionRef> {
97-
self.cause.read().unwrap().clone()
97+
self.cause.read().clone()
9898
}
9999

100100
#[pyproperty(name = "__cause__", setter)]
101101
pub fn set_cause(&self, cause: Option<PyBaseExceptionRef>) {
102-
*self.cause.write().unwrap() = cause;
102+
*self.cause.write() = cause;
103103
}
104104

105105
#[pyproperty(name = "__context__")]
106106
pub fn context(&self) -> Option<PyBaseExceptionRef> {
107-
self.context.read().unwrap().clone()
107+
self.context.read().clone()
108108
}
109109

110110
#[pyproperty(name = "__context__", setter)]
111111
pub fn set_context(&self, context: Option<PyBaseExceptionRef>) {
112-
*self.context.write().unwrap() = context;
112+
*self.context.write() = context;
113113
}
114114

115115
#[pyproperty(name = "__suppress_context__")]
@@ -124,7 +124,7 @@ impl PyBaseException {
124124

125125
#[pymethod]
126126
fn with_traceback(zelf: PyRef<Self>, tb: Option<PyTracebackRef>) -> PyResult {
127-
*zelf.traceback.write().unwrap() = tb;
127+
*zelf.traceback.write() = tb;
128128
Ok(zelf.as_object().clone())
129129
}
130130

@@ -216,7 +216,7 @@ pub fn write_exception_inner<W: Write>(
216216
vm: &VirtualMachine,
217217
exc: &PyBaseExceptionRef,
218218
) -> io::Result<()> {
219-
if let Some(tb) = exc.traceback.read().unwrap().clone() {
219+
if let Some(tb) = exc.traceback.read().clone() {
220220
writeln!(output, "Traceback (most recent call last):")?;
221221
for tb in tb.iter() {
222222
write_traceback_entry(output, &tb)?;
@@ -430,7 +430,7 @@ impl ExceptionZoo {
430430
pub fn new(type_type: &PyClassRef, object_type: &PyClassRef) -> Self {
431431
let create_exception_type = |name: &str, base: &PyClassRef| {
432432
let typ = create_type(name, type_type, base);
433-
typ.slots.write().unwrap().flags |= PyTpFlags::BASETYPE;
433+
typ.slots.write().flags |= PyTpFlags::BASETYPE;
434434
typ
435435
};
436436
// Sorted By Hierarchy then alphabetized.
@@ -609,7 +609,6 @@ fn make_arg_getter(idx: usize) -> impl Fn(PyBaseExceptionRef, &VirtualMachine) -
609609
move |exc, vm| {
610610
exc.args
611611
.read()
612-
.unwrap()
613612
.as_slice()
614613
.get(idx)
615614
.cloned()

vm/src/frame.rs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
use std::fmt;
22
use std::sync::atomic::{AtomicUsize, Ordering};
3-
use std::sync::Mutex;
43

54
use indexmap::IndexMap;
65
use itertools::Itertools;
6+
use parking_lot::Mutex;
77

88
use crate::builtins::builtin_isinstance;
99
use crate::bytecode;
@@ -173,7 +173,7 @@ impl Frame {
173173

174174
impl FrameRef {
175175
fn with_exec<R>(&self, f: impl FnOnce(ExecutingFrame) -> R) -> R {
176-
let mut state = self.state.lock().unwrap();
176+
let mut state = self.state.lock();
177177
let exec = ExecutingFrame {
178178
code: &self.code,
179179
scope: &self.scope,
@@ -1491,10 +1491,7 @@ impl ExecutingFrame<'_> {
14911491

14921492
impl fmt::Debug for Frame {
14931493
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1494-
let state = match self.state.lock() {
1495-
Ok(state) => state,
1496-
Err(_posion) => return f.pad("Frame Object {{ poisoned }}"),
1497-
};
1494+
let state = self.state.lock();
14981495
let stack_str = state
14991496
.stack
15001497
.iter()

vm/src/macros.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ macro_rules! py_class {
3737
{
3838
let py_class = $ctx.new_class($class_name, $class_base);
3939
// FIXME: setting flag here probably wrong
40-
py_class.slots.write().unwrap().flags |= $crate::slots::PyTpFlags::BASETYPE;
40+
py_class.slots.write().flags |= $crate::slots::PyTpFlags::BASETYPE;
4141
$crate::extend_class!($ctx, &py_class, { $($name => $value),* });
4242
py_class
4343
}
@@ -54,7 +54,7 @@ macro_rules! extend_class {
5454
};
5555

5656
(@set_attr($ctx:expr, $class:expr, (slot $slot_name:ident), $value:expr)) => {
57-
$class.slots.write().unwrap().$slot_name = Some(
57+
$class.slots.write().$slot_name = Some(
5858
$crate::function::IntoPyNativeFunc::into_func($value)
5959
);
6060
};

vm/src/obj/objbytearray.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
//! Implementation of the python bytearray object.
22
use bstr::ByteSlice;
33
use crossbeam_utils::atomic::AtomicCell;
4+
use parking_lot::{RwLock, RwLockReadGuard, RwLockWriteGuard};
45
use std::convert::TryFrom;
56
use std::mem::size_of;
67
use std::str::FromStr;
7-
use std::sync::{RwLock, RwLockReadGuard, RwLockWriteGuard};
88

99
use super::objbyteinner::{
1010
ByteInnerFindOptions, ByteInnerNewOptions, ByteInnerPaddingOptions, ByteInnerSplitOptions,
@@ -58,11 +58,11 @@ impl PyByteArray {
5858
}
5959

6060
pub fn borrow_value(&self) -> RwLockReadGuard<'_, PyByteInner> {
61-
self.inner.read().unwrap()
61+
self.inner.read()
6262
}
6363

6464
pub fn borrow_value_mut(&self) -> RwLockWriteGuard<'_, PyByteInner> {
65-
self.inner.write().unwrap()
65+
self.inner.write()
6666
}
6767
}
6868

vm/src/obj/objcoroinner.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use crate::pyobject::{PyObjectRef, PyResult};
55
use crate::vm::VirtualMachine;
66

77
use crossbeam_utils::atomic::AtomicCell;
8-
use std::sync::RwLock;
8+
use parking_lot::RwLock;
99

1010
#[derive(Debug, PartialEq, Clone, Copy)]
1111
pub enum Variant {
@@ -69,10 +69,10 @@ impl Coro {
6969
let curr_exception_stack_len = vm.exceptions.borrow().len();
7070
vm.exceptions
7171
.borrow_mut()
72-
.append(&mut self.exceptions.write().unwrap());
72+
.append(&mut self.exceptions.write());
7373
let result = vm.with_frame(self.frame.clone(), func);
7474
std::mem::swap(
75-
&mut *self.exceptions.write().unwrap(),
75+
&mut *self.exceptions.write(),
7676
&mut vm
7777
.exceptions
7878
.borrow_mut()

vm/src/obj/objenumerate.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1+
use parking_lot::RwLock;
12
use std::ops::AddAssign;
2-
use std::sync::RwLock;
33

44
use num_bigint::BigInt;
55
use num_traits::Zero;
@@ -50,7 +50,7 @@ impl PyEnumerate {
5050
#[pymethod(name = "__next__")]
5151
fn next(&self, vm: &VirtualMachine) -> PyResult<(BigInt, PyObjectRef)> {
5252
let next_obj = objiter::call_next(vm, &self.iterator)?;
53-
let mut counter = self.counter.write().unwrap();
53+
let mut counter = self.counter.write();
5454
let position = counter.clone();
5555
AddAssign::add_assign(&mut counter as &mut BigInt, 1);
5656
Ok((position, next_obj))

vm/src/obj/objlist.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
use std::fmt;
22
use std::mem::size_of;
33
use std::ops::{DerefMut, Range};
4-
use std::sync::{RwLock, RwLockReadGuard, RwLockWriteGuard};
54

65
use crossbeam_utils::atomic::AtomicCell;
76
use num_bigint::{BigInt, ToBigInt};
87
use num_traits::{One, Signed, ToPrimitive, Zero};
8+
use parking_lot::{RwLock, RwLockReadGuard, RwLockWriteGuard};
99

1010
use super::objbool;
1111
use super::objbyteinner;
@@ -55,11 +55,11 @@ impl PyValue for PyList {
5555

5656
impl PyList {
5757
pub fn borrow_elements(&self) -> RwLockReadGuard<'_, Vec<PyObjectRef>> {
58-
self.elements.read().unwrap()
58+
self.elements.read()
5959
}
6060

6161
pub fn borrow_elements_mut(&self) -> RwLockWriteGuard<'_, Vec<PyObjectRef>> {
62-
self.elements.write().unwrap()
62+
self.elements.write()
6363
}
6464

6565
pub(crate) fn get_byte_inner(

vm/src/obj/objmappingproxy.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ impl PyMappingProxy {
8787
MappingProxyInner::Dict(d) => d.clone(),
8888
MappingProxyInner::Class(c) => {
8989
// TODO: something that's much more efficient than this
90-
PyDictRef::from_attributes(c.attributes.read().unwrap().clone(), vm)?.into_object()
90+
PyDictRef::from_attributes(c.attributes.read().clone(), vm)?.into_object()
9191
}
9292
};
9393
objiter::get_iter(vm, &obj)
@@ -97,7 +97,7 @@ impl PyMappingProxy {
9797
let obj = match &self.mapping {
9898
MappingProxyInner::Dict(d) => d.clone(),
9999
MappingProxyInner::Class(c) => {
100-
PyDictRef::from_attributes(c.attributes.read().unwrap().clone(), vm)?.into_object()
100+
PyDictRef::from_attributes(c.attributes.read().clone(), vm)?.into_object()
101101
}
102102
};
103103
vm.call_method(&obj, "items", vec![])
@@ -107,7 +107,7 @@ impl PyMappingProxy {
107107
let obj = match &self.mapping {
108108
MappingProxyInner::Dict(d) => d.clone(),
109109
MappingProxyInner::Class(c) => {
110-
PyDictRef::from_attributes(c.attributes.read().unwrap().clone(), vm)?.into_object()
110+
PyDictRef::from_attributes(c.attributes.read().clone(), vm)?.into_object()
111111
}
112112
};
113113
vm.call_method(&obj, "keys", vec![])
@@ -117,7 +117,7 @@ impl PyMappingProxy {
117117
let obj = match &self.mapping {
118118
MappingProxyInner::Dict(d) => d.clone(),
119119
MappingProxyInner::Class(c) => {
120-
PyDictRef::from_attributes(c.attributes.read().unwrap().clone(), vm)?.into_object()
120+
PyDictRef::from_attributes(c.attributes.read().clone(), vm)?.into_object()
121121
}
122122
};
123123
vm.call_method(&obj, "values", vec![])

vm/src/obj/objproperty.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*! Python `property` descriptor class.
22
33
*/
4-
use std::sync::RwLock;
4+
use parking_lot::RwLock;
55

66
use super::objtype::PyClassRef;
77
use crate::function::OptionalArg;
@@ -141,11 +141,11 @@ impl PyProperty {
141141
}
142142

143143
fn doc_getter(&self) -> Option<PyObjectRef> {
144-
self.doc.read().unwrap().clone()
144+
self.doc.read().clone()
145145
}
146146

147147
fn doc_setter(&self, value: PyObjectRef, vm: &VirtualMachine) {
148-
*self.doc.write().unwrap() = py_none_to_option(vm, &value);
148+
*self.doc.write() = py_none_to_option(vm, &value);
149149
}
150150

151151
// Python builder functions

0 commit comments

Comments
 (0)