Commit Graph

200 Commits

Author SHA1 Message Date
Simon McVittie
06c96ab1e5 GHashTable: be more clear what g_int_hash wants
Using g_int_hash, g_int_equal with keys like GINT_TO_POINTER (n) seems to
be a reasonably common GLib-novice mistake. It doesn't help that the
documentation for GHashFunc was ambiguous about this.

Bug: https://bugzilla.gnome.org/show_bug.cgi?id=592715
Signed-off-by: Simon McVittie <simon.mcvittie@collabora.co.uk>
Reviewed-by: Colin Walters <walters@verbum.org>
2011-10-04 09:42:28 +01:00
Matthias Clasen
6ef022bbb3 Move all hash functions to ghash.c
This matches their location in the headers.
2011-10-02 00:08:54 -04:00
Matthias Clasen
e7ca67f20c GHash: Cosmetic changes 2011-10-02 00:08:13 -04:00
Ryan Lortie
37c740d509 Don't #include <glib/gslice.h> from gmem.h
It looks like this was done just to help people port from gmem to
gslice, but nothing in this header actually requires gslice.h to be
included.
2011-09-18 22:07:18 -04:00
Ryan Lortie
e1b41dcb91 ghash: fix error in "as a set" documentation 2011-08-15 10:43:25 -04:00
Philip Van Hoof
f6ed357101 Add iter_replace API to GHashTableIter
https://bugzilla.gnome.org/show_bug.cgi?id=652822
2011-06-20 23:05:59 -04:00
Matthias Clasen
666adc2dc0 Volatile not necessary after all
I was temporarily confused.
2011-05-28 22:33:37 -04:00
Matthias Clasen
abf719362a GHash: Avoid nonatomic access to the reference count
Not really necessary to constantly double-check the ref
count, anyway.
2011-05-28 21:40:12 -04:00
Matthias Clasen
5d7b67a6c3 Preserve consistency when removing all nodes from a hash table
During the recent refactorings of GHashTable a bug was introduced
where removing all nodes from a hash table would leave tombstones
behind, but make the counts appear like there are none.

Reported and tracked down by Carlos Garnacho,
https://bugzilla.gnome.org/show_bug.cgi?id=651141

This commit also adds a test that checks the internal consistency
of GHashTable over several insert/remove/remove-all operations.
2011-05-26 21:52:50 -04:00
Matthias Clasen
88f23fb1d9 Cosmetics
Use g_atomic_int_inc/dec instead of add(...,1/-1), since
this is the way refcounting is done elsewhere. Some other
cosmetic changes.
2011-05-23 00:40:33 -04:00
Matthias Clasen
f924384634 Trivial: fix a typo 2011-05-21 20:56:04 -04:00
Matthias Clasen
120b85a31b Enforce rules about modifying hash tables in callbacks
We have the infrastructure to do this, so lets do it.
Also add tests for find and foreach to the testsuite.
Bug 650688
2011-05-20 15:07:08 -04:00
Matthias Clasen
afc5319a27 Be more careful when calling destroy notifies
If we are, we can allow modification of the hash table
from destroy notifies.

https://bugzilla.gnome.org/show_bug.cgi?id=650459
2011-05-19 23:51:43 -04:00
Dan Winship
bdc23c44e8 Fix compiler warnings 2011-05-02 11:50:23 -04:00
Matthias Clasen
d09df426ba GHash: make sets with refcounted keys work correctly
When keys == values, we have to be careful about the order in
which we replace their elements.
2011-05-01 10:55:24 -04:00
Matthias Clasen
be991170fa GHash: introduce a "set" mode
Make hash tables start out in a mode in which they don't store
values at all, until the first insertion of a non-identical
key-value pair.

This reduces memory requirements by 1/3 when using hash tables
to store sets.

Based on a patch by Morten Welinder,
https://bugzilla.gnome.org/show_bug.cgi?id=644437
2011-04-30 23:11:18 -04:00
Morten Welinder
0ae6bc3aaa GHash: eliminate one of the lookup_nodes functions.
Kill g_hash_table_lookup_node and rename g_hash_table_lookup_node_for_insertion
to g_hash_table_lookup_node.  Since at this point we already check for
toombstones in all callers of g_hash_table_lookup_node this doesn't make
a difference.

