This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: libiberty: hashtab allocation functions with an extra argument
On Wed, Jan 22, 2003 at 06:37:01PM -0500, Daniel Jacobowitz wrote:
> On Wed, Jan 22, 2003 at 05:45:11PM -0500, DJ Delorie wrote:
> >
> > > Callback has an opaque pointer already. I added one to alloc/free.
> > > That leaves hash, compare-equal, and delete. Do you think there's a
> > > use for extra opaque pointers to those? I've no idea. Nor do I know
> > > if they should come from an argument to the function which calls the
> > > delete callback (like htab_trav) or when the htab is created (like
> > > alloc/free).
> >
> > I meant, are there other parameters we might want to specify when
> > creating a hash table, but I guess we don't. Ok, post an updated
> > patch summarizing what we've discussed and let's see if it's a go.
>
> Let's see how this one looks. The create function becomes _ex, but I
> left the pointers as alloc_with_arg, since that's what they are. Do
> you want _ex there too?
I'm not sure if this patch went out yesterday or not, sorry for
repeats...
DJ, how's this look?
> 2003-01-22 Daniel Jacobowitz <drow@mvista.com>
>
> * hashtab.h (htab_alloc_with_arg, htab_free_with_arg): Add new types.
> (struct htab): Add alloc_arg, alloc_with_arg_f, free_with_arg_f.
> (htab_create_alloc_ex): New prototype.
> (htab_set_functions_ex): New prototype.
>
> 2003-01-22 Daniel Jacobowitz <drow@mvista.com>
>
> * hashtab.c (htab_create_alloc_ex): New function.
> (hatab_set_functions_ex): New function.
> (htab_delete, htab_expand): Support alternate allocation functions.
>
> Index: include/hashtab.h
> ===================================================================
> RCS file: /big/fsf/rsync/src-cvs/src/include/hashtab.h,v
> retrieving revision 1.10
> diff -u -p -r1.10 hashtab.h
> --- include/hashtab.h 2002/06/25 01:03:52 1.10
> +++ include/hashtab.h 2003/01/22 23:35:41
> @@ -76,10 +76,16 @@ typedef PTR (*htab_alloc) PARAMS ((size_
> /* We also need a free() routine. */
> typedef void (*htab_free) PARAMS ((PTR));
>
> +/* Memory allocation and deallocation; variants which take an extra
> + argument. */
> +typedef PTR (*htab_alloc_with_arg) PARAMS ((void *, size_t, size_t));
> +typedef void (*htab_free_with_arg) PARAMS ((void *, void *));
> +
> /* Hash tables are of the following type. The structure
> (implementation) of this type is not needed for using the hash
> tables. All work with hash table should be executed only through
> - functions mentioned below. */
> + functions mentioned below. The size of this structure is subject to
> + change. */
>
> struct htab GTY(())
> {
> @@ -115,6 +121,11 @@ struct htab GTY(())
> /* Pointers to allocate/free functions. */
> htab_alloc alloc_f;
> htab_free free_f;
> +
> + /* Alternate allocate/free functions, which take an extra argument. */
> + PTR alloc_arg;
> + htab_alloc_with_arg alloc_with_arg_f;
> + htab_free_with_arg free_with_arg_f;
> };
>
> typedef struct htab *htab_t;
> @@ -128,9 +139,19 @@ extern htab_t htab_create_alloc PARAMS (
> htab_eq, htab_del,
> htab_alloc, htab_free));
>
> +extern htab_t htab_create_alloc_ex PARAMS ((size_t, htab_hash,
> + htab_eq, htab_del,
> + PTR, htab_alloc_with_arg,
> + htab_free_with_arg));
> +
> /* Backward-compatibility functions. */
> extern htab_t htab_create PARAMS ((size_t, htab_hash, htab_eq, htab_del));
> extern htab_t htab_try_create PARAMS ((size_t, htab_hash, htab_eq, htab_del));
> +
> +extern void htab_set_functions_ex PARAMS ((htab_t, htab_hash,
> + htab_eq, htab_del,
> + PTR, htab_alloc_with_arg,
> + htab_free_with_arg));
>
> extern void htab_delete PARAMS ((htab_t));
> extern void htab_empty PARAMS ((htab_t));
> Index: libiberty/hashtab.c
> ===================================================================
> RCS file: /big/fsf/rsync/src-cvs/src/libiberty/hashtab.c,v
> retrieving revision 1.15
> diff -u -p -r1.15 hashtab.c
> --- libiberty/hashtab.c 2003/01/20 19:03:56 1.15
> +++ libiberty/hashtab.c 2003/01/22 23:35:12
> @@ -191,6 +191,63 @@ htab_create_alloc (size, hash_f, eq_f, d
> return result;
> }
>
> +/* As above, but use the variants of alloc_f and free_f which accept
> + an extra argument. */
> +
> +htab_t
> +htab_create_alloc_ex (size, hash_f, eq_f, del_f, alloc_arg, alloc_f,
> + free_f)
> + size_t size;
> + htab_hash hash_f;
> + htab_eq eq_f;
> + htab_del del_f;
> + PTR alloc_arg;
> + htab_alloc_with_arg alloc_f;
> + htab_free_with_arg free_f;
> +{
> + htab_t result;
> +
> + size = higher_prime_number (size);
> + result = (htab_t) (*alloc_f) (alloc_arg, 1, sizeof (struct htab));
> + if (result == NULL)
> + return NULL;
> + result->entries = (PTR *) (*alloc_f) (alloc_arg, size, sizeof (PTR));
> + if (result->entries == NULL)
> + {
> + if (free_f != NULL)
> + (*free_f) (alloc_arg, result);
> + return NULL;
> + }
> + result->size = size;
> + result->hash_f = hash_f;
> + result->eq_f = eq_f;
> + result->del_f = del_f;
> + result->alloc_arg = alloc_arg;
> + result->alloc_with_arg_f = alloc_f;
> + result->free_with_arg_f = free_f;
> + return result;
> +}
> +
> +/* Update the function pointers and allocation parameter in the htab_t. */
> +
> +void
> +htab_set_functions_ex (htab, hash_f, eq_f, del_f, alloc_arg, alloc_f, free_f)
> + htab_t htab;
> + htab_hash hash_f;
> + htab_eq eq_f;
> + htab_del del_f;
> + PTR alloc_arg;
> + htab_alloc_with_arg alloc_f;
> + htab_free_with_arg free_f;
> +{
> + htab->hash_f = hash_f;
> + htab->eq_f = eq_f;
> + htab->del_f = del_f;
> + htab->alloc_arg = alloc_arg;
> + htab->alloc_with_arg_f = alloc_f;
> + htab->free_with_arg_f = free_f;
> +}
> +
> /* These functions exist solely for backward compatibility. */
>
> #undef htab_create
> @@ -234,6 +291,11 @@ htab_delete (htab)
> (*htab->free_f) (htab->entries);
> (*htab->free_f) (htab);
> }
> + else if (htab->free_with_arg_f != NULL)
> + {
> + (*htab->free_with_arg_f) (htab->alloc_arg, htab->entries);
> + (*htab->free_with_arg_f) (htab->alloc_arg, htab);
> + }
> }
>
> /* This function clears all entries in the given hash table. */
> @@ -313,7 +375,11 @@ htab_expand (htab)
>
> nsize = higher_prime_number (htab->size * 2);
>
> - nentries = (PTR *) (*htab->alloc_f) (nsize, sizeof (PTR));
> + if (htab->alloc_with_arg_f != NULL)
> + nentries = (PTR *) (*htab->alloc_with_arg_f) (htab->alloc_arg, nsize,
> + sizeof (PTR *));
> + else
> + nentries = (PTR *) (*htab->alloc_f) (nsize, sizeof (PTR *));
> if (nentries == NULL)
> return 0;
> htab->entries = nentries;
> @@ -340,6 +406,8 @@ htab_expand (htab)
>
> if (htab->free_f != NULL)
> (*htab->free_f) (oentries);
> + else if (htab->free_with_arg_f != NULL)
> + (*htab->free_with_arg_f) (htab->alloc_arg, oentries);
> return 1;
> }
>
>
--
Daniel Jacobowitz
MontaVista Software Debian GNU/Linux Developer