[Mesa-dev] pipebuffer: Use pipe_condvar instead of ifdef'd sys_yield()

José Fonseca jfonseca at vmware.com
Tue Jul 6 03:46:11 PDT 2010


The patch looks good, but we don't support pipe_condvar on Windows yet.
I'd prefer to see the commit deferred until we do.

Any takers to implement pipe_condvar on Windows? There's even a nice
tutorial on http://locklessinc.com/articles/pthreads_on_windows/

Jose

On Mon, 2010-07-05 at 09:53 -0700, nobled wrote:
> This way there's fewer ifdef's *and* less busy-waiting.
> ---
>  .../auxiliary/pipebuffer/pb_buffer_fenced.c        |   19 +++++++------------
>  1 files changed, 7 insertions(+), 12 deletions(-)
> 
> diff --git a/src/gallium/auxiliary/pipebuffer/pb_buffer_fenced.c
> b/src/gallium/auxiliary/pipebuffer/pb_buffer_fenced.c
> index d6cf640..db3617e 100644
> --- a/src/gallium/auxiliary/pipebuffer/pb_buffer_fenced.c
> +++ b/src/gallium/auxiliary/pipebuffer/pb_buffer_fenced.c
> @@ -34,13 +34,6 @@
>   */
> 
> 
> -#include "pipe/p_config.h"
> -
> -#if defined(PIPE_OS_LINUX) || defined(PIPE_OS_BSD) || defined(PIPE_OS_SOLARIS)
> -#include <unistd.h>
> -#include <sched.h>
> -#endif
> -
>  #include "pipe/p_compiler.h"
>  #include "pipe/p_defines.h"
>  #include "util/u_debug.h"
> @@ -81,6 +74,7 @@ struct fenced_manager
>      * Following members are mutable and protected by this mutex.
>      */
>     pipe_mutex mutex;
> +   pipe_condvar zero_fenced;
> 
>     /**
>      * Fenced buffer list.
> @@ -307,6 +301,8 @@
>     LIST_DEL(&fenced_buf->head);
>     assert(fenced_mgr->num_fenced);
>     --fenced_mgr->num_fenced;
> +   if (fenced_mgr->num_fenced == 0)
> +      pipe_condvar_broadcast(fenced_mgr->zero_fenced);
> 
>     LIST_ADDTAIL(&fenced_buf->head, &fenced_mgr->unfenced);
>     ++fenced_mgr->num_unfenced;
> @@ -1008,13 +1004,10 @@ fenced_bufmgr_destroy(struct pb_manager *mgr)
> 
>     /* Wait on outstanding fences */
>     while (fenced_mgr->num_fenced) {
> -      pipe_mutex_unlock(fenced_mgr->mutex);
> -#if defined(PIPE_OS_LINUX) || defined(PIPE_OS_BSD) || defined(PIPE_OS_SOLARIS)
> -      sched_yield();
> -#endif
> -      pipe_mutex_lock(fenced_mgr->mutex);
>        while(fenced_manager_check_signalled_locked(fenced_mgr, TRUE))
>           ;
> +      if (fenced_mgr->num_fenced)
> +         pipe_condvar_wait(fenced_mgr->zero_fenced, fenced_mgr->mutex);
>     }
> 
>  #ifdef DEBUG
> @@ -1023,6 +1016,7 @@ fenced_bufmgr_destroy(struct pb_manager *mgr)
> 
>     pipe_mutex_unlock(fenced_mgr->mutex);
>     pipe_mutex_destroy(fenced_mgr->mutex);
> +   pipe_condvar_destroy(fenced_mgr->zero_fenced);
> 
>     if(fenced_mgr->provider)
>        fenced_mgr->provider->destroy(fenced_mgr->provider);
> @@ -1063,6 +1057,7 @@ fenced_bufmgr_create(struct pb_manager *provider,
>     LIST_INITHEAD(&fenced_mgr->unfenced);
>     fenced_mgr->num_unfenced = 0;
> 
> +   pipe_condvar_init(fenced_mgr->zero_fenced);
>     pipe_mutex_init(fenced_mgr->mutex);
> 
>     return &fenced_mgr->base;




More information about the mesa-dev mailing list