+guint
+g_hash_table_foreach_remove (GHashTable *hash_table,
+ GHRFunc func,
+ gpointer user_data)
+{
+ GHashNode *node, *prev;
+ guint i;
+ guint deleted = 0;
+
+ g_return_val_if_fail (hash_table != NULL, 0);
+ g_return_val_if_fail (func != NULL, 0);
+
+ for (i = 0; i < hash_table->size; i++)
+ {
+ restart:
+
+ prev = NULL;
+
+ for (node = hash_table->nodes[i]; node; prev = node, node = node->next)
+ {
+ if ((* func) (node->key, node->value, user_data))
+ {
+ deleted += 1;
+
+ hash_table->nnodes -= 1;
+
+ if (prev)
+ {
+ prev->next = node->next;
+ g_hash_node_destroy (node);
+ node = prev;
+ }
+ else
+ {
+ hash_table->nodes[i] = node->next;
+ g_hash_node_destroy (node);
+ goto restart;
+ }
+ }
+ }
+ }
+