bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

make 'list' and 'oset' modules usable in libraries


From: Bruno Haible
Subject: make 'list' and 'oset' modules usable in libraries
Date: Mon, 14 Dec 2009 00:37:06 +0100
User-agent: KMail/1.9.9

José Marchesi reported that the 'list' and 'oset' container data structures
are not really usable in libraries, because they call xalloc_die() when
an out-of-memory condition occurs. An xalloc_die() that calls exit() is
not usable in a library. An xalloc_die() that calls setjmp or throws a C++
exception would leak memory and would leave things in an inconsistent state.

This fixes it, by allowing the user to use alternative functions
(gl_list_nx_create instead of gl_list_create, etc.) that provide an error
indicator return value.

Unfortunately this introduces a backward incompatibility: Existing programs
need to use a different gnulib module now, and a different header file:


Date        Modules         Changes

2009-12-13  sublist         The module does not define functions any more that
                            call xalloc_die() in out-of-memory situations. Use
                            module 'xsublist' and include file "gl_xsublist.h"
                            instead.

2009-12-13  list            The module does not define functions any more that
                            call xalloc_die() in out-of-memory situations.
                            Use module 'xlist' and include file "gl_xlist.h"
                            instead.

2009-12-13  oset            The module does not define functions any more that
                            call xalloc_die() in out-of-memory situations.
                            Use module 'xoset' and include file "gl_xoset.h"
                            instead.


But the existing function names keep their semantics. Not only because of
backward compatibility, but also because the majority of the users of these
modules probably lie outside of libraries.


