From d5d1a288e9bc7a108a6b7b46e22ca2d617df88b4 Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Fri, 4 Mar 2016 07:20:18 +0300 Subject: [PATCH] d3drm: Remove first found callback, not all of them. Signed-off-by: Nikolay Sivov Signed-off-by: Henri Verbeet Signed-off-by: Alexandre Julliard --- dlls/d3drm/d3drm_main.c | 5 +++-- dlls/d3drm/tests/d3drm.c | 44 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/dlls/d3drm/d3drm_main.c b/dlls/d3drm/d3drm_main.c index 62ad5b924d3..67d1ad1d972 100644 --- a/dlls/d3drm/d3drm_main.c +++ b/dlls/d3drm/d3drm_main.c @@ -77,17 +77,18 @@ HRESULT d3drm_object_add_destroy_callback(struct d3drm_object *object, D3DRMOBJE HRESULT d3drm_object_delete_destroy_callback(struct d3drm_object *object, D3DRMOBJECTCALLBACK cb, void *ctx) { - struct destroy_callback *callback, *callback2; + struct destroy_callback *callback; if (!cb) return D3DRMERR_BADVALUE; - LIST_FOR_EACH_ENTRY_SAFE(callback, callback2, &object->destroy_callbacks, struct destroy_callback, entry) + LIST_FOR_EACH_ENTRY(callback, &object->destroy_callbacks, struct destroy_callback, entry) { if (callback->cb == cb && callback->ctx == ctx) { list_remove(&callback->entry); HeapFree(GetProcessHeap(), 0, callback); + break; } } diff --git a/dlls/d3drm/tests/d3drm.c b/dlls/d3drm/tests/d3drm.c index 77b4d5950d3..8a125fc70bf 100644 --- a/dlls/d3drm/tests/d3drm.c +++ b/dlls/d3drm/tests/d3drm.c @@ -1355,6 +1355,26 @@ static void test_Viewport(void) IDirect3DRMViewport_Release(viewport); ok(context.called == 3, "got %d, expected 3\n", context.called); + /* test this pattern - add cb1, add cb2, add cb1, delete cb1 */ + hr = IDirect3DRM_CreateViewport(d3drm, device, frame, rc.left, rc.top, rc.right, rc.bottom, &viewport); + ok(hr == D3DRM_OK, "Cannot get IDirect3DRMViewport interface (hr = %x)\n", hr); + + hr = IDirect3DRMViewport_AddDestroyCallback(viewport, destroy_callback, &context); + ok(hr == D3DRM_OK, "expected D3DRM_OK (hr = %x)\n", hr); + + hr = IDirect3DRMViewport_AddDestroyCallback(viewport, destroy_callback1, &context); + ok(hr == D3DRM_OK, "expected D3DRM_OK (hr = %x)\n", hr); + + hr = IDirect3DRMViewport_AddDestroyCallback(viewport, destroy_callback, &context); + ok(hr == D3DRM_OK, "expected D3DRM_OK (hr = %x)\n", hr); + + hr = IDirect3DRMViewport_DeleteDestroyCallback(viewport, destroy_callback, &context); + ok(hr == D3DRM_OK, "expected D3DRM_OK (hr = %x)\n", hr); + + context.called = 0; + IDirect3DRMViewport_Release(viewport); + ok(context.called == 2, "got %d, expected 2\n", context.called); + /* destroy from Viewport2 */ hr = IDirect3DRM_CreateViewport(d3drm, device, frame, rc.left, rc.top, rc.right, rc.bottom, &viewport); ok(hr == D3DRM_OK, "Cannot get IDirect3DRMViewport interface (hr = %x)\n", hr); @@ -1395,6 +1415,30 @@ static void test_Viewport(void) IDirect3DRMViewport2_Release(viewport2); ok(context.called == 3, "got %d, expected 3\n", context.called); + /* test this pattern - add cb1, add cb2, add cb1, delete cb1 */ + hr = IDirect3DRM_CreateViewport(d3drm, device, frame, rc.left, rc.top, rc.right, rc.bottom, &viewport); + ok(hr == D3DRM_OK, "Cannot get IDirect3DRMViewport interface (hr = %x)\n", hr); + + hr = IDirect3DRMViewport_QueryInterface(viewport, &IID_IDirect3DRMViewport2, (void**)&viewport2); + ok(hr == D3DRM_OK, "expected D3DRM_OK (hr = %x)\n", hr); + IDirect3DRMViewport_Release(viewport); + + hr = IDirect3DRMViewport2_AddDestroyCallback(viewport2, destroy_callback, &context); + ok(hr == D3DRM_OK, "expected D3DRM_OK (hr = %x)\n", hr); + + hr = IDirect3DRMViewport2_AddDestroyCallback(viewport2, destroy_callback1, &context); + ok(hr == D3DRM_OK, "expected D3DRM_OK (hr = %x)\n", hr); + + hr = IDirect3DRMViewport2_AddDestroyCallback(viewport2, destroy_callback, &context); + ok(hr == D3DRM_OK, "expected D3DRM_OK (hr = %x)\n", hr); + + hr = IDirect3DRMViewport2_DeleteDestroyCallback(viewport2, destroy_callback, &context); + ok(hr == D3DRM_OK, "expected D3DRM_OK (hr = %x)\n", hr); + + context.called = 0; + IDirect3DRMViewport2_Release(viewport2); + ok(context.called == 2, "got %d, expected 2\n", context.called); + IDirect3DRMFrame_Release(frame); IDirect3DRMDevice_Release(device); IDirectDrawClipper_Release(pClipper);