File tree Expand file tree Collapse file tree 1 file changed +16
-1
lines changed Expand file tree Collapse file tree 1 file changed +16
-1
lines changed Original file line number Diff line number Diff line change @@ -178,9 +178,24 @@ impl TypeDescriptors {
178
178
byteorder : c_char ,
179
179
size : usize ,
180
180
) -> Bound < ' py , PyArrayDescr > {
181
- // FIXME probably a deadlock risk here due to the GIL? Might need MutexExt trait in PyO3
181
+ // FIXME create a proper MutexExt trait that handles poisoning and upstream to PyO3
182
+ struct Guard ( * mut pyo3:: ffi:: PyThreadState ) ;
183
+
184
+ impl Drop for Guard {
185
+ fn drop ( & mut self ) {
186
+ unsafe { pyo3:: ffi:: PyEval_RestoreThread ( self . 0 ) } ;
187
+ }
188
+ }
189
+
190
+ // we are currently attached to the python runtime and we might block trying to acquire
191
+ // the dtype cache mutex, so detach to avoid a possible deadlock.
192
+ let ts_guard = Guard ( unsafe { pyo3:: ffi:: PyEval_SaveThread ( ) } ) ;
193
+
182
194
let mut dtypes = self . dtypes . lock ( ) . expect ( "dtype cache poisoned" ) ;
183
195
196
+ // we've acquire the dtype cache lock so it's safe to re-attach to the runtime
197
+ drop ( ts_guard) ;
198
+
184
199
let dtype = match dtypes. get_or_insert_with ( Default :: default) . entry ( size) {
185
200
Entry :: Occupied ( entry) => entry. into_mut ( ) ,
186
201
Entry :: Vacant ( entry) => {
You can’t perform that action at this time.
0 commit comments