@@ -1086,6 +1086,16 @@ PyBuffer_ToContiguous(void *buf, const Py_buffer *src, Py_ssize_t len, char orde
10861086 return ret ;
10871087}
10881088
1089+ static inline Py_ssize_t
1090+ get_exports (PyMemoryViewObject * buf )
1091+ {
1092+ #ifdef Py_GIL_DISABLED
1093+ return _Py_atomic_load_ssize_relaxed (& buf -> exports );
1094+ #else
1095+ return buf -> exports ;
1096+ #endif
1097+ }
1098+
10891099
10901100/****************************************************************************/
10911101/* Release/GC management */
@@ -1098,7 +1108,7 @@ PyBuffer_ToContiguous(void *buf, const Py_buffer *src, Py_ssize_t len, char orde
10981108static void
10991109_memory_release (PyMemoryViewObject * self )
11001110{
1101- assert (self -> exports == 0 );
1111+ assert (get_exports ( self ) == 0 );
11021112 if (self -> flags & _Py_MEMORYVIEW_RELEASED )
11031113 return ;
11041114
@@ -1119,15 +1129,16 @@ static PyObject *
11191129memoryview_release_impl (PyMemoryViewObject * self )
11201130/*[clinic end generated code: output=d0b7e3ba95b7fcb9 input=bc71d1d51f4a52f0]*/
11211131{
1122- if (self -> exports == 0 ) {
1132+ Py_ssize_t exports = get_exports (self );
1133+ if (exports == 0 ) {
11231134 _memory_release (self );
11241135 Py_RETURN_NONE ;
11251136 }
11261137
1127- if (self -> exports > 0 ) {
1138+ if (exports > 0 ) {
11281139 PyErr_Format (PyExc_BufferError ,
1129- "memoryview has %zd exported buffer%s" , self -> exports ,
1130- self -> exports == 1 ? "" : "s" );
1140+ "memoryview has %zd exported buffer%s" , exports ,
1141+ exports == 1 ? "" : "s" );
11311142 return NULL ;
11321143 }
11331144
@@ -1140,7 +1151,7 @@ static void
11401151memory_dealloc (PyObject * _self )
11411152{
11421153 PyMemoryViewObject * self = (PyMemoryViewObject * )_self ;
1143- assert (self -> exports == 0 );
1154+ assert (get_exports ( self ) == 0 );
11441155 _PyObject_GC_UNTRACK (self );
11451156 _memory_release (self );
11461157 Py_CLEAR (self -> mbuf );
@@ -1161,7 +1172,7 @@ static int
11611172memory_clear (PyObject * _self )
11621173{
11631174 PyMemoryViewObject * self = (PyMemoryViewObject * )_self ;
1164- if (self -> exports == 0 ) {
1175+ if (get_exports ( self ) == 0 ) {
11651176 _memory_release (self );
11661177 Py_CLEAR (self -> mbuf );
11671178 }
@@ -1589,7 +1600,11 @@ memory_getbuf(PyObject *_self, Py_buffer *view, int flags)
15891600
15901601
15911602 view -> obj = Py_NewRef (self );
1603+ #ifdef Py_GIL_DISABLED
1604+ _Py_atomic_add_ssize (& self -> exports , 1 );
1605+ #else
15921606 self -> exports ++ ;
1607+ #endif
15931608
15941609 return 0 ;
15951610}
@@ -1598,7 +1613,11 @@ static void
15981613memory_releasebuf (PyObject * _self , Py_buffer * view )
15991614{
16001615 PyMemoryViewObject * self = (PyMemoryViewObject * )_self ;
1616+ #ifdef Py_GIL_DISABLED
1617+ _Py_atomic_add_ssize (& self -> exports , -1 );
1618+ #else
16011619 self -> exports -- ;
1620+ #endif
16021621 return ;
16031622 /* PyBuffer_Release() decrements view->obj after this function returns. */
16041623}
0 commit comments