* hash: provide hash_xinitialize @ 2019-09-09 6:37 Akim Demaille 2019-09-09 14:05 ` Bruno Haible 0 siblings, 1 reply; 5+ messages in thread From: Akim Demaille @ 2019-09-09 6:37 UTC (permalink / raw) To: Jim Meyering; +Cc: Gnulib bugs 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.demaille@gmail.com> Date: Mon Sep 9 08:31:33 2019 +0200 hash: provide hash_xinitialize. Suggested by Egor Pugin <egor.pugin@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 <akim@lrde.epita.fr> + + hash: provide hash_xinitialize. + Suggested by Egor Pugin <egor.pugin@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 <akim@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: ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: hash: provide hash_xinitialize 2019-09-09 6:37 hash: provide hash_xinitialize Akim Demaille @ 2019-09-09 14:05 ` Bruno Haible 2019-09-09 18:07 ` Akim Demaille 0 siblings, 1 reply; 5+ messages in thread From: Bruno Haible @ 2019-09-09 14:05 UTC (permalink / raw) To: bug-gnulib; +Cc: Akim Demaille, Jim Meyering Hi Akim, > * modules/hash (Depends-on): Add xalloc. > * lib/hash.h, lib/hash.c (hash_xinitialize): New. This patch produces gnulib-tool warnings: $ ./gnulib-tool --test hash gnulib-tool: warning: module hash depends on a module with an incompatible license: error gnulib-tool: warning: module hash depends on a module with an incompatible license: getprogname gnulib-tool: warning: module hash depends on a module with an incompatible license: xalloc gnulib-tool: warning: module hash depends on a module with an incompatible license: xalloc-die ... What gnulib-tool is telling you is that the module 'hash' has a license that makes it suitable for use in libraries. Adding a dependency to 'xalloc' to it can't be done in this module, because library code should never call xalloc_die(). The fix is to create a new module, with prefix 'x', that adds the function. You can leave it declared in hash.h; this is not a problem. But it needs to be defined in a different compilation unit. For a model of this idiom, look at the modules 'concat-filename' and 'xconcat-filename'. Bruno ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: hash: provide hash_xinitialize 2019-09-09 14:05 ` Bruno Haible @ 2019-09-09 18:07 ` Akim Demaille 2019-09-09 19:15 ` Bruno Haible 0 siblings, 1 reply; 5+ messages in thread From: Akim Demaille @ 2019-09-09 18:07 UTC (permalink / raw) To: Bruno Haible; +Cc: bug-gnulib, Jim Meyering > Le 9 sept. 2019 à 16:05, Bruno Haible <bruno@clisp.org> a écrit : > > Hi Akim, Hi! >> * modules/hash (Depends-on): Add xalloc. >> * lib/hash.h, lib/hash.c (hash_xinitialize): New. > > This patch produces gnulib-tool warnings: > > $ ./gnulib-tool --test hash > gnulib-tool: warning: module hash depends on a module with an incompatible license: error > gnulib-tool: warning: module hash depends on a module with an incompatible license: getprogname > gnulib-tool: warning: module hash depends on a module with an incompatible license: xalloc > gnulib-tool: warning: module hash depends on a module with an incompatible license: xalloc-die > ... > > What gnulib-tool is telling you is that the module 'hash' has a license > that makes it suitable for use in libraries. Adding a dependency to 'xalloc' > to it can't be done in this module, because library code should never > call xalloc_die(). Wow! Nice feature! Note that the hash module claims LGPLv2+, but the header of hash.[ch] is about GPLv3+. > The fix is to create a new module, with prefix 'x', that adds the > function. You can leave it declared in hash.h; this is not a problem. > But it needs to be defined in a different compilation unit. > > For a model of this idiom, look at the modules 'concat-filename' > and 'xconcat-filename'. Thanks for the hint; below is my updated proposal (which passes its test :). I see that xconcat-filename is about xconcat_filename; I stayed with hash_initialize instead of xhash_initialize, but I can change that, of course. Also, contrary to the case of xconcat-filename, I have not put hash.h in the Files of xhash, because I see hash.h as a part of hash, not xhash. And I shamelessly decided to put the maintenance burden on Jim's shoulders. commit 734cd738f062ccbc53126d593e5ae977d77d6ee6 Author: Akim Demaille <akim.demaille@gmail.com> Date: Mon Sep 9 08:31:33 2019 +0200 xhash: provide hash_xinitialize Suggested by Egor Pugin <egor.pugin@gmail.com> https://lists.gnu.org/archive/html/bison-patches/2019-09/msg00026.html * modules/xhash, lib/xhash.c: New. * lib/hash.h (hash_xinitialize): New. diff --git a/ChangeLog b/ChangeLog index 5c226ce43..6969156e3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2019-09-09 Akim Demaille <akim@lrde.epita.fr> + + xhash: provide hash_xinitialize. + Suggested by Egor Pugin <egor.pugin@gmail.com> + https://lists.gnu.org/archive/html/bison-patches/2019-09/msg00026.html + * modules/xhash, lib/xhash.c: New. + * lib/hash.h (hash_xinitialize): New. + 2019-09-06 Akim Demaille <akim@lrde.epita.fr> bitset: style changes 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/lib/xhash.c b/lib/xhash.c new file mode 100644 index 000000000..9b2bcdbb4 --- /dev/null +++ b/lib/xhash.c @@ -0,0 +1,38 @@ +/* hash - hashing table processing. + + Copyright (C) 2019 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <https://www.gnu.org/licenses/>. */ + +#include <config.h> + +/* Specification. */ +#include "hash.h" + +#include "xalloc.h" + +/* 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; +} diff --git a/modules/xhash b/modules/xhash new file mode 100644 index 000000000..2e74c718f --- /dev/null +++ b/modules/xhash @@ -0,0 +1,23 @@ +Description: +Parameterizable hash table, with out-of-memory checking. + +Files: +lib/xhash.c + +Depends-on: +hash +xalloc + +configure.ac: + +Makefile.am: +lib_SOURCES += xhash.c + +Include: +"hash.h" + +License: +GPLv3+ + +Maintainer: +Jim Meyering ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: hash: provide hash_xinitialize 2019-09-09 18:07 ` Akim Demaille @ 2019-09-09 19:15 ` Bruno Haible 2019-09-09 20:27 ` Jim Meyering 0 siblings, 1 reply; 5+ messages in thread From: Bruno Haible @ 2019-09-09 19:15 UTC (permalink / raw) To: Akim Demaille; +Cc: bug-gnulib, Jim Meyering Hi Akim, > Note that the hash module claims LGPLv2+, but the header of hash.[ch] is about GPLv3+. This is explained here: https://www.gnu.org/software/gnulib/manual/html_node/Gnulib-licensing.html The gnulib-tool option --lgpl=2 will put LGPLv2+ headers on the files, for people who use the modules to build an LGPLv2+ package. > Thanks for the hint; below is my updated proposal (which passes its test :). Looks perfect. > Also, contrary to the case of xconcat-filename, I have not put hash.h in the > Files of xhash, because I see hash.h as a part of hash, not xhash. Either way is fine. > And I shamelessly decided to put the maintenance burden on Jim's shoulders. Don't be shy :) Bruno ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: hash: provide hash_xinitialize 2019-09-09 19:15 ` Bruno Haible @ 2019-09-09 20:27 ` Jim Meyering 0 siblings, 0 replies; 5+ messages in thread From: Jim Meyering @ 2019-09-09 20:27 UTC (permalink / raw) To: Bruno Haible; +Cc: bug-gnulib@gnu.org List, Akim Demaille On Mon, Sep 9, 2019 at 12:16 PM Bruno Haible <bruno@clisp.org> wrote: ... > > And I shamelessly decided to put the maintenance burden on Jim's shoulders. > > Don't be shy :) Indeed. Feel free to add your name. Thank you both for the addition and improvements. ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2019-09-09 20:28 UTC | newest] Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2019-09-09 6:37 hash: provide hash_xinitialize Akim Demaille 2019-09-09 14:05 ` Bruno Haible 2019-09-09 18:07 ` Akim Demaille 2019-09-09 19:15 ` Bruno Haible 2019-09-09 20:27 ` Jim Meyering
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).