[vlc-devel] [PATCH 2/2] threads: winstore: Use native wait condition implementation

Jean-Baptiste Kempf jb at videolan.org
Sun Nov 23 00:03:40 CET 2014


WIN32_WINNT >= 0x600 more than WinSTore, no?

On 20 Nov, Hugo Beauzée-Luyssen wrote :
> ---
>  include/vlc_threads.h |  4 ++++
>  src/win32/thread.c    | 44 +++++++++++++++++++++++++++++++++++++++-----
>  2 files changed, 43 insertions(+), 5 deletions(-)
> 
> diff --git a/include/vlc_threads.h b/include/vlc_threads.h
> index 00435cb..45a733d 100644
> --- a/include/vlc_threads.h
> +++ b/include/vlc_threads.h
> @@ -57,7 +57,11 @@ typedef struct
>  #define VLC_STATIC_MUTEX { false, { { false, 0 } } }
>  typedef struct
>  {
> +#ifndef VLC_WINSTORE_APP
>      HANDLE   handle;
> +#else
> +    CONDITION_VARIABLE cond;
> +#endif
>      unsigned clock;
>  } vlc_cond_t;
>  #define VLC_STATIC_COND { 0, 0 }
> diff --git a/src/win32/thread.c b/src/win32/thread.c
> index 1cb2ee0..32fef2b 100644
> --- a/src/win32/thread.c
> +++ b/src/win32/thread.c
> @@ -202,10 +202,14 @@ enum
>  
>  static void vlc_cond_init_common (vlc_cond_t *p_condvar, unsigned clock)
>  {
> +#ifndef VLC_WINSTORE_APP
>      /* Create a manual-reset event (manual reset is needed for broadcast). */
>      p_condvar->handle = CreateEvent (NULL, TRUE, FALSE, NULL);
>      if (!p_condvar->handle)
>          abort();
> +#else
> +    InitializeConditionVariable(&p_condvar->cond);
> +#endif
>      p_condvar->clock = clock;
>  }
>  
> @@ -221,7 +225,9 @@ void vlc_cond_init_daytime (vlc_cond_t *p_condvar)
>  
>  void vlc_cond_destroy (vlc_cond_t *p_condvar)
>  {
> +#ifndef VLC_WINSTORE_APP
>      CloseHandle (p_condvar->handle);
> +#endif
>  }
>  
>  void vlc_cond_signal (vlc_cond_t *p_condvar)
> @@ -229,8 +235,12 @@ void vlc_cond_signal (vlc_cond_t *p_condvar)
>      if (!p_condvar->clock)
>          return;
>  
> +#ifndef VLC_WINSTORE_APP
>      /* This is suboptimal but works. */
>      vlc_cond_broadcast (p_condvar);
> +#else
> +    WakeConditionVariable(&p_condvar->cond);
> +#endif
>  }
>  
>  void vlc_cond_broadcast (vlc_cond_t *p_condvar)
> @@ -238,20 +248,25 @@ void vlc_cond_broadcast (vlc_cond_t *p_condvar)
>      if (!p_condvar->clock)
>          return;
>  
> +#ifndef VLC_WINSTORE_APP
>      /* Wake all threads up (as the event HANDLE has manual reset) */
>      SetEvent (p_condvar->handle);
> +#else
> +    WakeAllConditionVariable(&p_condvar->cond);
> +#endif
>  }
>  
>  void vlc_cond_wait (vlc_cond_t *p_condvar, vlc_mutex_t *p_mutex)
>  {
> -    DWORD result;
> -
>      if (!p_condvar->clock)
>      {   /* FIXME FIXME FIXME */
> -        msleep (50000);
> +        msleep(50000);
>          return;
>      }
>  
> +#ifndef VLC_WINSTORE_APP
> +    DWORD result;
> +
>      do
>      {
>          vlc_testcancel ();
> @@ -262,12 +277,16 @@ void vlc_cond_wait (vlc_cond_t *p_condvar, vlc_mutex_t *p_mutex)
>      while (result == WAIT_IO_COMPLETION);
>  
>      ResetEvent (p_condvar->handle);
> +#else
> +    vlc_cond_timedwait(p_condvar, p_mutex, INFINITE);
> +#endif
>  }
>  
>  int vlc_cond_timedwait (vlc_cond_t *p_condvar, vlc_mutex_t *p_mutex,
>                          mtime_t deadline)
>  {
>      DWORD result;
> +    DWORD delay;
>  
>      do
>      {
> @@ -292,14 +311,29 @@ int vlc_cond_timedwait (vlc_cond_t *p_condvar, vlc_mutex_t *p_mutex,
>          if( total < 0 )
>              total = 0;
>  
> -        DWORD delay = (total > 0x7fffffff) ? 0x7fffffff : total;
> -        vlc_mutex_unlock (p_mutex);
> +        delay = (total > 0x7fffffff) ? 0x7fffffff : total;
> +#ifndef VLC_WINSTORE_APP
> +        vlc_mutex_unlock(p_mutex);
>          result = vlc_WaitForSingleObject (p_condvar->handle, delay);
>          vlc_mutex_lock (p_mutex);
>      }
>      while (result == WAIT_IO_COMPLETION);
>  
>      ResetEvent (p_condvar->handle);
> +#else
> +        DWORD new_delay = 50;
> +        if (new_delay > delay)
> +            new_delay = delay;
> +        if (SleepConditionVariableCS(&p_condvar->cond, &p_mutex->mutex, new_delay))
> +            return 0;
> +        if (delay != INFINITE)
> +            delay -= new_delay;
> +        result = GetLastError();
> +        if (isCancelled())
> +            result = WAIT_IO_COMPLETION;
> +    }
> +    while (delay);
> +#endif
>  
>      return (result == WAIT_OBJECT_0) ? 0 : ETIMEDOUT;
>  }
> -- 
> 1.8.5.2 (Apple Git-48)
> 
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel

-- 
With my kindest regards,

-- 
Jean-Baptiste Kempf
http://www.jbkempf.com/ - +33 672 704 734
Sent from my Electronic Device



More information about the vlc-devel mailing list