Commit bbdf6d5e authored by Zhiyi Zhang's avatar Zhiyi Zhang Committed by Alexandre Julliard

msacm32: Reference count local drivers.

One local driver can be assigned to multiple driver ids. When releasing the driver id, check if the reference count of a local driver is one before actually releasing the local driver. Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=46520Signed-off-by: 's avatarZhiyi Zhang <zzhang@codeweavers.com> Signed-off-by: 's avatarAndrew Eikum <aeikum@codeweavers.com> Signed-off-by: 's avatarAlexandre Julliard <julliard@winehq.org>
parent 699eb8cd
...@@ -737,12 +737,17 @@ static PWINE_ACMLOCALDRIVER MSACM_pLastACMLocalDriver; ...@@ -737,12 +737,17 @@ static PWINE_ACMLOCALDRIVER MSACM_pLastACMLocalDriver;
static PWINE_ACMLOCALDRIVER MSACM_UnregisterLocalDriver(PWINE_ACMLOCALDRIVER paldrv) static PWINE_ACMLOCALDRIVER MSACM_UnregisterLocalDriver(PWINE_ACMLOCALDRIVER paldrv)
{ {
PWINE_ACMLOCALDRIVER pNextACMLocalDriver; PWINE_ACMLOCALDRIVER pNextACMLocalDriver;
LONG ref;
if (paldrv->pACMInstList) { if (paldrv->pACMInstList) {
ERR("local driver instances still present after closing all drivers - memory leak\n"); ERR("local driver instances still present after closing all drivers - memory leak\n");
return NULL; return NULL;
} }
ref = InterlockedDecrement(&paldrv->ref);
if (ref)
return paldrv;
if (paldrv == MSACM_pFirstACMLocalDriver) if (paldrv == MSACM_pFirstACMLocalDriver)
MSACM_pFirstACMLocalDriver = paldrv->pNextACMLocalDrv; MSACM_pFirstACMLocalDriver = paldrv->pNextACMLocalDrv;
if (paldrv == MSACM_pLastACMLocalDriver) if (paldrv == MSACM_pLastACMLocalDriver)
...@@ -883,7 +888,11 @@ PWINE_ACMLOCALDRIVER MSACM_RegisterLocalDriver(HMODULE hModule, DRIVERPROC lpDri ...@@ -883,7 +888,11 @@ PWINE_ACMLOCALDRIVER MSACM_RegisterLocalDriver(HMODULE hModule, DRIVERPROC lpDri
/* look up previous instance of local driver module */ /* look up previous instance of local driver module */
for (paldrv = MSACM_pFirstACMLocalDriver; paldrv; paldrv = paldrv->pNextACMLocalDrv) for (paldrv = MSACM_pFirstACMLocalDriver; paldrv; paldrv = paldrv->pNextACMLocalDrv)
{ {
if (paldrv->hModule == hModule && paldrv->lpDrvProc == lpDriverProc) return paldrv; if (paldrv->hModule == hModule && paldrv->lpDrvProc == lpDriverProc)
{
InterlockedIncrement(&paldrv->ref);
return paldrv;
}
} }
paldrv = HeapAlloc(MSACM_hHeap, 0, sizeof(WINE_ACMLOCALDRIVER)); paldrv = HeapAlloc(MSACM_hHeap, 0, sizeof(WINE_ACMLOCALDRIVER));
...@@ -892,6 +901,7 @@ PWINE_ACMLOCALDRIVER MSACM_RegisterLocalDriver(HMODULE hModule, DRIVERPROC lpDri ...@@ -892,6 +901,7 @@ PWINE_ACMLOCALDRIVER MSACM_RegisterLocalDriver(HMODULE hModule, DRIVERPROC lpDri
paldrv->hModule = hModule; paldrv->hModule = hModule;
paldrv->lpDrvProc = lpDriverProc; paldrv->lpDrvProc = lpDriverProc;
paldrv->pACMInstList = NULL; paldrv->pACMInstList = NULL;
paldrv->ref = 1;
paldrv->pNextACMLocalDrv = NULL; paldrv->pNextACMLocalDrv = NULL;
paldrv->pPrevACMLocalDrv = MSACM_pLastACMLocalDriver; paldrv->pPrevACMLocalDrv = MSACM_pLastACMLocalDriver;
......
...@@ -52,6 +52,7 @@ typedef struct _WINE_ACMLOCALDRIVER ...@@ -52,6 +52,7 @@ typedef struct _WINE_ACMLOCALDRIVER
PWINE_ACMLOCALDRIVERINST pACMInstList; PWINE_ACMLOCALDRIVERINST pACMInstList;
PWINE_ACMLOCALDRIVER pNextACMLocalDrv; PWINE_ACMLOCALDRIVER pNextACMLocalDrv;
PWINE_ACMLOCALDRIVER pPrevACMLocalDrv; PWINE_ACMLOCALDRIVER pPrevACMLocalDrv;
LONG ref;
} WINE_ACMLOCALDRIVER; } WINE_ACMLOCALDRIVER;
typedef struct _WINE_ACMLOCALDRIVERINST typedef struct _WINE_ACMLOCALDRIVERINST
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment