[PATCH] msacm32: Reference count local drivers.
Michael Stefaniuc
mstefani at winehq.org
Thu Jan 10 15:00:26 CST 2019
On 1/10/19 5:42 PM, Andrew Eikum wrote:
> Looks good to me, but I think it should be deferred until after 4.0
> since it doesn't fix a regression.
Well, bug fixes should be fine at the moment too. A Wine-Bug tag is
highly recommended though.
bye
michael
>
> Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
>
> On Wed, Jan 09, 2019 at 10:37:32PM +0800, Zhiyi Zhang wrote:
>> 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.
>>
>> Fix Kindred Spirits on the Roof (Steam ID: 402620) crashing
>> at multiple places.
>>
>> Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
>> ---
>> dlls/msacm32/internal.c | 12 +++++++++++-
>> dlls/msacm32/wineacm.h | 1 +
>> 2 files changed, 12 insertions(+), 1 deletion(-)
>>
>> diff --git a/dlls/msacm32/internal.c b/dlls/msacm32/internal.c
>> index aad071e8ad..7d324a8b27 100644
>> --- a/dlls/msacm32/internal.c
>> +++ b/dlls/msacm32/internal.c
>> @@ -737,12 +737,17 @@ static PWINE_ACMLOCALDRIVER MSACM_pLastACMLocalDriver;
>> static PWINE_ACMLOCALDRIVER MSACM_UnregisterLocalDriver(PWINE_ACMLOCALDRIVER paldrv)
>> {
>> PWINE_ACMLOCALDRIVER pNextACMLocalDriver;
>> + LONG ref;
>>
>> if (paldrv->pACMInstList) {
>> ERR("local driver instances still present after closing all drivers - memory leak\n");
>> return NULL;
>> }
>>
>> + ref = InterlockedDecrement(&paldrv->ref);
>> + if (ref)
>> + return paldrv;
>> +
>> if (paldrv == MSACM_pFirstACMLocalDriver)
>> MSACM_pFirstACMLocalDriver = paldrv->pNextACMLocalDrv;
>> if (paldrv == MSACM_pLastACMLocalDriver)
>> @@ -883,7 +888,11 @@ PWINE_ACMLOCALDRIVER MSACM_RegisterLocalDriver(HMODULE hModule, DRIVERPROC lpDri
>> /* look up previous instance of local driver module */
>> 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));
>> @@ -892,6 +901,7 @@ PWINE_ACMLOCALDRIVER MSACM_RegisterLocalDriver(HMODULE hModule, DRIVERPROC lpDri
>> paldrv->hModule = hModule;
>> paldrv->lpDrvProc = lpDriverProc;
>> paldrv->pACMInstList = NULL;
>> + paldrv->ref = 1;
>>
>> paldrv->pNextACMLocalDrv = NULL;
>> paldrv->pPrevACMLocalDrv = MSACM_pLastACMLocalDriver;
>> diff --git a/dlls/msacm32/wineacm.h b/dlls/msacm32/wineacm.h
>> index 406e01bf21..98d1ab5a2c 100644
>> --- a/dlls/msacm32/wineacm.h
>> +++ b/dlls/msacm32/wineacm.h
>> @@ -52,6 +52,7 @@ typedef struct _WINE_ACMLOCALDRIVER
>> PWINE_ACMLOCALDRIVERINST pACMInstList;
>> PWINE_ACMLOCALDRIVER pNextACMLocalDrv;
>> PWINE_ACMLOCALDRIVER pPrevACMLocalDrv;
>> + LONG ref;
>> } WINE_ACMLOCALDRIVER;
>>
>> typedef struct _WINE_ACMLOCALDRIVERINST
>> --
>> 2.19.2
>>
>>
>>
>
>
More information about the wine-devel
mailing list