Michael Stefaniuc : dmusic: Remove the port from the ports list on the port destruction.

Alexandre Julliard julliard at winehq.org
Fri May 12 11:48:07 CDT 2017


Module: wine
Branch: master
Commit: 62bf20783cf760fd09a0c9a2562819aacb7c9a53
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=62bf20783cf760fd09a0c9a2562819aacb7c9a53

Author: Michael Stefaniuc <mstefani at winehq.org>
Date:   Fri May 12 16:11:22 2017 +0200

dmusic: Remove the port from the ports list on the port destruction.

Signed-off-by: Michael Stefaniuc <mstefani at winehq.org>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/dmusic/dmusic.c         | 39 +++++++++++++++++++++++++++++++++++++--
 dlls/dmusic/dmusic_private.h |  2 ++
 dlls/dmusic/port.c           |  1 +
 dlls/dmusic/tests/dmusic.c   |  6 ++++++
 4 files changed, 46 insertions(+), 2 deletions(-)

diff --git a/dlls/dmusic/dmusic.c b/dlls/dmusic/dmusic.c
index 105e6f7..4199da4 100644
--- a/dlls/dmusic/dmusic.c
+++ b/dlls/dmusic/dmusic.c
@@ -160,9 +160,11 @@ static HRESULT WINAPI IDirectMusic8Impl_CreatePort(LPDIRECTMUSIC8 iface, REFCLSI
             }
             This->num_ports++;
             if (!This->ports)
-                This->ports = HeapAlloc(GetProcessHeap(), 0, sizeof(IDirectMusicPort *) * This->num_ports);
+                This->ports = HeapAlloc(GetProcessHeap(), 0,
+                        sizeof(*This->ports) * This->num_ports);
             else
-                This->ports = HeapReAlloc(GetProcessHeap(), 0, This->ports, sizeof(IDirectMusicPort *) * This->num_ports);
+                This->ports = HeapReAlloc(GetProcessHeap(), 0, This->ports,
+                        sizeof(*This->ports) * This->num_ports);
             This->ports[This->num_ports - 1] = new_port;
             *port = new_port;
             return S_OK;
@@ -172,6 +174,39 @@ static HRESULT WINAPI IDirectMusic8Impl_CreatePort(LPDIRECTMUSIC8 iface, REFCLSI
     return E_NOINTERFACE;
 }
 
+void dmusic_remove_port(IDirectMusic8Impl *dmusic, IDirectMusicPort *port)
+{
+    BOOL found = FALSE;
+    int i;
+
+    TRACE("Removing port %p.\n", port);
+
+    for (i = 0; i < dmusic->num_ports; i++)
+    {
+        if (dmusic->ports[i] == port) {
+            found = TRUE;
+            break;
+        }
+    }
+
+    if (!found)
+    {
+        ERR("Port %p not found in ports array.\n", port);
+        return;
+    }
+
+    if (!--dmusic->num_ports) {
+        HeapFree(GetProcessHeap(), 0, dmusic->ports);
+        dmusic->ports = NULL;
+        return;
+    }
+
+    memmove(&dmusic->ports[i], &dmusic->ports[i + 1],
+            (dmusic->num_ports - i) * sizeof(*dmusic->ports));
+    dmusic->ports = HeapReAlloc(GetProcessHeap(), 0, dmusic->ports,
+            sizeof(*dmusic->ports) * dmusic->num_ports);
+}
+
 static HRESULT WINAPI IDirectMusic8Impl_EnumMasterClock(LPDIRECTMUSIC8 iface, DWORD index, LPDMUS_CLOCKINFO clock_info)
 {
     TRACE("(%p)->(%d, %p)\n", iface, index, clock_info);
diff --git a/dlls/dmusic/dmusic_private.h b/dlls/dmusic/dmusic_private.h
index 8c77715..f9839ed 100644
--- a/dlls/dmusic/dmusic_private.h
+++ b/dlls/dmusic/dmusic_private.h
@@ -229,6 +229,8 @@ static inline void DMUSIC_UnlockModule(void) { InterlockedDecrement( &DMUSIC_ref
 /*****************************************************************************
  * Misc.
  */
+void dmusic_remove_port(IDirectMusic8Impl *dmusic, IDirectMusicPort *port) DECLSPEC_HIDDEN;
+
 /* for simpler reading */
 typedef struct _DMUS_PRIVATE_CHUNK {
 	FOURCC fccID; /* FOURCC ID of the chunk */
diff --git a/dlls/dmusic/port.c b/dlls/dmusic/port.c
index f2f7599..5064615 100644
--- a/dlls/dmusic/port.c
+++ b/dlls/dmusic/port.c
@@ -194,6 +194,7 @@ static ULONG WINAPI SynthPortImpl_IDirectMusicPort_Release(LPDIRECTMUSICPORT ifa
 
     if (!ref)
     {
+        dmusic_remove_port(This->parent, iface);
         IDirectMusicSynth_Activate(This->synth, FALSE);
         IDirectMusicSynth_Close(This->synth);
         IDirectMusicSynth_Release(This->synth);
diff --git a/dlls/dmusic/tests/dmusic.c b/dlls/dmusic/tests/dmusic.c
index f65dc7e..288a741 100644
--- a/dlls/dmusic/tests/dmusic.c
+++ b/dlls/dmusic/tests/dmusic.c
@@ -176,10 +176,16 @@ static void test_setdsound(void)
     ok(hr == S_OK, "CreatePort returned: %x\n", hr);
     ref = get_refcount(dsound);
     ok(ref == 2, "dsound ref count got %d expected 2\n", ref);
+    IDirectMusicPort_AddRef(port);
+    ref = IDirectMusicPort_Release(port);
+    ok(ref == 1, "port ref count got %d expected 1\n", ref);
     hr = IDirectMusicPort_Activate(port, TRUE);
     ok(hr == S_OK, "Port Activate returned: %x\n", hr);
     ref = get_refcount(dsound);
     ok(ref == 4, "dsound ref count got %d expected 4\n", ref);
+    IDirectMusicPort_AddRef(port);
+    ref = IDirectMusicPort_Release(port);
+    ok(ref == 1, "port ref count got %d expected 1\n", ref);
 
     /* Releasing dsound from dmusic */
     hr = IDirectMusic_SetDirectSound(dmusic, NULL, NULL);




More information about the wine-cvs mailing list