https://bugzilla.gnome.org/show_bug.cgi?id=644437
2011-04-30 23:11:18 -04:00
Morten Welinder
6e45153ef7 GHash: split nodes array into seperate arrays.
This reduces memory requirements by 1/6 on 64-bit machines since
no padding is needed.  It also puts less strain on the memory
allocator since we no longer need one giant slab of memory.

https://bugzilla.gnome.org/show_bug.cgi?id=644437
2011-04-30 23:11:18 -04:00
Morten Welinder
4d8e64e6e8 GHash: use macros to check for magic hash values.
https://bugzilla.gnome.org/show_bug.cgi?id=644437
2011-04-30 23:11:18 -04:00
Matthias Clasen
d3b80c49ea GHashTable: Small optimization of remove-all
Don't enter the loop if we are not going to notify anyway.
Pointed out in bug 646013.
2011-04-27 00:03:59 -04:00
Matthias Clasen
d2d756439f GHashTable: Clarify g_hash_table_lookup_extended docs
Passing NULL as a key is only ok if your hash and equal functions
can deal with it.
https://bugzilla.gnome.org/show_bug.cgi?id=642944
2011-02-25 10:40:39 -05:00
Johan Dahlin
fdaaa22b58 Correct gtk-doc SECTION: syntax
g-ir-scanner does not allow a space between the : and the
section name.
2011-02-01 16:18:02 -02:00
Emmanuele Bassi
ca7dee5949 Build fixes for the fall-out of the inclusion changes 2010-09-04 18:04:34 +01:00
Matthias Clasen
04077ff5c5 More include cleanups 2010-09-03 23:03:14 -04:00
Ryan Lortie
2e53e50244 glib/: fully remove galias hacks 2010-07-07 19:34:35 -04:00
Ryan Lortie
6f33038397 gtk-doc fixups 2010-03-21 14:12:48 -05:00
Ryan Lortie
c73d281843 GHash: move docs from tmpl to inline comments 2010-01-28 22:36:48 -05:00
David Zeuthen
49dfb50afc Bug 580453 – Hash and equal functions for gint64 and gdouble 2009-04-27 13:27:44 -04:00
Christian Dywan
00769cf7f1 Bug 558672 – NULL key lookup using g_hash_table_lookup_extended()
2008-11-04  Christian Dywan  <christian@imendio.com>

	Bug 558672 – NULL key lookup using g_hash_table_lookup_extended()

	* glib/ghash.c:
	Clarify g_hash_table_lookup_extended

svn path=/trunk/; revision=7644
2008-11-04 17:01:19 +00:00
Joseph Pingenot
a73301b3e6 changed "#GHashTableIterator" to "#GHashTableIter" in the
* glib/ghash.c: changed "#GHashTableIterator" to "#GHashTableIter"
        in the documentation-comments above g_hash_table_foreach_remove()
        and g_hash_table_foreach_steal() to correctly name and link to
        GHashTableIter.  This affects the GNOME documentation website
        as well, so further steps are likely necessary beyond this subproject.
* ChangeLog modified to reflect this.

-Joseph (solarion)

