mirror of
git://source.winehq.org/git/wine.git
synced 2024-09-15 07:05:08 +00:00
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=46520 Signed-off-by: Zhiyi Zhang <zzhang@codeweavers.com> Signed-off-by: Andrew Eikum <aeikum@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
699eb8cdba
commit
bbdf6d5e21
|
@ -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
|
||||||
/* 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
|
||||||
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
|
||||||
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
|
||||||
|
|
Loading…
Reference in a new issue