Skip to content

Commit f7fa008

Browse files
committed
Use Relaxed ordering since setters are called by a single thread
1 parent 2e1ed2c commit f7fa008

File tree

1 file changed

+23
-21
lines changed

1 file changed

+23
-21
lines changed

src/class/proto_methods.rs

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ use std::{
99
sync::atomic::{AtomicPtr, Ordering},
1010
};
1111

12-
/// Defines what we need for method protocols.
13-
/// Stub implementations are for rust-numpy.
12+
/// Defines all methods for object protocols.
13+
// Note: stub implementations are for rust-numpy. Please remove them.
1414
pub trait PyProtoMethods {
1515
fn async_methods() -> Option<NonNull<PyAsyncMethods>> {
1616
None
@@ -41,42 +41,44 @@ pub trait PyProtoMethods {
4141
}
4242
}
4343

44-
/// Indicates that a type has a protocol registry.
44+
/// Indicates that a type has a protocol registry. Implemented by `#[pyclass]`.
4545
#[doc(hidden)]
4646
pub trait HasProtoRegistry: Sized + 'static {
4747
fn registry() -> &'static PyProtoRegistry;
4848
}
4949

5050
impl<T: HasProtoRegistry> PyProtoMethods for T {
5151
fn async_methods() -> Option<NonNull<PyAsyncMethods>> {
52-
NonNull::new(Self::registry().async_methods.load(Ordering::SeqCst))
52+
NonNull::new(Self::registry().async_methods.load(Ordering::Relaxed))
5353
}
5454
fn basic_methods() -> Option<NonNull<PyObjectMethods>> {
55-
NonNull::new(Self::registry().basic_methods.load(Ordering::SeqCst))
55+
NonNull::new(Self::registry().basic_methods.load(Ordering::Relaxed))
5656
}
5757
fn buffer_methods() -> Option<NonNull<PyBufferProcs>> {
58-
NonNull::new(Self::registry().buffer_methods.load(Ordering::SeqCst))
58+
NonNull::new(Self::registry().buffer_methods.load(Ordering::Relaxed))
5959
}
6060
fn descr_methods() -> Option<NonNull<PyDescrMethods>> {
61-
NonNull::new(Self::registry().descr_methods.load(Ordering::SeqCst))
61+
NonNull::new(Self::registry().descr_methods.load(Ordering::Relaxed))
6262
}
6363
fn gc_methods() -> Option<NonNull<PyGCMethods>> {
64-
NonNull::new(Self::registry().gc_methods.load(Ordering::SeqCst))
64+
NonNull::new(Self::registry().gc_methods.load(Ordering::Relaxed))
6565
}
6666
fn mapping_methods() -> Option<NonNull<PyMappingMethods>> {
67-
NonNull::new(Self::registry().mapping_methods.load(Ordering::SeqCst))
67+
NonNull::new(Self::registry().mapping_methods.load(Ordering::Relaxed))
6868
}
6969
fn number_methods() -> Option<NonNull<PyNumberMethods>> {
70-
NonNull::new(Self::registry().number_methods.load(Ordering::SeqCst))
70+
NonNull::new(Self::registry().number_methods.load(Ordering::Relaxed))
7171
}
7272
fn iter_methods() -> Option<NonNull<PyIterMethods>> {
73-
NonNull::new(Self::registry().iter_methods.load(Ordering::SeqCst))
73+
NonNull::new(Self::registry().iter_methods.load(Ordering::Relaxed))
7474
}
7575
fn sequence_methods() -> Option<NonNull<PySequenceMethods>> {
76-
NonNull::new(Self::registry().sequence_methods.load(Ordering::SeqCst))
76+
NonNull::new(Self::registry().sequence_methods.load(Ordering::Relaxed))
7777
}
7878
}
7979

80+
/// Stores all method protocols.
81+
/// Used in the proc-macro code as a static variable.
8082
#[doc(hidden)]
8183
pub struct PyProtoRegistry {
8284
/// Async protocols.
@@ -115,38 +117,38 @@ impl PyProtoRegistry {
115117
}
116118
pub fn set_async_methods(&self, methods: PyAsyncMethods) {
117119
self.async_methods
118-
.store(Box::into_raw(Box::new(methods)), Ordering::SeqCst)
120+
.store(Box::into_raw(Box::new(methods)), Ordering::Relaxed)
119121
}
120122
pub fn set_basic_methods(&self, methods: PyObjectMethods) {
121123
self.basic_methods
122-
.store(Box::into_raw(Box::new(methods)), Ordering::SeqCst)
124+
.store(Box::into_raw(Box::new(methods)), Ordering::Relaxed)
123125
}
124126
pub fn set_buffer_methods(&self, methods: PyBufferProcs) {
125127
self.buffer_methods
126-
.store(Box::into_raw(Box::new(methods)), Ordering::SeqCst)
128+
.store(Box::into_raw(Box::new(methods)), Ordering::Relaxed)
127129
}
128130
pub fn set_descr_methods(&self, methods: PyDescrMethods) {
129131
self.descr_methods
130-
.store(Box::into_raw(Box::new(methods)), Ordering::SeqCst)
132+
.store(Box::into_raw(Box::new(methods)), Ordering::Relaxed)
131133
}
132134
pub fn set_gc_methods(&self, methods: PyGCMethods) {
133135
self.gc_methods
134-
.store(Box::into_raw(Box::new(methods)), Ordering::SeqCst)
136+
.store(Box::into_raw(Box::new(methods)), Ordering::Relaxed)
135137
}
136138
pub fn set_mapping_methods(&self, methods: PyMappingMethods) {
137139
self.mapping_methods
138-
.store(Box::into_raw(Box::new(methods)), Ordering::SeqCst)
140+
.store(Box::into_raw(Box::new(methods)), Ordering::Relaxed)
139141
}
140142
pub fn set_number_methods(&self, methods: PyNumberMethods) {
141143
self.number_methods
142-
.store(Box::into_raw(Box::new(methods)), Ordering::SeqCst)
144+
.store(Box::into_raw(Box::new(methods)), Ordering::Relaxed)
143145
}
144146
pub fn set_iter_methods(&self, methods: PyIterMethods) {
145147
self.iter_methods
146-
.store(Box::into_raw(Box::new(methods)), Ordering::SeqCst)
148+
.store(Box::into_raw(Box::new(methods)), Ordering::Relaxed)
147149
}
148150
pub fn set_sequence_methods(&self, methods: PySequenceMethods) {
149151
self.sequence_methods
150-
.store(Box::into_raw(Box::new(methods)), Ordering::SeqCst)
152+
.store(Box::into_raw(Box::new(methods)), Ordering::Relaxed)
151153
}
152154
}

0 commit comments

Comments
 (0)