svn path=/trunk/; revision=7631
2008-10-27 22:59:42 +00:00
Hans Petter Jansson
991b625aea Rewrite most of GHashTable to use open addressing with quadratic probing
2008-09-19  Hans Petter Jansson  <hpj@novell.com>

	Rewrite most of GHashTable to use open addressing with quadratic
	probing instead of chaining. This has the potential to reduce memory
	fragmentation significantly, while being slightly faster due to
	better locality and no need to call alloc/free functions for nodes.
	Benchmarks suggest it also uses less memory overall.

	* glib/ghash.c (prime_mod): Table of suitable primes for
	initial-probe distribution.
	(g_hash_table_set_shift): New function.
	(g_hash_table_find_closest_shift): New function.
	(g_hash_table_set_shift_from_size): New function.
	(g_hash_table_lookup_node_for_insertion): New function.
	(g_hash_table_lookup_node): Rewritten to return node index instead of
	pointer, use quadratic probe on flat table, and not return insertion
	data. The latter saves some computation for read-only lookups.
	(g_hash_table_remove_node): Rewrite to take a pointer directly to the
	node structure to remove, and clear that. Remove unlinking code.
	(g_hash_table_remove_all_nodes): Rewrite to not clear nodes
	individually, but en masse using memset () after potentially calling
	notify functions.
	(iter_remove_or_steal): Use new data structure and algorithm. Vastly
	simplified - now just a call to g_hash_table_remove_node ().
	(g_hash_table_resize): New resize code, re-indexing with new prime
	and cleaning up tombstones.
	(g_hash_table_maybe_resize): Table may hold 8 buckets minimum, no less
	than 1/4 load excluding tombstones, and no more than 15/16 load
	including tombstones. These numbers are the results of a lot of
	benchmarking with multiple complex applications, and should not be
	changed lightly.
	(g_hash_table_iter_next)
	(g_hash_table_lookup)
	(g_hash_table_lookup_extended)
	(g_hash_table_insert_internal)
	(g_hash_table_remove_internal)
	(g_hash_table_foreach_remove_or_steal)
	(g_hash_table_foreach)
	(g_hash_table_find)
	(g_hash_table_get_keys)
	(g_hash_table_get_values): Use new data structure and algorithm,
	fairly trivial changes.


svn path=/trunk/; revision=7518
2008-09-20 04:05:11 +00:00
Matthias Clasen
cc1ad36f99 Bug 536158 – also bump GHashTable version when a node is removed via
g_hash_table_iter_remove()/g_hash_table_iter_steal()

        * glib/ghash.c (iter_remove_or_steal): Bump the hash table
        version. Patch by Jean-Yves Lefort


