@@ -365,9 +365,12 @@ APSWSession_init(PyObject *self_, PyObject *args, PyObject *kwargs)
365365static void
366366APSWSession_close_internal (APSWSession * self )
367367{
368+ sqlite3_mutex * mutex = NULL ;
369+
368370 if (self -> session )
369371 {
370- assert (sqlite3_mutex_held (self -> connection -> dbmutex ));
372+ mutex = self -> connection -> dbmutex ;
373+ assert (sqlite3_mutex_held (mutex ));
371374 sqlite3session_delete (self -> session );
372375 self -> session = NULL ;
373376 }
@@ -376,21 +379,30 @@ APSWSession_close_internal(APSWSession *self)
376379
377380 if (self -> connection )
378381 {
379- sqlite3_mutex_leave (self -> connection -> dbmutex );
382+ sqlite3_mutex_leave (mutex );
380383 Connection_remove_dependent (self -> connection , (PyObject * )self );
381384 }
382385 Py_CLEAR (self -> connection );
383386}
384387
385- static void
386- APSWSession_dealloc ( PyObject * self_ )
388+ static int
389+ APSWSession_dealloc_mutex ( void * self_ )
387390{
388391 APSWSession * self = (APSWSession * )self_ ;
389- sqlite3_mutex * mutex = self -> connection ? self -> connection -> dbmutex : NULL ;
390- if (mutex )
391- DBMUTEX_FORCE (mutex );
392+
393+ DBMUTEX_RETRY (self -> connection , APSWSession_dealloc_mutex );
392394 APSWSession_close_internal (self );
393395 Py_TpFree (self_ );
396+
397+ return 0 ;
398+ }
399+
400+ static void
401+ APSWSession_dealloc (PyObject * self_ )
402+ {
403+ APSWSession * self = (APSWSession * )self_ ;
404+
405+ APSWSession_dealloc_mutex (self );
394406}
395407
396408/** .. method:: close() -> None
@@ -2048,26 +2060,30 @@ APSWChangesetBuilder_close_internal(APSWChangesetBuilder *self)
20482060 }
20492061 if (self -> connection )
20502062 {
2051- assert (sqlite3_mutex_held (self -> connection -> dbmutex ));
20522063 Connection_remove_dependent (self -> connection , (PyObject * )self );
20532064 Py_CLEAR (self -> connection );
20542065 }
20552066}
20562067
2057- static void
2058- APSWChangesetBuilder_dealloc ( PyObject * self_ )
2068+ static int
2069+ APSWChangesetBuilder_dealloc_mutex ( void * self_ )
20592070{
20602071 APSWChangesetBuilder * self = (APSWChangesetBuilder * )self_ ;
2061- sqlite3_mutex * mutex = NULL ;
2062- if (self -> connection )
2063- {
2064- mutex = self -> connection -> dbmutex ;
2065- DBMUTEX_FORCE (mutex );
2066- }
2072+ DBMUTEX_RETRY (self -> connection , APSWChangesetBuilder_dealloc_mutex );
2073+
2074+ sqlite3_mutex * mutex = (self -> connection ) ? self -> connection -> dbmutex : NULL ;
20672075 APSWChangesetBuilder_close_internal (self );
2068- if (mutex )
2069- sqlite3_mutex_leave ( mutex );
2076+ sqlite3_mutex_leave (mutex );
2077+
20702078 Py_TpFree (self_ );
2079+ return 0 ;
2080+ }
2081+
2082+ static void
2083+ APSWChangesetBuilder_dealloc (PyObject * self_ )
2084+ {
2085+ APSWChangesetBuilder * self = (APSWChangesetBuilder * )self_ ;
2086+ APSWChangesetBuilder_dealloc_mutex (self );
20712087}
20722088
20732089/** .. method:: close() -> None
0 commit comments