[PATCH v3 2/6] winegstreamer: Release wg_transform output sample when too small.

Zebediah Figura zfigura at codeweavers.com
Fri Jun 24 01:22:01 CDT 2022


On 6/23/22 12:12, Rémi Bernon wrote:
> From: Rémi Bernon <rbernon at codeweavers.com>
> 
> Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
> ---
>   dlls/winegstreamer/wg_transform.c | 9 +++++++--
>   1 file changed, 7 insertions(+), 2 deletions(-)
> 
> diff --git a/dlls/winegstreamer/wg_transform.c b/dlls/winegstreamer/wg_transform.c
> index e05432f6ac7..b0048fad644 100644
> --- a/dlls/winegstreamer/wg_transform.c
> +++ b/dlls/winegstreamer/wg_transform.c
> @@ -314,10 +314,15 @@ static struct wg_sample *transform_request_sample(gsize size, void *context)
>   
>       GST_LOG("size %#zx, context %p", size, transform);
>   
> -    sample = InterlockedExchangePointer((void **)&transform->output_wg_sample, NULL);
> -    if (!sample || sample->max_size < size)
> +    if (!(sample = InterlockedExchangePointer((void **)&transform->output_wg_sample, NULL)))
>           return NULL;
>   
> +    if (sample->max_size < size)
> +    {
> +        InterlockedDecrement(&sample->refcount);
> +        return NULL;
> +    }
> +
>       return sample;
>   }
>   

I'll sign off on this because it's an improvement over the current code, 
but on reflection I think this pattern is not very idiomatic. More 
idiomatic would be to protect the whole thing with a lock, and not set 
the pointer to NULL in this function (but instead add an extra reference).



More information about the wine-devel mailing list