[vlc-devel] [PATCH 6/6] os2: thread: support static condition variable

Rémi Denis-Courmont remi at remlab.net
Wed Jun 10 21:20:57 CEST 2015


Le mercredi 10 juin 2015, 12:27:29 KO Myung-Hun a écrit :
> ---
>  src/os2/thread.c | 73
> +++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 59
> insertions(+), 14 deletions(-)
> 
> diff --git a/src/os2/thread.c b/src/os2/thread.c
> index 3d430ea..6955f9c 100644
> --- a/src/os2/thread.c
> +++ b/src/os2/thread.c
> @@ -132,6 +132,8 @@ static vlc_mutex_t super_mutex;
>  static vlc_cond_t  super_variable;
>  extern vlc_rwlock_t config_lock;
> 
> +static void vlc_static_cond_destroy_all(void);
> +
>  int _CRT_init(void);
>  void _CRT_term(void);
> 
> @@ -160,6 +162,7 @@ unsigned long _System _DLL_InitTerm(unsigned long hmod,
> unsigned long flag) vlc_threadvar_delete (&thread_key);
>              vlc_cond_destroy (&super_variable);
>              vlc_mutex_destroy (&super_mutex);
> +            vlc_static_cond_destroy_all ();
> 
>              _CRT_term();
> 
> @@ -272,6 +275,54 @@ static void vlc_cond_init_common (vlc_cond_t
> *p_condvar, unsigned clock) p_condvar->clock = clock;
>  }
> 
> +typedef struct vlc_static_cond_t vlc_static_cond_t;
> +
> +struct vlc_static_cond_t
> +{
> +    vlc_cond_t condvar;
> +    vlc_static_cond_t *next;
> +};
> +
> +static vlc_static_cond_t *static_condvar_start = NULL;
> +
> +static void vlc_static_cond_init (vlc_cond_t *p_condvar)
> +{
> +    vlc_mutex_lock (&super_mutex);
> +
> +    if (p_condvar->hev == NULLHANDLE)
> +    {
> +        vlc_cond_init_common (p_condvar, p_condvar->clock);
> +
> +        vlc_static_cond_t *new_static_condvar;
> +
> +        new_static_condvar = malloc (sizeof (*new_static_condvar));
> +        if (unlikely (!new_static_condvar))
> +            abort();
> +
> +        memcpy (&new_static_condvar->condvar, p_condvar, sizeof
> (*p_condvar));
> +        new_static_condvar->next = static_condvar_start;
> +        static_condvar_start = new_static_condvar;

Won´t this leave stale pointers after dlclose() and crash in 
vlc_static_cond_destroy_all()?

(Currently, there are no static condition variables in any plugin, but nothing 
prevents it in the future.)

> +    }
> +
> +    vlc_mutex_unlock (&super_mutex);
> +}
> +
> +static void vlc_static_cond_destroy_all (void)
> +{
> +    vlc_static_cond_t *static_condvar;
> +    vlc_static_cond_t *static_condvar_next;
> +
> +
> +    for (static_condvar = static_condvar_start; static_condvar;
> +         static_condvar = static_condvar_next)
> +    {
> +        static_condvar_next = static_condvar->next;
> +
> +        vlc_cond_destroy (&static_condvar->condvar);
> +        free (static_condvar);
> +    }
> +}
> +
>  void vlc_cond_init (vlc_cond_t *p_condvar)
>  {
>      vlc_cond_init_common (p_condvar, CLOCK_MONOTONIC);
> @@ -290,8 +341,8 @@ void vlc_cond_destroy (vlc_cond_t *p_condvar)
> 
>  void vlc_cond_signal (vlc_cond_t *p_condvar)
>  {
> -    if (!p_condvar->hev)
> -        return;
> +    if (p_condvar->hev == NULLHANDLE)
> +        vlc_static_cond_init (p_condvar);
> 
>      if (!__atomic_cmpxchg32 (&p_condvar->waiters, 0, 0))
>      {
> @@ -319,8 +370,8 @@ void vlc_cond_signal (vlc_cond_t *p_condvar)
> 
>  void vlc_cond_broadcast (vlc_cond_t *p_condvar)
>  {
> -    if (!p_condvar->hev)
> -        return;
> +    if (p_condvar->hev == NULLHANDLE)
> +        vlc_static_cond_init (p_condvar);
> 
>      while (!__atomic_cmpxchg32 (&p_condvar->waiters, 0, 0))
>          vlc_cond_signal (p_condvar);
> @@ -358,11 +409,8 @@ static int vlc_cond_wait_common (vlc_cond_t *p_condvar,
> vlc_mutex_t *p_mutex,
> 
>  void vlc_cond_wait (vlc_cond_t *p_condvar, vlc_mutex_t *p_mutex)
>  {
> -    if (!p_condvar->hev)
> -    {   /* FIXME FIXME FIXME */
> -        msleep (50000);
> -        return;
> -    }
> +    if (p_condvar->hev == NULLHANDLE)
> +        vlc_static_cond_init (p_condvar);
> 
>      vlc_cond_wait_common (p_condvar, p_mutex, SEM_INDEFINITE_WAIT);
>  }
> @@ -372,11 +420,8 @@ int vlc_cond_timedwait (vlc_cond_t *p_condvar,
> vlc_mutex_t *p_mutex, {
>      ULONG   ulTimeout;
> 
> -    if (!p_condvar->hev)
> -    {   /* FIXME FIXME FIXME */
> -        msleep (50000);
> -        return 0;
> -    }
> +    if (p_condvar->hev == NULLHANDLE)
> +        vlc_static_cond_init (p_condvar);
> 
>      mtime_t total;
>      switch (p_condvar->clock)

-- 
Rémi Denis-Courmont
Remlab T:mi
http://www.remlab.net/




More information about the vlc-devel mailing list