[vlc-devel] [PATCH 2/3] win32: implement non-recursive locks

Rémi Denis-Courmont remi at remlab.net
Mon Jun 6 10:51:13 CEST 2016


Le 2016-06-06 10:19, Steve Lhomme a écrit :
> For non-recursive locks we keep track of the thread having the lock 
> and make
> sure it's not the current thread that already had the lock.
>
> lock_thread_id & b_recursive are always accessed in the 
> CriticalSection
> ---
>  include/vlc_threads.h |  9 ++++++++-
>  src/win32/thread.c    | 18 +++++++++++++++---
>  2 files changed, 23 insertions(+), 4 deletions(-)
>
> diff --git a/include/vlc_threads.h b/include/vlc_threads.h
> index 33b9b53..becd9d6 100644
> --- a/include/vlc_threads.h
> +++ b/include/vlc_threads.h
> @@ -65,7 +65,14 @@ typedef struct
>              bool locked;
>              unsigned long contention;
>          };
> -        CRITICAL_SECTION mutex;
> +        struct
> +        {
> +            CRITICAL_SECTION mutex;
> +
> +            /* non-recursive mutex */
> +            bool b_recursive;
> +            unsigned long lock_thread_id;

You need two booleans, of which one (locked) already exists in the 
static mutex case.

Moving all three booleans together at the top of the struct would 
provide better packing.

> +        };
>      };
>  } vlc_mutex_t;
>  #define VLC_STATIC_MUTEX { false, { { false, 0 } } }
> diff --git a/src/win32/thread.c b/src/win32/thread.c
> index 963a8d7..de611e8 100644
> --- a/src/win32/thread.c
> +++ b/src/win32/thread.c
> @@ -69,16 +69,16 @@ struct vlc_thread
>  /*** Mutexes ***/
>  void vlc_mutex_init( vlc_mutex_t *p_mutex )
>  {
> -    /* This creates a recursive mutex. This is OK as fast mutexes 
> have
> -     * no defined behavior in case of recursive locking. */
>      InitializeCriticalSection (&p_mutex->mutex);
>      p_mutex->dynamic = true;
> +    p_mutex->b_recursive = false;
>  }
>
>  void vlc_mutex_init_recursive( vlc_mutex_t *p_mutex )
>  {
>      InitializeCriticalSection( &p_mutex->mutex );
>      p_mutex->dynamic = true;
> +    p_mutex->b_recursive = true;
>  }
>
>
> @@ -109,6 +109,8 @@ void vlc_mutex_lock (vlc_mutex_t *p_mutex)
>      }
>
>      EnterCriticalSection (&p_mutex->mutex);
> +    assert(p_mutex->b_recursive || p_mutex->lock_thread_id !=
> vlc_thread_id());
> +    p_mutex->lock_thread_id = vlc_thread_id();
>  }
>
>  int vlc_mutex_trylock (vlc_mutex_t *p_mutex)
> @@ -128,7 +130,16 @@ int vlc_mutex_trylock (vlc_mutex_t *p_mutex)
>          return ret;
>      }
>
> -    return TryEnterCriticalSection (&p_mutex->mutex) ? 0 : EBUSY;
> +    int ret = TryEnterCriticalSection (&p_mutex->mutex);
> +    assert(p_mutex->b_recursive || p_mutex->lock_thread_id !=
> vlc_thread_id());
> +    if (!ret)
> +        return EBUSY;
> +
> +    if (!p_mutex->b_recursive && p_mutex->lock_thread_id == 
> vlc_thread_id())
> +        return EBUSY; /* we already had the non-recursive lock */
> +
> +    p_mutex->lock_thread_id = vlc_thread_id();
> +    return 0;

I suspect that if (recursive) ... else ... would be more legible.

>  }
>
>  void vlc_mutex_unlock (vlc_mutex_t *p_mutex)
> @@ -146,6 +157,7 @@ void vlc_mutex_unlock (vlc_mutex_t *p_mutex)
>          return;
>      }
>
> +    p_mutex->lock_thread_id = 0;
>      LeaveCriticalSection (&p_mutex->mutex);
>  }

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


More information about the vlc-devel mailing list