2009-12-13  Bruno Haible  <address@hidden>

        Move the malloc checking from module 'list' to new module 'xlist'.
        * modules/xlist: New file.
        * lib/gl_xlist.h: New file.
        * lib/gl_xlist.c: New file.
        * lib/gl_list.h (gl_list_create_empty, gl_list_create,
        gl_list_node_set_value, gl_list_set_at, gl_list_add_first,
        gl_list_add_last, gl_list_add_before, gl_list_add_after,
        gl_list_nx_add_at, gl_sortedlist_add): Disable declarations.
        (gl_list_nx_create_empty, gl_list_nx_create, gl_list_node_nx_set_value,
        gl_list_nx_set_at, gl_list_nx_add_first, gl_list_nx_add_last,
        gl_list_nx_add_before, gl_list_nx_add_after, gl_list_nx_add_at,
        gl_sortedlist_nx_add): New declarations.
        (struct gl_list_implementation): Rename and change methods accordingly.
        (gl_list_nx_create_empty): Renamed from gl_list_create_empty.
        (gl_list_nx_create): Renamed from gl_list_create.
        (gl_list_node_nx_set_value): Renamed from gl_list_node_set_value.
        (gl_list_nx_set_at): Renamed from gl_list_set_at.
        (gl_list_nx_add_first): Renamed from gl_list_add_first.
        (gl_list_nx_add_last): Renamed from gl_list_add_last.
        (gl_list_nx_add_before): Renamed from gl_list_add_before.
        (gl_list_nx_add_after): Renamed from gl_list_add_after.
        (gl_list_nx_add_at): Renamed from gl_list_add_at.
        (gl_sortedlist_nx_add): Renamed from gl_sortedlist_add.
        * lib/gl_list.c (gl_list_nx_create_empty): Renamed from
        gl_list_create_empty.
        (gl_list_nx_create): Renamed from gl_list_create.
        (gl_list_node_nx_set_value): Renamed from gl_list_node_set_value.
        (gl_list_nx_set_at): Renamed from gl_list_set_at.
        (gl_list_nx_add_first): Renamed from gl_list_add_first.
        (gl_list_nx_add_last): Renamed from gl_list_add_last.
        (gl_list_nx_add_before): Renamed from gl_list_add_before.
        (gl_list_nx_add_after): Renamed from gl_list_add_after.
        (gl_list_nx_add_at): Renamed from gl_list_add_at.
        (gl_sortedlist_nx_add): Renamed from gl_sortedlist_add.
        * lib/gl_array_list.c: Don't include xalloc.h.
        (gl_array_nx_create_empty): Renamed from gl_array_create_empty. Return
        NULL upon out-of-memory.
        (gl_array_nx_create): Renamed from gl_array_create. Return NULL upon
        out-of-memory.
        (gl_array_node_nx_set_value): Renamed from gl_array_node_set_value.
        Change return type to 'int'.
        (gl_array_nx_set_at): Renamed from gl_array_set_at.
        (grow): Change return type to 'int'. Return -1 upon out-of-memory.
        (gl_array_nx_add_first): Renamed from gl_array_add_first. Return NULL
        upon out-of-memory.
        (gl_array_nx_add_last): Renamed from gl_array_add_last. Return NULL
        upon out-of-memory.
        (gl_array_nx_add_before): Renamed from gl_array_add_before. Return NULL
        upon out-of-memory.
        (gl_array_nx_add_after): Renamed from gl_array_add_after. Return NULL
        upon out-of-memory.
        (gl_array_nx_add_at): Renamed from gl_array_add_at. Return NULL upon
        out-of-memory.
        (gl_array_sortedlist_nx_add): Renamed from gl_array_sortedlist_add.
        Update.
        (gl_array_list_implementation): Update.
        * lib/gl_carray_list.c: Don't include xalloc.h.
        (gl_carray_nx_create_empty): Renamed from gl_carray_create_empty.
        Return NULL upon out-of-memory.
        (gl_carray_nx_create): Renamed from gl_carray_create. Return NULL upon
        out-of-memory.
        (gl_carray_node_nx_set_value): Renamed from gl_carray_node_set_value.
        Change return type to 'int'.
        (gl_carray_nx_set_at): Renamed from gl_carray_set_at.
        (grow): Change return type to 'int'. Return -1 upon out-of-memory.
        (gl_carray_nx_add_first): Renamed from gl_carray_add_first. Return NULL
        upon out-of-memory.
        (gl_carray_nx_add_last): Renamed from gl_carray_add_last. Return NULL
        upon out-of-memory.
        (gl_carray_nx_add_at): Renamed from gl_carray_add_at. Return NULL upon
        out-of-memory.
        (gl_carray_nx_add_before): Renamed from gl_carray_add_before. Update.
        (gl_carray_nx_add_after): Renamed from gl_carray_add_after. Update.
        (gl_carray_sortedlist_nx_add): Renamed from gl_carray_sortedlist_add.
        Update.
        (gl_carray_list_implementation): Update.
        * lib/gl_anyhash_list2.h (hash_resize): Do nothing upon out-of-memory.
        * lib/gl_anylinked_list2.h (gl_linked_nx_create_empty): Renamed from
        gl_linked_create_empty. Return NULL upon out-of-memory.
        (gl_linked_nx_create): Renamed from gl_linked_create. Return NULL upon
        out-of-memory.
        (gl_linked_node_nx_set_value): Renamed from gl_linked_node_set_value.
        Change return type to 'int'. Return -1 upon out-of-memory.
        (gl_linked_nx_set_at): Renamed from gl_linked_set_at. Return NULL upon
        out-of-memory.
        (gl_linked_nx_add_first): Renamed from gl_linked_add_first. Return NULL
        upon out-of-memory.
        (gl_linked_nx_add_last): Renamed from gl_linked_add_last. Return NULL
        upon out-of-memory.
        (gl_linked_nx_add_before): Renamed from gl_linked_add_before. Return
        NULL upon out-of-memory.
        (gl_linked_nx_add_after): Renamed from gl_linked_add_after. Return NULL
        upon out-of-memory.
        (gl_linked_nx_add_at): Renamed from gl_linked_add_at. Return NULL upon
        out-of-memory.
        (gl_linked_sortedlist_nx_add): Renamed from gl_linked_sortedlist_add.
        Update.
        * lib/gl_linked_list.c: Don't include xalloc.h.
        (gl_linked_list_implementation): Update.
        * lib/gl_linkedhash_list.c: Don't include xalloc.h.
        (add_to_bucket): Change return type to 'int'.
        (gl_linkedhash_list_implementation): Update.
        * lib/gl_anytree_list1.h (free_subtree): New function.
        * lib/gl_anytree_list2.h (gl_tree_nx_create_empty): Renamed from
        gl_tree_create_empty. Return NULL upon out-of-memory.
        (gl_tree_node_nx_set_value): Renamed from gl_tree_node_set_value.
        Change return type to 'int'. Return -1 upon out-of-memory.
        (gl_tree_nx_set_at): Renamed from gl_tree_set_at. Return NULL upon
        out-of-memory.
        (gl_tree_nx_add_at): Renamed from gl_tree_add_at. Update.
        (gl_tree_remove_node): New function, moved here from
        lib/gl_anyavltree_list2.h and lib/gl_anyrbtree_list2.h.
        (gl_tree_sortedlist_nx_add): Renamed from gl_tree_sortedlist_add.
        Update.
        * lib/gl_anyavltree_list2.h (create_subtree_with_contents): Use
        malloc, not xmalloc. Return NULL upon out-of-memory.
        (gl_tree_nx_create): Renamed from gl_tree_create. Return NULL upon
        out-of-memory.
        (gl_tree_remove_node_from_tree): New function, extracted from
        gl_tree_remove_node.
        (gl_tree_nx_add_first): Renamed from gl_tree_add_first. Return NULL
        upon out-of-memory.
        (gl_tree_nx_add_last): Renamed from gl_tree_add_last. Return NULL upon
        out-of-memory.
        (gl_tree_nx_add_before): Renamed from gl_tree_add_before. Return NULL
        upon out-of-memory.
        (gl_tree_nx_add_after): Renamed from gl_tree_add_after. Return NULL
        upon out-of-memory.
        (gl_tree_remove_node): Remove function. Moved to gl_anytree_list2.h.
        * lib/gl_anyrbtree_list2.h (create_subtree_with_contents): Use malloc,
        not xmalloc. Return NULL upon out-of-memory.
        (gl_tree_nx_create): Renamed from gl_tree_create. Return NULL upon
        out-of-memory.
        (gl_tree_remove_node_from_tree): New function, extracted from
        gl_tree_remove_node.
        (gl_tree_nx_add_first): Renamed from gl_tree_add_first. Return NULL
        upon out-of-memory.
        (gl_tree_nx_add_last): Renamed from gl_tree_add_last. Return NULL upon
        out-of-memory.
        (gl_tree_nx_add_before): Renamed from gl_tree_add_before. Return NULL
        upon out-of-memory.
        (gl_tree_nx_add_after): Renamed from gl_tree_add_after. Return NULL
        upon out-of-memory.
        (gl_tree_remove_node): Remove function. Moved to gl_anytree_list2.h.
        * lib/gl_avltree_list.c: Don't include xalloc.h. Include
        gl_anytree_list1.h before gl_anyavltree_list2.h.
        (gl_avltree_list_implementation): Update.
        * lib/gl_rbtree_list.c: Don't include xalloc.h. Include
        gl_anytree_list1.h before gl_anyavltree_list2.h.
        (gl_rbtree_list_implementation): Update.
        * lib/gl_anytreehash_list1.h (add_to_bucket, add_nodes_to_buckets):
        Change return type to 'int'. Return -1 upon out-of-memory. Use
        __builtin_expect.
        * lib/gl_avltreehash_list.c: Don't include xalloc.h.
        (gl_avltreehash_list_implementation): Update.
        * lib/gl_rbtreehash_list.c: Don't include xalloc.h.
        (gl_rbtreehash_list_implementation): Update.
        * modules/array-list (Depends-on): Remove xalloc.
        * modules/carray-list (Depends-on): Likewise.
        * modules/linked-list (Depends-on): Likewise.
        * modules/linkedhash-list (Depends-on): Likewise.
        * modules/avltree-list (Depends-on): Likewise.
        * modules/rbtree-list (Depends-on): Likewise.
        * modules/avltreehash-list (Depends-on): Likewise.
        * modules/rbtreehash-list (Depends-on): Likewise.

        * modules/xsublist: New file.
        * lib/gl_xsublist.h: New file.
        * lib/gl_xsublist.c: New file.
        * lib/gl_sublist.h (gl_sublist_create): Disable declaration.
        (gl_sublist_nx_create): New declaration.
        * lib/gl_sublist.c: Don't include xalloc.h.
        (gl_sublist_nx_create_empty): Renamed from gl_sublist_create_empty.
        (gl_sublist_nx_create_fill): Renamed from gl_sublist_create_fill.
        (gl_sublist_node_nx_set_value): Renamed from gl_sublist_node_set_value.
        Change return type to 'int'. Return -1 upon out-of-memory.
        (gl_sublist_nx_set_at): Renamed from gl_sublist_set_at. Return NULL
        upon out-of-memory.
        (gl_sublist_nx_add_first): Renamed from gl_sublist_add_first. Return
        NULL upon out-of-memory.
        (gl_sublist_nx_add_last): Renamed from gl_sublist_add_last. Return NULL
        upon out-of-memory.
        (gl_sublist_nx_add_before): Renamed from gl_sublist_add_before. Return
        NULL upon out-of-memory.
        (gl_sublist_nx_add_after): Renamed from gl_sublist_add_after. Return
        NULL upon out-of-memory.
        (gl_sublist_nx_add_at): Renamed from gl_sublist_add_at. Return NULL
        upon out-of-memory.
        (gl_sublist_sortedlist_nx_add): Renamed from gl_sublist_sortedlist_add.
        (gl_sublist_list_implementation): Update.
        (gl_sublist_nx_create): Renamed from gl_sublist_create. Return NULL
        upon out-of-memory.
        * modules/sublist (Depends-on): Remove xalloc.

        * tests/test-array_list.c: Use gl_list_nx_* functions where possible.
        * tests/test-carray_list.c: Likewise.
        * tests/test-linked_list.c: Likewise.
        * tests/test-linkedhash_list.c: Likewise.
        * tests/test-avltree_list.c: Likewise.
        * tests/test-rbtree_list.c: Likewise.
        * tests/test-avltreehash_list.c: Likewise.
        * tests/test-rbtreehash_list.c: Likewise.
        * modules/array-list-tests (Makefile.am): Don't link with 
