@@ -121,13 +121,17 @@ impl PyLock {
121
121
}
122
122
#[ pymethod]
123
123
#[ pymethod( name = "release_lock" ) ]
124
- fn release ( & self ) {
125
- self . mu . unlock ( )
124
+ fn release ( & self , vm : & VirtualMachine ) -> PyResult < ( ) > {
125
+ if self . mu . is_locked ( ) {
126
+ return Err ( vm. new_runtime_error ( "release unlocked lock" . to_owned ( ) ) ) ;
127
+ }
128
+ unsafe { self . mu . unlock ( ) } ;
129
+ Ok ( ( ) )
126
130
}
127
131
128
132
#[ pymethod( magic) ]
129
- fn exit ( & self , _args : PyFuncArgs ) {
130
- self . release ( )
133
+ fn exit ( & self , _args : PyFuncArgs , vm : & VirtualMachine ) -> PyResult < ( ) > {
134
+ self . release ( vm )
131
135
}
132
136
133
137
#[ pymethod]
@@ -178,13 +182,17 @@ impl PyRLock {
178
182
}
179
183
#[ pymethod]
180
184
#[ pymethod( name = "release_lock" ) ]
181
- fn release ( & self ) {
182
- self . mu . unlock ( )
185
+ fn release ( & self , vm : & VirtualMachine ) -> PyResult < ( ) > {
186
+ if self . mu . is_locked ( ) {
187
+ return Err ( vm. new_runtime_error ( "release unlocked lock" . to_owned ( ) ) ) ;
188
+ }
189
+ unsafe { self . mu . unlock ( ) } ;
190
+ Ok ( ( ) )
183
191
}
184
192
185
193
#[ pymethod( magic) ]
186
- fn exit ( & self , _args : PyFuncArgs ) {
187
- self . release ( )
194
+ fn exit ( & self , _args : PyFuncArgs , vm : & VirtualMachine ) -> PyResult < ( ) > {
195
+ self . release ( vm )
188
196
}
189
197
190
198
#[ pymethod( magic) ]
@@ -237,7 +245,9 @@ fn thread_start_new_thread(
237
245
}
238
246
SENTINELS . with ( |sents| {
239
247
for lock in sents. replace ( Default :: default ( ) ) {
240
- lock. mu . unlock ( )
248
+ if lock. mu . is_locked ( ) {
249
+ unsafe { lock. mu . unlock ( ) } ;
250
+ }
241
251
}
242
252
} ) ;
243
253
vm. state . thread_count . fetch_sub ( 1 ) ;
0 commit comments