Hi Jim, Recently in Bison I had to check all my calls to hash_initialize for memory exhaustion. Coreutils do it by hand for some of the calls, but we could just as well provide a simple wrapper?
commit 73f0aa2e58b1dabbe075ab6bf5644da36d7c72d2 Author: Akim Demaille <akim.demai...@gmail.com> Date: Mon Sep 9 08:31:33 2019 +0200 hash: provide hash_xinitialize. Suggested by Egor Pugin <egor.pu...@gmail.com> https://lists.gnu.org/archive/html/bison-patches/2019-09/msg00026.html * modules/hash (Depends-on): Add xalloc. * lib/hash.h, lib/hash.c (hash_xinitialize): New. diff --git a/ChangeLog b/ChangeLog index 5c226ce43..ca12b170b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2019-09-09 Akim Demaille <a...@lrde.epita.fr> + + hash: provide hash_xinitialize. + Suggested by Egor Pugin <egor.pu...@gmail.com> + https://lists.gnu.org/archive/html/bison-patches/2019-09/msg00026.html + * modules/hash (Depends-on): Add xalloc. + * lib/hash.h, lib/hash.c (hash_xinitialize): New. + 2019-09-06 Akim Demaille <a...@lrde.epita.fr> bitset: style changes diff --git a/lib/hash.c b/lib/hash.c index 9e1f8e841..ca1d04044 100644 --- a/lib/hash.c +++ b/lib/hash.c @@ -27,6 +27,7 @@ #include "hash.h" #include "bitrotate.h" +#include "xalloc.h" #include "xalloc-oversized.h" #include <stdint.h> @@ -645,6 +646,22 @@ hash_initialize (size_t candidate, const Hash_tuning *tuning, return NULL; } + +/* Same as hash_initialize, but invokes xalloc_die on memory + exhaustion. */ + +Hash_table * +hash_xinitialize (size_t candidate, const Hash_tuning *tuning, + Hash_hasher hasher, Hash_comparator comparator, + Hash_data_freer data_freer) +{ + Hash_table *res = + hash_initialize (candidate, tuning, hasher, comparator, data_freer); + if (!res) + xalloc_die (); + return res; +} + /* Make all buckets empty, placing any chained entries on the free list. Apply the user-specified function data_freer (if any) to the datas of any affected entries. */ diff --git a/lib/hash.h b/lib/hash.h index a1a483a35..8f2e4591f 100644 --- a/lib/hash.h +++ b/lib/hash.h @@ -89,6 +89,9 @@ void hash_reset_tuning (Hash_tuning *); Hash_table *hash_initialize (size_t, const Hash_tuning *, Hash_hasher, Hash_comparator, Hash_data_freer) _GL_ATTRIBUTE_WUR; +Hash_table *hash_xinitialize (size_t, const Hash_tuning *, + Hash_hasher, Hash_comparator, + Hash_data_freer) _GL_ATTRIBUTE_WUR; void hash_clear (Hash_table *); void hash_free (Hash_table *); diff --git a/modules/hash b/modules/hash index 42502e749..31303c1a8 100644 --- a/modules/hash +++ b/modules/hash @@ -9,6 +9,7 @@ Depends-on: bitrotate stdbool stdint +xalloc xalloc-oversized configure.ac: