* 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).