[Mesa-dev] [PATCH 03/21] glsl: protect anonymous struct id with a mutex

Chia-I Wu olvaffe at gmail.com
Sun May 4 14:23:01 PDT 2014


On Sat, May 3, 2014 at 1:33 AM, Ian Romanick <idr at freedesktop.org> wrote:
> On 04/22/2014 01:58 AM, Chia-I Wu wrote:
>> There may be two contexts compiling shaders at the same time, and we want the
>> anonymous struct id to be globally unique.
>
> I am not very excited about this.
>
> Is there any chance of getting stdatomic.h for the MSVC compilers that
> people care about?  I'd much rather have this code be...
>
>    if (identifier == NULL) {
>       static volatile atomic_uint_t anon_count = ATOMIC_VAR_INIT(1);
>       unsigned count;
>
>       count = atomic_fetch_add(&anon_count, 1);
>       identifier = ralloc_asprintf(this, "#anon_struct_%04x", count);
>    }
I could not find any portable stdatomic.h implementation from a quick
search.  One thing we may
do is to have

$ cat $mesa/include/c11/stdatomic.h
#if __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_ATOMICS__)
#include <stdatomic.h>
#else

/* a implementation that is "good enough" for us */
#include "threads.h"

#define ATOMIC_VAR_INIT(val) { _MTX_INITIALIZER_NP, (val) }

typedef struct atomic_uint_t {
   mtx_t mutex;
   unsigned int val;
} atomic_uint_t;

static inline unsigned int
atomic_fetch_add(volatile atomic_uint_t *a)
{
        unsigned int val;

        mtx_lock(&a->mutex);
        val = a->val++;
        mtx_unlock(&a->mutex);

        return val;
}
#endif

Whoever needs more than reference counting with unsigned int will need
to extend it a bit on systems where there is no stdatomic.h.  And
maybe we are better off without naming it stdatomic.h.  Ideas?

>
>> Signed-off-by: Chia-I Wu <olv at lunarg.com>
>> ---
>>  src/glsl/glsl_parser_extras.cpp | 10 ++++++++--
>>  1 file changed, 8 insertions(+), 2 deletions(-)
>>
>> diff --git a/src/glsl/glsl_parser_extras.cpp b/src/glsl/glsl_parser_extras.cpp
>> index 91c9285..30e284b 100644
>> --- a/src/glsl/glsl_parser_extras.cpp
>> +++ b/src/glsl/glsl_parser_extras.cpp
>> @@ -1332,9 +1332,15 @@ ast_struct_specifier::ast_struct_specifier(const char *identifier,
>>                                          ast_declarator_list *declarator_list)
>>  {
>>     if (identifier == NULL) {
>> +      static mtx_t mutex = _MTX_INITIALIZER_NP;
>>        static unsigned anon_count = 1;
>> -      identifier = ralloc_asprintf(this, "#anon_struct_%04x", anon_count);
>> -      anon_count++;
>> +      unsigned count;
>> +
>> +      mtx_lock(&mutex);
>> +      count = anon_count++;
>> +      mtx_unlock(&mutex);
>> +
>> +      identifier = ralloc_asprintf(this, "#anon_struct_%04x", count);
>>     }
>>     name = identifier;
>>     this->declarations.push_degenerate_list_at_head(&declarator_list->link);
>>
>



-- 
olv at LunarG.com


More information about the mesa-dev mailing list