[python-win32] Fw: [ pywin32-Bugs-3292681 ] adodbapi - Subtle crash
Mark Hammond
skippy.hammond at gmail.com
Fri Apr 29 02:50:40 CEST 2011
On 29/04/2011 7:07 AM, Vernon Cole wrote:
> I found two fixes for the crash. Now I need one of you brilliant folks
> to tell me which is correct. First, here is a snippet from adodbapi.
> Look closely at the comments on the last three lines of code ...
> v v v v v v v v v
> def _closeAdoConnection(self): #all v2.1 Rose
> """close the underlying ADO Connection object,
> rolling it back first if it supports transactions."""
> if self.supportsTransactions:
> self.adoConn.RollbackTrans()
> self.adoConn.Close()
>
> def close(self):
> self.messages=[]
> try:
> self._closeAdoConnection() #v2.1 Rose
> except (Exception), e:
> self._raiseConnectionError(InternalError,e)
>
> del self.adoConn ####
> adding this line cures the crash
>
> #### or
> pythoncom.CoUninitialize() #### removing
> this line cures the crash
> ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
>
> So --- which is the correct correction?
> remove the CoUininitialize()
> or perform the explicit del of the Dispatch object?
It sounds like the problem is that the object is still alive once
CoUninitialize() is called - then, when the adoCon object is finally
released (when the Connection object itself is released) "bad things"
(tm) happen. I think that is likely to be considered expected behaviour
- things should all be released before doing a CoUninitialize().
I'd suggest that something like self.adoConn = None in one of the close
methods is perfectly reasonable. OTOH, I expect the benefits of
uninitializing are probably fairly small, so never uninitializing will
probably not cause any problems. Resetting the object to None (or
del'ing it) is probably preferred though - if the object remains alive
and is cleaned up while the Python interpreter is finalizing I'd expect
things could still go wrong, and discarding the object completely at
close time seems sensible anyway.
If you can give me a connection string that is likely to fail for me, I
can run the example in a debug version of Python and check there isn't
some other bug in pywin32 or similar which could mitigate the entire
issue...
Thanks!
Mark
More information about the python-win32
mailing list