Him Tim, I hadnt had my morning coffee butdidnt you do it the other way around?
It looks like, that "_mesa_HashWalk" ist he locked and "_mesa_HashWalkLocked" the unlocked version. Michael -----Ursprüngliche Nachricht----- Von: mesa-dev [mailto:mesa-dev-boun...@lists.freedesktop.org] Im Auftrag von Timothy Arceri Gesendet: Montag, 24. April 2017 07:59 An: mesa-dev@lists.freedesktop.org Cc: Timothy Arceri <tarc...@itsqueeze.com> Betreff: [Mesa-dev] [PATCH 1/2] mesa: create locked version of HashWalk --- src/mesa/main/hash.c | 34 ++++++++++++++++++++++++++-------- src/mesa/main/hash.h | 5 +++++ 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/src/mesa/main/hash.c b/src/mesa/main/hash.c index b7a7bd9..a3772bd 100644 --- a/src/mesa/main/hash.c +++ b/src/mesa/main/hash.c @@ -404,40 +404,58 @@ _mesa_HashDeleteAll(struct _mesa_HashTable *table, } /** * Walk over all entries in a hash table, calling callback function for each. * \param table the hash table to walk * \param callback the callback function * \param userData arbitrary pointer to pass along to the callback * (this is typically a struct gl_context pointer) */ +static void +hash_walk_unlocked(const struct _mesa_HashTable *table, + void (*callback)(GLuint key, void *data, void *userData), + void *userData) +{ + assert(table); + assert(callback); + + struct hash_entry *entry; + hash_table_foreach(table->ht, entry) { + callback((uintptr_t)entry->key, entry->data, userData); + } + if (table->deleted_key_data) + callback(DELETED_KEY_VALUE, table->deleted_key_data, userData); } + + void _mesa_HashWalk(const struct _mesa_HashTable *table, void (*callback)(GLuint key, void *data, void *userData), void *userData) { /* cast-away const */ struct _mesa_HashTable *table2 = (struct _mesa_HashTable *) table; - struct hash_entry *entry; - assert(table); - assert(callback); mtx_lock(&table2->Mutex); - hash_table_foreach(table->ht, entry) { - callback((uintptr_t)entry->key, entry->data, userData); - } - if (table->deleted_key_data) - callback(DELETED_KEY_VALUE, table->deleted_key_data, userData); + hash_walk_unlocked(table, callback, userData); mtx_unlock(&table2->Mutex); } +void +_mesa_HashWalkLocked(const struct _mesa_HashTable *table, + void (*callback)(GLuint key, void *data, void *userData), + void *userData) +{ + hash_walk_unlocked(table, callback, userData); } + static void debug_print_entry(GLuint key, void *data, void *userData) { _mesa_debug(NULL, "%u %p\n", key, data); } /** * Dump contents of hash table for debugging. * * \param table the hash table. diff --git a/src/mesa/main/hash.h b/src/mesa/main/hash.h index 52a6c5d..9eb0f0e 100644 --- a/src/mesa/main/hash.h +++ b/src/mesa/main/hash.h @@ -59,20 +59,25 @@ extern void _mesa_HashRemoveLocked(struct _mesa_HashTable *table, GLuint key); extern void _mesa_HashDeleteAll(struct _mesa_HashTable *table, void (*callback)(GLuint key, void *data, void *userData), void *userData); extern void _mesa_HashWalk(const struct _mesa_HashTable *table, void (*callback)(GLuint key, void *data, void *userData), void *userData); +extern void +_mesa_HashWalkLocked(const struct _mesa_HashTable *table, + void (*callback)(GLuint key, void *data, void *userData), + void *userData); + extern void _mesa_HashPrint(const struct _mesa_HashTable *table); extern GLuint _mesa_HashFindFreeKeyBlock(struct _mesa_HashTable *table, GLuint numKeys); extern GLuint _mesa_HashNumEntries(const struct _mesa_HashTable *table); extern void _mesa_test_hash_functions(void); -- 2.9.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev