<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Jan 13, 2015 at 8:43 PM, Matt Turner <span dir="ltr"><<a href="mailto:mattst88@gmail.com" target="_blank">mattst88@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span class="">On Tue, Jan 13, 2015 at 10:28 AM, Jason Ekstrand <<a href="mailto:jason@jlekstrand.net">jason@jlekstrand.net</a>> wrote:<br>
> Going through the for loop every time has noticable overhead.  This fixes<br>
> things up so we only do that once ever and then just do a hash table lookup<br>
> which should be much cheaper.<br>
> ---<br>
>  src/mesa/main/formats.c | 67 +++++++++++++++++++++++++++++++++++++++++--------<br>
>  1 file changed, 56 insertions(+), 11 deletions(-)<br>
><br>
> diff --git a/src/mesa/main/formats.c b/src/mesa/main/formats.c<br>
> index 8ac0583..f125a13 100644<br>
> --- a/src/mesa/main/formats.c<br>
> +++ b/src/mesa/main/formats.c<br>
> @@ -28,6 +28,7 @@<br>
>  #include "formats.h"<br>
>  #include "macros.h"<br>
>  #include "glformats.h"<br>
> +#include "util/hash_table.h"<br>
><br>
><br>
>  /**<br>
> @@ -377,24 +378,68 @@ _mesa_format_to_array_format(mesa_format format)<br>
>        return _mesa_array_format_flip_channels(info->ArrayFormat);<br>
>  }<br>
><br>
> +static struct hash_table *format_array_format_table;<br>
> +static pthread_once_t format_array_format_table_exists = PTHREAD_ONCE_INIT;<br>
<br>
</span>I meant to suggest that you use the C11 threads API. We have an<br>
implementation in include/c11/ that wraps pthreads.<br></blockquote><div><br></div><div>I must have gotten confused.  I could have swarn the wrappers went in the other direction.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
But, it sounded like what you wanted was for subsequent calls to<br>
format_array_format_table_init() via call_once() to block until the<br>
first had completed. I don't think call_once() does that.<br>
pthread_once() doesn't, at least.<br></blockquote><div><br></div><div>If it doesn't guarantee that, then what use is it?  From the pthread_once man page:<br><br>The first call to pthread_once() by any thread in a process, with a given once_control, shall call the init_routine with no arguments. Subsequent calls of pthread_once() with the same once_control shall not call the init_routine.  On return from pthread_once(), init_routine shall have completed. <br><br></div><div>Sounds to mee like it guarantees that, regardless of the thread, the function will have been called by someone by the time your call to pthread_once completes.<br></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<span class=""><br>
> +<br>
> +static bool<br>
> +array_formats_equal(const void *a, const void *b)<br>
> +{<br>
> +   return (intptr_t)a == (intptr_t)b;<br>
<br>
</span>No need to cast.<br></blockquote><div><br></div><div>Yeah, I can get rid of that.<br></div><div>--Jason <br></div></div><br></div></div>