[Mesa-dev] [PATCH 03/15] mesa: Add a clone function to mesa hash

Timothy Arceri t_arceri at yahoo.com.au
Mon Aug 26 18:10:32 PDT 2013


On 27/08/13 00:51, Brian Paul wrote:
> On 08/26/2013 04:43 AM, Timothy Arceri wrote:
>>
>> Signed-off-by: Timothy Arceri <t_arceri at yahoo.com.au>
>> ---
>>   src/mesa/main/hash.c |   26 ++++++++++++++++++++++++++
>>   src/mesa/main/hash.h |    3 +++
>>   2 files changed, 29 insertions(+)
>>
>> diff --git a/src/mesa/main/hash.c b/src/mesa/main/hash.c
>> index 6591af9..8dde8b1 100644
>> --- a/src/mesa/main/hash.c
>> +++ b/src/mesa/main/hash.c
>> @@ -302,6 +302,32 @@ _mesa_HashDeleteAll(struct _mesa_HashTable *table,
>>
>>
>>   /**
>> + * Clone all entries in a hash table, into a new table.
>> + *
>> + * \param table  the hash table to clone
>> + */
>> +struct _mesa_HashTable *
>> +_mesa_HashClone(struct _mesa_HashTable *table)
>
> Can that be const qualified?
>

The cloned tables are to be edited after we clone them. Basically we 
just want a copy of whats on the top of the stack when we do a push but
then the we want to be able to be able to add more ids to this copy if 
we want to. I have a piglit test for push/popDebugGroup that shows what 
I mean.
I will try to polish this up and submit it later today.

Or I'm I miss understanding what you are suggesting?

>
>> +{
>> +   struct hash_entry *entry;
>> +   struct _mesa_HashTable *clonetable;
>> +
>> +   ASSERT(table);
>> +   _glthread_LOCK_MUTEX(table->Mutex);
>> +
>> +   clonetable = _mesa_NewHashTable();
>> +   assert(clonetable);
>> +   hash_table_foreach(table->ht, entry) {
>> +      _mesa_HashInsert(clonetable, (GLint)(uintptr_t)entry->key, 
>> entry->data);
>> +   }
>> +
>> +   _glthread_UNLOCK_MUTEX(table->Mutex);
>> +
>> +   return clonetable;
>> +}
>> +
>> +
>> +/**
>>    * Walk over all entries in a hash table, calling callback function 
>> for each.
>>    * Note: we use a separate mutex in this function to avoid a recursive
>>    * locking deadlock (in case the callback calls _mesa_HashRemove()) 
>> and to
>> diff --git a/src/mesa/main/hash.h b/src/mesa/main/hash.h
>> index 142d284..9208701 100644
>> --- a/src/mesa/main/hash.h
>> +++ b/src/mesa/main/hash.h
>> @@ -50,6 +50,9 @@ _mesa_HashDeleteAll(struct _mesa_HashTable *table,
>>                       void (*callback)(GLuint key, void *data, void 
>> *userData),
>>                       void *userData);
>>
>> +extern struct _mesa_HashTable *
>> +_mesa_HashClone(struct _mesa_HashTable *table);
>> +
>>   extern void
>>   _mesa_HashWalk(const struct _mesa_HashTable *table,
>>                  void (*callback)(GLuint key, void *data, void 
>> *userData),
>>
>



More information about the mesa-dev mailing list