On Wed, Nov 15, 2006 at 04:50:55AM -0500, Daniel Veillard wrote: > On Wed, Nov 15, 2006 at 02:18:48AM +0000, Daniel P. Berrange wrote: > > The attached patch adds a couple of new APIs to the hash table object to > > allow various different ways of iterating over the contents of the hash > > table. The methods are: > > > > virHashForEach > > virHashRemoveSet > > virHashSearch > > > > Docs for these methods are all inline. Compared to previous patch a logic > > flaw in the virHashRemoveSet method was fixed prevently some severe memory > > corruption! > > The APIs are okay, I'm just wondering if the iterator should not return > an int allowing to break the iteration, but admitedly that would make it > close to the search. So it's fine as-is. Yes, that's a good idea - I'll make it return number of elements - I think I could acutaly make use of that elsewhere already. > > + int virHashRemoveSet(virHashTablePtr table, virHashSearcher iter, virHashDeallocator f, const void *data) { > > + int i; > > + > > + } > > Iterating when removing entries which are first in the list is a bit tricky > but that's looks fine. Yeah, that's why i wrote a dedicated method for iterating & removing in one go - calling 'virHashRemove' from the normal iterator just caused very bad things to happen :-) > > + void *virHashSearch(virHashTablePtr table, virHashSearcher iter, const void *data) { > > + int i; > > + > > + if (table == NULL || iter == NULL) > > + return (NULL); > > + > > + for (i = 0 ; i < table->size ; i++) { > > + virHashEntryPtr entry = table->table + i; > > + while (entry) { > > + if (entry->valid) { > > + if (iter(entry->payload, entry->name, data)) > > + return entry->payload; > > + } > > + entry = entry->next; > > + } > > + } > > + return (NULL); > > + } > > Minor stylistic issue I tend to use return(value); and you use sometime > return (value); or return value; but it's really not a serious problem :-) My own style is normally 'return value', but I try to match your style when working on libvirt - sometimes i forget though, so I'll fix up the bits where I forget the (). Regards, Dan. -- |=- Red Hat, Engineering, Emerging Technologies, Boston. +1 978 392 2496 -=| |=- Perl modules: http://search.cpan.org/~danberr/ -=| |=- Projects: http://freshmeat.net/~danielpb/ -=| |=- GnuPG: 7D3B9505 F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 -=|