[Mesa-dev] pipebuffer: Use pipe_condvar instead of ifdef'd sys_yield()
José Fonseca
jfonseca at vmware.com
Tue Jul 6 11:01:34 PDT 2010
*doh* :)
Awesome! Let me just go over those patches then.
Jose
On Tue, 2010-07-06 at 10:45 -0700, nobled wrote:
> Well, that's why I sent the "Implement pipe_condvar on win32" and "on
> Windows Vista" patches first. With the first patch, the pipebuffer
> code will do on Windows exactly what it already does right now on
> Unix-- unlock the mutex, wait for other threads, then try to lock it
> again. pipe_condvar on Windows (or any other platform) will *work*, it
> just won't be very efficient.
>
> On Tue, Jul 6, 2010 at 6:46 AM, José Fonseca <jfonseca at vmware.com> wrote:
> > 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