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

KO Myung-Hun komh78 at gmail.com
Thu Jun 11 12:58:11 CEST 2015


Hi/2.

Rémi Denis-Courmont wrote:
> 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()?

On OS/2, termination codes of _DLL_InitTerm() is called when calling
dlclose(). So if you call dlclose(), vlc_static_cond_destroy_all() will
be executed before DLL is unloaded.

> 
> (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)
> 



More information about the vlc-devel mailing list