svn path=/trunk/; revision=6993
2008-06-10 17:03:15 +00:00
Matthias Clasen
7250e1dafd Fix the build with -DG_DISABLE_ASSERT. (#525060, Arfrever Frehtes
2008-03-30  Matthias Clasen  <mclasen@redhat.com>

        * glib/ghash.c: Fix the build with -DG_DISABLE_ASSERT.
        (#525060, Arfrever Frehtes Taifersar Arahesis)



svn path=/trunk/; revision=6777
2008-03-31 03:45:28 +00:00
Alvaro Lopez Ortega
ed670989f4 These functions prototype defines its output as void, and therefore they
2008-01-02  Alvaro Lopez Ortega  <alvaro@sun.com>

       * glib/ghash.c (g_hash_table_replace, g_hash_table_insert): These
       functions prototype defines its output as void, and therefore they
       should not return any value. This patch fixes a compilation error:
       the "return" clauses were incompatible with the functions prototype.

svn path=/trunk/; revision=6230
2008-01-02 11:54:08 +00:00
Matthias Clasen
1f7e7f84f4 Fix up docs
svn path=/trunk/; revision=6131
2007-12-15 04:13:15 +00:00
Matthias Clasen
d741d3e7a3 Add hash table iterators. (#500507, Jean-Yves Lefort)
2007-12-14  Matthias Clasen  <mclasen@redhat.com>

        * glib/glib.symbols:
        * glib/ghash.[hc]: Add hash table iterators.  (#500507,
        Jean-Yves Lefort)

        * tests/hash-test.c: Test iterators.



svn path=/trunk/; revision=6130
2007-12-15 03:54:09 +00:00
Mathias Hasselmann
bb10169eb4 Call destroy notify when destroying the hash table in g_hash_table_unref.
* glib/ghash.c: Call destroy notify when destroying the hash table in
g_hash_table_unref.

svn path=/trunk/; revision=6060
2007-12-06 15:38:03 +00:00
Ryan Lortie
4c78fb8faa ungtk-docify some comments for internal functions
2007-12-05  Ryan Lortie  <desrt@desrt.ca>

        * glib/ghash.c: ungtk-docify some comments for internal functions


svn path=/trunk/; revision=6045
2007-12-05 06:09:55 +00:00
Ryan Lortie
0b89fa790a no code changes; add comments to document the internal functions.
2007-12-03  Ryan Lortie  <desrt@desrt.ca>

        * glib/ghash.c: no code changes; add comments to document the internal
        functions.


svn path=/trunk/; revision=6037
2007-12-04 03:47:17 +00:00
Ryan Lortie
ac44f9cb5a no code changes; reorder functions to remove the need for forward
2007-12-03  Ryan Lortie  <desrt@desrt.ca>

        * glib/ghash.c: no code changes; reorder functions to remove the need
        for forward declarations.


svn path=/trunk/; revision=6036
2007-12-04 03:47:03 +00:00
Ryan Lortie
d72c02686b improve clarity in some functions
2007-12-03  Ryan Lortie  <desrt@desrt.ca>

        * glib/ghash.c (g_hash_table_lookup_node,
        g_hash_table_lookup_extended, g_hash_table_insert_internal,
        g_hash_node_new): improve clarity in some functions


svn path=/trunk/; revision=6035
2007-12-04 03:46:48 +00:00
Ryan Lortie
8a38e16052 rename 'node' to 'node_ptr' where appropriate
2007-12-03  Ryan Lortie  <desrt@desrt.ca>

        * glib/ghash.c: rename 'node' to 'node_ptr' where appropriate


svn path=/trunk/; revision=6034
2007-12-04 03:46:31 +00:00
Ryan Lortie
00c2db4e4b convert G_HASH_TABLE_RESIZE() macro to inline function
2007-12-03  Ryan Lortie  <desrt@desrt.ca>

        * glib/ghash.c: convert G_HASH_TABLE_RESIZE() macro to inline function


svn path=/trunk/; revision=6033
2007-12-04 03:46:13 +00:00
Ryan Lortie
8eed88b24e only whitespace fixes, mostly removing spaces at ends of lines (and on empty lines)
svn path=/trunk/; revision=6030
2007-12-04 00:47:41 +00:00
Ryan Lortie
72ed8191af create a common function for the many places where all nodes in the table
2007-12-03  Ryan Lortie  <desrt@desrt.ca>

	* glib/ghash.c: create a common function for the many places where all
	nodes in the table are removed (remove_all, steal_all, destroy, unref,
	etc...)



svn path=/trunk/; revision=6026
2007-12-03 21:21:28 +00:00
Ryan Lortie
e9010a86f7 merge more common code into functions. Vastly simplify loop logic in
2007-12-03  Ryan Lortie  <desrt@desrt.ca>

        * glib/ghash.c: merge more common code into functions.  Vastly
        simplify loop logic in g_hash_table_foreach_remove_or_steal().


svn path=/trunk/; revision=6016
2007-12-03 09:29:47 +00:00
Ryan Lortie
5e02b01b21 nothing to see here... move along, move along :)
svn path=/trunk/; revision=5965
2007-11-28 03:58:08 +00:00
Ryan Lortie
0adbacbff9 insert/replace were identical except for a single line. Replace both with
2007-11-27  Ryan Lortie  <desrt@desrt.ca>

        * glib/ghash.c (g_hash_table_insert, g_hash_table_replace,
        g_hash_table_insert_internal): insert/replace were identical except
        for a single line.  Replace both with a common function.


svn path=/trunk/; revision=5964
2007-11-28 03:40:39 +00:00
Tim Janik
2ef43de2af g_hash_table_find(), g_hash_table_foreach(): document performance caveats
Mon Jun 25 16:43:13 2007  Tim Janik  <timj@gtk.org>                                                                                                           
                                                                                                                                                              
        * glib/ghash.c: g_hash_table_find(), g_hash_table_foreach():                                                                                          
        document performance caveats for linear order searches.                                                                                               
                                                                                                                                                              


svn path=/trunk/; revision=5587
2007-06-25 14:44:41 +00:00
Emmanuele Bassi
db8642a56c Add g_hash_table_get_keys() and g_hash_table_get_values(), API to retrieve
2007-04-11  Emmanuele Bassi  <ebassi@gnome.org>

	* glib/ghash.[ch]: Add g_hash_table_get_keys() and
	g_hash_table_get_values(), API to retrieve the keys
	and values inside an hash table in list form. (#413133)

	* glib/glib.symbols: Update symbols.

	* tests/hash-test.c: Exercise newly added functions.

svn path=/trunk/; revision=5444
2007-04-11 13:09:38 +00:00