@address@hidden
        * modules/carray-list-tests (Makefile.am): Likewise.
        * modules/linked-list-tests (Makefile.am): Likewise.
        * modules/linkedhash-list-tests (Makefile.am): Likewise.
        * modules/avltree-list-tests (Makefile.am): Likewise.
        * modules/rbtree-list-tests (Makefile.am): Likewise.
        * modules/avltreehash-list-tests (Makefile.am): Likewise.
        * modules/rbtreehash-list-tests (Makefile.am): Likewise.

        * NEWS: Mention the changes.

        * lib/clean-temp.c: Include gl_xlist.h.
        * modules/clean-temp (Depends-on): Add xlist.

        * lib/git-merge-changelog.c: Include gl_xlist.h instead of gl_list.h.
        * modules/git-merge-changelog (Depends-on): Add xlist. Remove list.

        * tests/test-array_oset.c: Include gl_xlist.h.
        * modules/array-oset-tests (Depends-on): Add xlist.

        Reported by José E. Marchesi <address@hidden>.

2009-12-13  Bruno Haible  <address@hidden>

        Move the malloc checking from module 'oset' to new module 'xoset'.
        * modules/xoset: New file.
        * lib/gl_xoset.h: New file.
        * lib/gl_xoset.c: New file.
        * lib/gl_oset.h (gl_oset_create_empty, gl_oset_add): Disable
        declarations.
        (gl_oset_nx_create_empty, gl_oset_nx_add): New declarations.
        (struct gl_oset_implementation): Rename and change methods accordingly.
        (gl_oset_nx_create_empty): Renamed from gl_oset_create_empty.
        (gl_oset_nx_add): Renamed from gl_oset_add. Change return type to
        'int'. Mark as __warn_unused_result__.
        * lib/gl_oset.c (gl_oset_nx_create_empty): Renamed from
        gl_oset_create_empty.
        (gl_oset_nx_add): Renamed from gl_oset_add. Change return type to
        'int'.
        * lib/gl_array_oset.c: Don't include xalloc.h.
        (gl_array_nx_create_empty): Renamed from gl_array_create_empty. Use
        malloc, not xmalloc.
        (grow): Change return type to 'int'. Don't call xalloc_die.
        (gl_array_nx_add_at): Renamed from gl_array_add_at. Change return type
        to 'int'.
        (gl_array_nx_add): Renamed from gl_array_add. Change return type to
        'int'.
        (gl_array_oset_implementation): Update.
        * lib/gl_anytree_oset.h (gl_tree_nx_create_empty): Renamed from
        gl_tree_create_empty.
        (gl_tree_nx_add): Renamed from gl_tree_add. Change return type to
        'int'.
        * lib/gl_avltree_oset.c: Don't include xalloc.h.
        (gl_tree_nx_add_first): Renamed from gl_tree_add_first. Use malloc, not
        xmalloc.
        (gl_tree_nx_add_before): Renamed from gl_tree_add_before. Use malloc,
        not xmalloc.
        (gl_tree_nx_add_after): Renamed from gl_tree_add_after. Use malloc, not
        xmalloc.
        (gl_avltree_oset_implementation): Update.
        * lib/gl_rbtree_oset.c: Don't include xalloc.h.
        (gl_tree_nx_add_first): Renamed from gl_tree_add_first. Use malloc, not
        xmalloc.
        (gl_tree_nx_add_before): Renamed from gl_tree_add_before. Use malloc,
        not xmalloc.
        (gl_tree_nx_add_after): Renamed from gl_tree_add_after. Use malloc, not
        xmalloc.
        (gl_rbtree_oset_implementation): Update.
        * modules/array-oset (Depends-on): Remove xalloc.
        * modules/avltree-oset (Depends-on): Likewise.
        * modules/rbtree-oset (Depends-on): Likewise.
        * tests/test-array_oset.c: Use gl_oset_nx_* functions where possible.
        * tests/test-avltree_oset.c: Likewise.
        * tests/test-rbtree_oset.c: Likewise.
        * lib/gl_anytreehash_list1.h (add_to_bucket): Likewise.
        * modules/avltree-oset-tests (Makefile.am): Don't link with 
@address@hidden
        * modules/rbtree-oset-tests (Makefile.am): Likewise.
        * NEWS: Mention the change.

Attachment: 0001-Move-the-malloc-checking-from-module-oset-to-new-mod.patch.gz
Description: GNU Zip compressed data

Attachment: 0002-Move-the-malloc-checking-from-module-list-to-new-mod.patch.gz
Description: GNU Zip compressed data


reply via email to

[Prev in Thread] Current Thread [Next in Thread]