|
Packit Service |
97d2fb |
/* Copyright (C) 2000-2019 Red Hat, Inc.
|
|
Packit Service |
97d2fb |
This file is part of elfutils.
|
|
Packit Service |
97d2fb |
Written by Srdan Milakovic <sm108@rice.edu>, 2019.
|
|
Packit Service |
97d2fb |
Derived from Ulrich Drepper <drepper@redhat.com>, 2000.
|
|
Packit Service |
97d2fb |
|
|
Packit Service |
97d2fb |
This file is free software; you can redistribute it and/or modify
|
|
Packit Service |
97d2fb |
it under the terms of either
|
|
Packit Service |
97d2fb |
|
|
Packit Service |
97d2fb |
* the GNU Lesser General Public License as published by the Free
|
|
Packit Service |
97d2fb |
Software Foundation; either version 3 of the License, or (at
|
|
Packit Service |
97d2fb |
your option) any later version
|
|
Packit Service |
97d2fb |
|
|
Packit Service |
97d2fb |
or
|
|
Packit Service |
97d2fb |
|
|
Packit Service |
97d2fb |
* the GNU General Public License as published by the Free
|
|
Packit Service |
97d2fb |
Software Foundation; either version 2 of the License, or (at
|
|
Packit Service |
97d2fb |
your option) any later version
|
|
Packit Service |
97d2fb |
|
|
Packit Service |
97d2fb |
or both in parallel, as here.
|
|
Packit Service |
97d2fb |
|
|
Packit Service |
97d2fb |
elfutils is distributed in the hope that it will be useful, but
|
|
Packit Service |
97d2fb |
WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit Service |
97d2fb |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit Service |
97d2fb |
General Public License for more details.
|
|
Packit Service |
97d2fb |
|
|
Packit Service |
97d2fb |
You should have received copies of the GNU General Public License and
|
|
Packit Service |
97d2fb |
the GNU Lesser General Public License along with this program. If
|
|
Packit Service |
97d2fb |
not, see <http://www.gnu.org/licenses/>. */
|
|
Packit Service |
97d2fb |
|
|
Packit Service |
97d2fb |
#include <stddef.h>
|
|
Packit Service |
97d2fb |
#include <pthread.h>
|
|
Packit Service |
97d2fb |
#include "atomics.h"
|
|
Packit Service |
97d2fb |
/* Before including this file the following macros must be defined:
|
|
Packit Service |
97d2fb |
|
|
Packit Service |
97d2fb |
NAME name of the hash table structure.
|
|
Packit Service |
97d2fb |
TYPE data type of the hash table entries
|
|
Packit Service |
97d2fb |
|
|
Packit Service |
97d2fb |
The following macros if present select features:
|
|
Packit Service |
97d2fb |
|
|
Packit Service |
97d2fb |
ITERATE iterating over the table entries is possible
|
|
Packit Service |
97d2fb |
HASHTYPE integer type for hash values, default unsigned long int
|
|
Packit Service |
97d2fb |
*/
|
|
Packit Service |
97d2fb |
|
|
Packit Service |
97d2fb |
|
|
Packit Service |
97d2fb |
|
|
Packit Service |
97d2fb |
#ifndef HASHTYPE
|
|
Packit Service |
97d2fb |
# define HASHTYPE unsigned long int
|
|
Packit Service |
97d2fb |
#endif
|
|
Packit Service |
97d2fb |
|
|
Packit Service |
97d2fb |
#ifndef RESIZE_BLOCK_SIZE
|
|
Packit Service |
97d2fb |
# define RESIZE_BLOCK_SIZE 256
|
|
Packit Service |
97d2fb |
#endif
|
|
Packit Service |
97d2fb |
|
|
Packit Service |
97d2fb |
/* Defined separately. */
|
|
Packit Service |
97d2fb |
extern size_t next_prime (size_t seed);
|
|
Packit Service |
97d2fb |
|
|
Packit Service |
97d2fb |
|
|
Packit Service |
97d2fb |
/* Table entry type. */
|
|
Packit Service |
97d2fb |
#define _DYNHASHCONENTTYPE(name) \
|
|
Packit Service |
97d2fb |
typedef struct name##_ent \
|
|
Packit Service |
97d2fb |
{ \
|
|
Packit Service |
97d2fb |
_Atomic(HASHTYPE) hashval; \
|
|
Packit Service |
97d2fb |
atomic_uintptr_t val_ptr; \
|
|
Packit Service |
97d2fb |
} name##_ent
|
|
Packit Service |
97d2fb |
#define DYNHASHENTTYPE(name) _DYNHASHCONENTTYPE (name)
|
|
Packit Service |
97d2fb |
DYNHASHENTTYPE (NAME);
|
|
Packit Service |
97d2fb |
|
|
Packit Service |
97d2fb |
/* Type of the dynamic hash table data structure. */
|
|
Packit Service |
97d2fb |
#define _DYNHASHCONTYPE(name) \
|
|
Packit Service |
97d2fb |
typedef struct \
|
|
Packit Service |
97d2fb |
{ \
|
|
Packit Service |
97d2fb |
size_t size; \
|
|
Packit Service |
97d2fb |
size_t old_size; \
|
|
Packit Service |
97d2fb |
atomic_size_t filled; \
|
|
Packit Service |
97d2fb |
name##_ent *table; \
|
|
Packit Service |
97d2fb |
name##_ent *old_table; \
|
|
Packit Service |
97d2fb |
atomic_size_t resizing_state; \
|
|
Packit Service |
97d2fb |
atomic_size_t next_init_block; \
|
|
Packit Service |
97d2fb |
atomic_size_t num_initialized_blocks; \
|
|
Packit Service |
97d2fb |
atomic_size_t next_move_block; \
|
|
Packit Service |
97d2fb |
atomic_size_t num_moved_blocks; \
|
|
Packit Service |
97d2fb |
pthread_rwlock_t resize_rwl; \
|
|
Packit Service |
97d2fb |
} name
|
|
Packit Service |
97d2fb |
#define DYNHASHTYPE(name) _DYNHASHCONTYPE (name)
|
|
Packit Service |
97d2fb |
DYNHASHTYPE (NAME);
|
|
Packit Service |
97d2fb |
|
|
Packit Service |
97d2fb |
|
|
Packit Service |
97d2fb |
|
|
Packit Service |
97d2fb |
#define _FUNCTIONS(name) \
|
|
Packit Service |
97d2fb |
/* Initialize the hash table. */ \
|
|
Packit Service |
97d2fb |
extern int name##_init (name *htab, size_t init_size); \
|
|
Packit Service |
97d2fb |
\
|
|
Packit Service |
97d2fb |
/* Free resources allocated for hash table. */ \
|
|
Packit Service |
97d2fb |
extern int name##_free (name *htab); \
|
|
Packit Service |
97d2fb |
\
|
|
Packit Service |
97d2fb |
/* Insert new entry. */ \
|
|
Packit Service |
97d2fb |
extern int name##_insert (name *htab, HASHTYPE hval, TYPE data); \
|
|
Packit Service |
97d2fb |
\
|
|
Packit Service |
97d2fb |
/* Find entry in hash table. */ \
|
|
Packit Service |
97d2fb |
extern TYPE name##_find (name *htab, HASHTYPE hval);
|
|
Packit Service |
97d2fb |
#define FUNCTIONS(name) _FUNCTIONS (name)
|
|
Packit Service |
97d2fb |
FUNCTIONS (NAME)
|
|
Packit Service |
97d2fb |
|
|
Packit Service |
97d2fb |
|
|
Packit Service |
97d2fb |
#ifndef NO_UNDEF
|
|
Packit Service |
97d2fb |
# undef DYNHASHENTTYPE
|
|
Packit Service |
97d2fb |
# undef DYNHASHTYPE
|
|
Packit Service |
97d2fb |
# undef FUNCTIONS
|
|
Packit Service |
97d2fb |
# undef _FUNCTIONS
|
|
Packit Service |
97d2fb |
# undef XFUNCTIONS
|
|
Packit Service |
97d2fb |
# undef _XFUNCTIONS
|
|
Packit Service |
97d2fb |
# undef NAME
|
|
Packit Service |
97d2fb |
# undef TYPE
|
|
Packit Service |
97d2fb |
# undef ITERATE
|
|
Packit Service |
97d2fb |
# undef COMPARE
|
|
Packit Service |
97d2fb |
# undef FIRST
|
|
Packit Service |
97d2fb |
# undef NEXT
|
|
Packit Service |
97d2fb |
#endif
|