[prev in list] [next in list] [prev in thread] [next in thread] 

List:       wine-devel
Subject:    Re: [PATCH 1/4] amstream: Implement IDirectDrawStreamSample::CompletionStatus.
From:       Zebediah Figura <zfigura () codeweavers ! com>
Date:       2020-09-30 16:39:35
Message-ID: 17d92fe5-0398-36f4-7a44-badb78977348 () codeweavers ! com
[Download RAW message or body]

[Attachment #2 (multipart/mixed)]


On 9/29/20 2:09 PM, Anton Baskanov wrote:
> Signed-off-by: Anton Baskanov <baskanov@gmail.com>
> ---
> dlls/amstream/ddrawstream.c    |  31 +++-
> dlls/amstream/tests/amstream.c | 280 +++++++++++++++++++++++++++++++++
> 2 files changed, 308 insertions(+), 3 deletions(-)
> 
> diff --git a/dlls/amstream/ddrawstream.c b/dlls/amstream/ddrawstream.c
> index 972c2b9f4d0..9020828f578 100644
> --- a/dlls/amstream/ddrawstream.c
> +++ b/dlls/amstream/ddrawstream.c
> @@ -1491,6 +1491,7 @@ static HRESULT WINAPI \
> ddraw_sample_Update(IDirectDrawStreamSample *iface, }
> if (!sample->parent->peer || sample->parent->eos)
> {
> +        sample->update_hr = MS_S_ENDOFSTREAM;
> LeaveCriticalSection(&sample->parent->cs);
> return MS_S_ENDOFSTREAM;
> }
> @@ -1517,9 +1518,33 @@ static HRESULT WINAPI \
> ddraw_sample_Update(IDirectDrawStreamSample *iface, 
> static HRESULT WINAPI ddraw_sample_CompletionStatus(IDirectDrawStreamSample *iface, \
> DWORD flags, DWORD milliseconds) {
> -    FIXME("(%p)->(%x,%u): stub\n", iface, flags, milliseconds);
> +    struct ddraw_sample *sample = impl_from_IDirectDrawStreamSample(iface);
> +    HRESULT hr;
> 
> -    return E_NOTIMPL;
> +    TRACE("sample %p, flags %#x, milliseconds %u.\n", sample, flags, \
> milliseconds); +
> +    EnterCriticalSection(&sample->parent->cs);
> +
> +    if (sample->update_hr == MS_S_PENDING)
> +    {
> +        if (flags & (COMPSTAT_NOUPDATEOK | COMPSTAT_ABORT))
> +        {
> +            sample->update_hr = MS_S_NOUPDATE;
> +            remove_queued_update(sample);
> +        }
> +        else if (flags & COMPSTAT_WAIT)
> +        {
> +            LeaveCriticalSection(&sample->parent->cs);
> +            WaitForSingleObject(sample->update_event, milliseconds);
> +            EnterCriticalSection(&sample->parent->cs);
> +        }
> +    }
> +
> +    hr = sample->update_hr;
> +
> +    LeaveCriticalSection(&sample->parent->cs);
> +
> +    return hr;
> }
> 

This is another place where I think it would be a good idea to use a
condition variable.

Could you please add a test with (COMPSTAT_NOUPDATEOK | COMPSTAT_WAIT,
INFINITE) and (COMPSTAT_ABORT | COMPSTAT_WAIT, INFINITE), to show that
the WAIT flag doesn't matter?


["signature.asc" (application/pgp-signature)]

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic