Make PyProperty ThreadSafe

This commit is contained in:
Aviv Palivoda
2020-04-24 15:01:18 +03:00
parent 9d1eadc1b9
commit dc81354473

View File

@@ -1,12 +1,13 @@
/*! Python `property` descriptor class.
*/
use std::cell::RefCell;
use std::sync::RwLock;
use super::objtype::PyClassRef;
use crate::function::OptionalArg;
use crate::pyobject::{
IdProtocol, PyClassImpl, PyContext, PyObjectRef, PyRef, PyResult, PyValue, TypeProtocol,
IdProtocol, PyClassImpl, PyContext, PyObjectRef, PyRef, PyResult, PyValue, ThreadSafe,
TypeProtocol,
};
use crate::slots::SlotDescriptor;
use crate::vm::VirtualMachine;
@@ -49,8 +50,9 @@ pub struct PyProperty {
getter: Option<PyObjectRef>,
setter: Option<PyObjectRef>,
deleter: Option<PyObjectRef>,
doc: RefCell<Option<PyObjectRef>>,
doc: RwLock<Option<PyObjectRef>>,
}
impl ThreadSafe for PyProperty {}
impl PyValue for PyProperty {
fn class(vm: &VirtualMachine) -> PyClassRef {
@@ -101,7 +103,7 @@ impl PyProperty {
getter: args.fget,
setter: args.fset,
deleter: args.fdel,
doc: RefCell::new(args.doc),
doc: RwLock::new(args.doc),
}
.into_ref_with_type(vm, cls)
}
@@ -144,11 +146,11 @@ impl PyProperty {
}
fn doc_getter(&self) -> Option<PyObjectRef> {
self.doc.borrow().clone()
self.doc.read().unwrap().clone()
}
fn doc_setter(&self, value: PyObjectRef, vm: &VirtualMachine) {
self.doc.replace(py_none_to_option(vm, &value));
*self.doc.write().unwrap() = py_none_to_option(vm, &value);
}
// Python builder functions
@@ -163,7 +165,7 @@ impl PyProperty {
getter: getter.or_else(|| zelf.getter.clone()),
setter: zelf.setter.clone(),
deleter: zelf.deleter.clone(),
doc: RefCell::new(None),
doc: RwLock::new(None),
}
.into_ref_with_type(vm, TypeProtocol::class(&zelf))
}
@@ -178,7 +180,7 @@ impl PyProperty {
getter: zelf.getter.clone(),
setter: setter.or_else(|| zelf.setter.clone()),
deleter: zelf.deleter.clone(),
doc: RefCell::new(None),
doc: RwLock::new(None),
}
.into_ref_with_type(vm, TypeProtocol::class(&zelf))
}
@@ -193,7 +195,7 @@ impl PyProperty {
getter: zelf.getter.clone(),
setter: zelf.setter.clone(),
deleter: deleter.or_else(|| zelf.deleter.clone()),
doc: RefCell::new(None),
doc: RwLock::new(None),
}
.into_ref_with_type(vm, TypeProtocol::class(&zelf))
}