diff options
author | José Fonseca <jfonseca@vmware.com> | 2013-02-19 13:28:24 +0000 |
---|---|---|
committer | José Fonseca <jfonseca@vmware.com> | 2013-02-22 09:59:03 +0000 |
commit | a936afc3ebb349c3aec8b5a595706f3c9749ad37 (patch) | |
tree | 669ea8220b9ec1a9633ecb777035a374d76e5cc2 | |
parent | 677f59a10bf71b0bf1b73bfc9c1accbf719fafad (diff) |
d3dretrace: Replay IUnknown::AddRef/Release methods faithfully.
Several D3D APIs (especially recent ones) keep track of reference counts
and will ensure errors if reference counting is not properly done.
For example, IDXGISwapChain::ResizeBuffers will fail if there are
outstanding references to its buffers.
-rw-r--r-- | retrace/retrace.py | 5 | ||||
-rw-r--r-- | specs/winapi.py | 2 |
2 files changed, 3 insertions, 4 deletions
diff --git a/retrace/retrace.py b/retrace/retrace.py index d09d72aa..70926c0b 100644 --- a/retrace/retrace.py +++ b/retrace/retrace.py @@ -478,10 +478,9 @@ class Retracer: # On release our reference when we reach Release() == 0 call in the # trace. if method.name == 'Release': - print ' if (call.ret->toUInt()) {' - print ' return;' + print ' if (call.ret->toUInt() == 0) {' + print ' retrace::delObj(call.arg(0));' print ' }' - print ' retrace::delObj(call.arg(0));' arg_names = ", ".join(method.argNames()) if method.type is not stdapi.Void: diff --git a/specs/winapi.py b/specs/winapi.py index 031c8347..4436c6dd 100644 --- a/specs/winapi.py +++ b/specs/winapi.py @@ -206,7 +206,7 @@ IUnknown = Interface("IUnknown") IUnknown.methods = ( StdMethod(HRESULT, "QueryInterface", ((REFIID, "riid"), Out(Pointer(ObjPointer(Void)), "ppvObj"))), - StdMethod(ULONG, "AddRef", (), sideeffects=False), + StdMethod(ULONG, "AddRef", ()), StdMethod(ULONG, "Release", ()), ) |