[Mesa-dev] [PATCH 01/13] c11/threads: Assert that mtx is non-NULL and check return values.

Timothy Arceri t_arceri at yahoo.com.au
Thu Aug 6 18:07:07 PDT 2015


On Thu, 2015-08-06 at 17:10 -0700, Matt Turner wrote:
> Passing NULL to C11 threads functions isn't safe, so there's no need for
> our implementation to handle it. Cuts about 1k of .text.
> 
>    text     data      bss      dec      hex  filename
> 5009514   198440    26328  5234282   4fde6a  i965_dri.so before
> 5008346   198440    26328  5233114   4fd9da  i965_dri.so after
> ---
>  include/c11/threads_posix.h | 48 ++++++++++++++++++++++--------------------
> ---
>  1 file changed, 23 insertions(+), 25 deletions(-)
> 
> diff --git a/include/c11/threads_posix.h b/include/c11/threads_posix.h
> index 2182c28..3def6c4 100644
> --- a/include/c11/threads_posix.h
> +++ b/include/c11/threads_posix.h
> @@ -102,9 +102,8 @@ call_once(once_flag *flag, void (*func)(void))
>  static inline int
>  cnd_broadcast(cnd_t *cond)
>  {
> -    if (!cond) return thrd_error;
> -    pthread_cond_broadcast(cond);
> -    return thrd_success;
> +    assert(cond != NULL);
> +    return (pthread_cond_broadcast(cond) == 0) ? thrd_success : thrd_error;
>  }
>  
>  // 7.25.3.2
> @@ -119,18 +118,16 @@ cnd_destroy(cnd_t *cond)
>  static inline int
>  cnd_init(cnd_t *cond)
>  {
> -    if (!cond) return thrd_error;
> -    pthread_cond_init(cond, NULL);
> -    return thrd_success;
> +    assert(cond != NULL);
> +    return (pthread_cond_init(cond, NULL) == 0) ? thrd_success : 
> thrd_error;
>  }
>  
>  // 7.25.3.4
>  static inline int
>  cnd_signal(cnd_t *cond)
>  {
> -    if (!cond) return thrd_error;
> -    pthread_cond_signal(cond);
> -    return thrd_success;
> +    assert(cond != NULL);
> +    return (pthread_cond_signal(cond) == 0) ? thrd_success : thrd_error;
>  }
>  
>  // 7.25.3.5
> @@ -139,7 +136,8 @@ cnd_timedwait(cnd_t *cond, mtx_t *mtx, const xtime *xt)
>  {
>      struct timespec abs_time;
>      int rt;
> -    if (!cond || !mtx || !xt) return thrd_error;
> +    assert(mtx != NULL);
> +    assert(cond != NULL);

Even though its not used in this wrapper I guess you could have assert(xt !=
NULL); to catch any potential misuse of the real c11/threads here. Up to you
if you think its important.

Reviewed-by: Timothy Arceri <t_arceri at yahoo.com.au>


>      rt = pthread_cond_timedwait(cond, mtx, &abs_time);
>      if (rt == ETIMEDOUT)
>          return thrd_busy;
> @@ -150,9 +148,9 @@ cnd_timedwait(cnd_t *cond, mtx_t *mtx, const xtime *xt)
>  static inline int
>  cnd_wait(cnd_t *cond, mtx_t *mtx)
>  {
> -    if (!cond || !mtx) return thrd_error;
> -    pthread_cond_wait(cond, mtx);
> -    return thrd_success;
> +    assert(mtx != NULL);
> +    assert(cond != NULL);
> +    return (pthread_cond_wait(cond, mtx) == 0) ? thrd_success : thrd_error;
>  }
>  
>  
> @@ -161,7 +159,7 @@ cnd_wait(cnd_t *cond, mtx_t *mtx)
>  static inline void
>  mtx_destroy(mtx_t *mtx)
>  {
> -    assert(mtx);
> +    assert(mtx != NULL);
>      pthread_mutex_destroy(mtx);
>  }
>  
> @@ -170,7 +168,7 @@ static inline int
>  mtx_init(mtx_t *mtx, int type)
>  {
>      pthread_mutexattr_t attr;
> -    if (!mtx) return thrd_error;
> +    assert(mtx != NULL);
>      if (type != mtx_plain && type != mtx_timed && type != mtx_try
>        && type != (mtx_plain|mtx_recursive)
>        && type != (mtx_timed|mtx_recursive)
> @@ -188,9 +186,8 @@ mtx_init(mtx_t *mtx, int type)
>  static inline int
>  mtx_lock(mtx_t *mtx)
>  {
> -    if (!mtx) return thrd_error;
> -    pthread_mutex_lock(mtx);
> -    return thrd_success;
> +    assert(mtx != NULL);
> +    return (pthread_mutex_lock(mtx) == 0) ? thrd_success : thrd_error;
>  }
>  
>  static inline int
> @@ -203,7 +200,9 @@ thrd_yield(void);
>  static inline int
>  mtx_timedlock(mtx_t *mtx, const xtime *xt)
>  {
> -    if (!mtx || !xt) return thrd_error;
> +    assert(mtx != NULL);
> +    assert(xt != NULL);
> +
>      {
>  #ifdef EMULATED_THREADS_USE_NATIVE_TIMEDLOCK
>      struct timespec ts;
> @@ -233,7 +232,7 @@ mtx_timedlock(mtx_t *mtx, const xtime *xt)
>  static inline int
>  mtx_trylock(mtx_t *mtx)
>  {
> -    if (!mtx) return thrd_error;
> +    assert(mtx != NULL);
>      return (pthread_mutex_trylock(mtx) == 0) ? thrd_success : thrd_busy;
>  }
>  
> @@ -241,9 +240,8 @@ mtx_trylock(mtx_t *mtx)
>  static inline int
>  mtx_unlock(mtx_t *mtx)
>  {
> -    if (!mtx) return thrd_error;
> -    pthread_mutex_unlock(mtx);
> -    return thrd_success;
> +    assert(mtx != NULL);
> +    return (pthread_mutex_unlock(mtx) == 0) ? thrd_success : thrd_error;
>  }
>  
>  
> @@ -253,7 +251,7 @@ static inline int
>  thrd_create(thrd_t *thr, thrd_start_t func, void *arg)
>  {
>      struct impl_thrd_param *pack;
> -    if (!thr) return thrd_error;
> +    assert(thr != NULL);
>      pack = (struct impl_thrd_param *)malloc(sizeof(struct 
> impl_thrd_param));
>      if (!pack) return thrd_nomem;
>      pack->func = func;
> @@ -329,7 +327,7 @@ thrd_yield(void)
>  static inline int
>  tss_create(tss_t *key, tss_dtor_t dtor)
>  {
> -    if (!key) return thrd_error;
> +    assert(key != NULL);
>      return (pthread_key_create(key, dtor) == 0) ? thrd_success : 
> thrd_error;
>  }
>  


More information about the mesa-dev mailing list