hashtable: drop all non-reentrant versions

The non-reentrant versions of the hashtable functions operate on a single
shared hashtable.  So if two different people try using these funcs for
two different purposes, they'll cause problems for the other.

Avoid this by converting all existing hashtable consumers over to the
reentrant versions and then punting the non-reentrant ones.

Signed-off-by: Mike Frysinger <vapier@gentoo.org>
master
Mike Frysinger 14 years ago committed by Wolfgang Denk
parent c22a711d24
commit 2eb1573f01
  1. 18
      common/cmd_nvedit.c
  2. 6
      common/env_common.c
  3. 2
      common/env_dataflash.c
  4. 2
      common/env_eeprom.c
  5. 4
      common/env_flash.c
  6. 2
      common/env_mmc.c
  7. 4
      common/env_nand.c
  8. 2
      common/env_nvram.c
  9. 2
      common/env_onenand.c
  10. 4
      common/env_sf.c
  11. 8
      include/environment.h
  12. 18
      include/search.h
  13. 40
      lib/hashtable.c

@ -111,7 +111,7 @@ static int env_print(char *name)
e.key = name; e.key = name;
e.data = NULL; e.data = NULL;
ep = hsearch (e, FIND); hsearch_r(e, FIND, &ep, &env_htab);
if (ep == NULL) if (ep == NULL)
return 0; return 0;
len = printf ("%s=%s\n", ep->key, ep->data); len = printf ("%s=%s\n", ep->key, ep->data);
@ -119,7 +119,7 @@ static int env_print(char *name)
} }
/* print whole list */ /* print whole list */
len = hexport('\n', &res, 0); len = hexport_r(&env_htab, '\n', &res, 0);
if (len > 0) { if (len > 0) {
puts(res); puts(res);
@ -184,7 +184,7 @@ int _do_env_set (int flag, int argc, char * const argv[])
*/ */
e.key = name; e.key = name;
e.data = NULL; e.data = NULL;
ep = hsearch (e, FIND); hsearch_r(e, FIND, &ep, &env_htab);
/* Check for console redirection */ /* Check for console redirection */
if (strcmp(name,"stdin") == 0) { if (strcmp(name,"stdin") == 0) {
@ -267,7 +267,7 @@ int _do_env_set (int flag, int argc, char * const argv[])
/* Delete only ? */ /* Delete only ? */
if ((argc < 3) || argv[2] == NULL) { if ((argc < 3) || argv[2] == NULL) {
int rc = hdelete(name); int rc = hdelete_r(name, &env_htab);
return !rc; return !rc;
} }
@ -293,7 +293,7 @@ int _do_env_set (int flag, int argc, char * const argv[])
e.key = name; e.key = name;
e.data = value; e.data = value;
ep = hsearch(e, ENTER); hsearch_r(e, ENTER, &ep, &env_htab);
free(value); free(value);
if (!ep) { if (!ep) {
printf("## Error inserting \"%s\" variable, errno=%d\n", printf("## Error inserting \"%s\" variable, errno=%d\n",
@ -456,7 +456,7 @@ char *getenv (char *name)
e.key = name; e.key = name;
e.data = NULL; e.data = NULL;
ep = hsearch (e, FIND); hsearch_r(e, FIND, &ep, &env_htab);
return (ep ? ep->data : NULL); return (ep ? ep->data : NULL);
} }
@ -651,7 +651,7 @@ static int do_env_export(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv
} }
if (sep) { /* export as text file */ if (sep) { /* export as text file */
len = hexport(sep, &addr, size); len = hexport_r(&env_htab, sep, &addr, size);
if (len < 0) { if (len < 0) {
error("Cannot export environment: errno = %d\n", error("Cannot export environment: errno = %d\n",
errno); errno);
@ -670,7 +670,7 @@ static int do_env_export(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv
else /* export as raw binary data */ else /* export as raw binary data */
res = addr; res = addr;
len = hexport('\0', &res, ENV_SIZE); len = hexport_r(&env_htab, '\0', &res, ENV_SIZE);
if (len < 0) { if (len < 0) {
error("Cannot export environment: errno = %d\n", error("Cannot export environment: errno = %d\n",
errno); errno);
@ -790,7 +790,7 @@ static int do_env_import(cmd_tbl_t * cmdtp, int flag, int argc, char * const arg
addr = (char *)ep->data; addr = (char *)ep->data;
} }
if (himport(addr, size, sep, del ? 0 : H_NOCLEAR) == 0) { if (himport_r(&env_htab, addr, size, sep, del ? 0 : H_NOCLEAR) == 0) {
error("Environment import failed: errno = %d\n", errno); error("Environment import failed: errno = %d\n", errno);
return 1; return 1;
} }

@ -129,6 +129,8 @@ uchar default_environment[] = {
"\0" "\0"
}; };
struct hsearch_data env_htab;
static uchar env_get_char_init (int index) static uchar env_get_char_init (int index)
{ {
uchar c; uchar c;
@ -187,7 +189,7 @@ void set_default_env(const char *s)
puts("Using default environment\n\n"); puts("Using default environment\n\n");
} }
if (himport((char *)default_environment, if (himport_r(&env_htab, (char *)default_environment,
sizeof(default_environment), '\0', 0) == 0) { sizeof(default_environment), '\0', 0) == 0) {
error("Environment import failed: errno = %d\n", errno); error("Environment import failed: errno = %d\n", errno);
} }
@ -213,7 +215,7 @@ int env_import(const char *buf, int check)
} }
} }
if (himport((char *)ep->data, ENV_SIZE, '\0', 0)) { if (himport_r(&env_htab, (char *)ep->data, ENV_SIZE, '\0', 0)) {
gd->flags |= GD_FLG_ENV_READY; gd->flags |= GD_FLG_ENV_READY;
return 1; return 1;
} }

@ -68,7 +68,7 @@ int saveenv(void)
char *res; char *res;
res = (char *)&env_new.data; res = (char *)&env_new.data;
len = hexport('\0', &res, ENV_SIZE); len = hexport_r(&env_htab, '\0', &res, ENV_SIZE);
if (len < 0) { if (len < 0) {
error("Cannot export environment: errno = %d\n", errno); error("Cannot export environment: errno = %d\n", errno);
return 1; return 1;

@ -143,7 +143,7 @@ int saveenv(void)
BUG_ON(env_ptr != NULL); BUG_ON(env_ptr != NULL);
res = (char *)&env_new.data; res = (char *)&env_new.data;
len = hexport('\0', &res, ENV_SIZE); len = hexport_r(&env_htab, '\0', &res, ENV_SIZE);
if (len < 0) { if (len < 0) {
error("Cannot export environment: errno = %d\n", errno); error("Cannot export environment: errno = %d\n", errno);
return 1; return 1;

@ -155,7 +155,7 @@ int saveenv(void)
} }
res = (char *)&env_new.data; res = (char *)&env_new.data;
len = hexport('\0', &res, ENV_SIZE); len = hexport_r(&env_htab, '\0', &res, ENV_SIZE);
if (len < 0) { if (len < 0) {
error("Cannot export environment: errno = %d\n", errno); error("Cannot export environment: errno = %d\n", errno);
goto done; goto done;
@ -289,7 +289,7 @@ int saveenv(void)
goto done; goto done;
res = (char *)&env_new.data; res = (char *)&env_new.data;
len = hexport('\0', &res, ENV_SIZE); len = hexport_r(&env_htab, '\0', &res, ENV_SIZE);
if (len < 0) { if (len < 0) {
error("Cannot export environment: errno = %d\n", errno); error("Cannot export environment: errno = %d\n", errno);
goto done; goto done;

@ -107,7 +107,7 @@ int saveenv(void)
return 1; return 1;
res = (char *)&env_new.data; res = (char *)&env_new.data;
len = hexport('\0', &res, ENV_SIZE); len = hexport_r(&env_htab, '\0', &res, ENV_SIZE);
if (len < 0) { if (len < 0) {
error("Cannot export environment: errno = %d\n", errno); error("Cannot export environment: errno = %d\n", errno);
return 1; return 1;

@ -199,7 +199,7 @@ int saveenv(void)
return 1; return 1;
res = (char *)&env_new.data; res = (char *)&env_new.data;
len = hexport('\0', &res, ENV_SIZE); len = hexport_r(&env_htab, '\0', &res, ENV_SIZE);
if (len < 0) { if (len < 0) {
error("Cannot export environment: errno = %d\n", errno); error("Cannot export environment: errno = %d\n", errno);
return 1; return 1;
@ -256,7 +256,7 @@ int saveenv(void)
return 1; return 1;
res = (char *)&env_new.data; res = (char *)&env_new.data;
len = hexport('\0', &res, ENV_SIZE); len = hexport_r(&env_htab, '\0', &res, ENV_SIZE);
if (len < 0) { if (len < 0) {
error("Cannot export environment: errno = %d\n", errno); error("Cannot export environment: errno = %d\n", errno);
return 1; return 1;

@ -94,7 +94,7 @@ int saveenv(void)
int rcode = 0; int rcode = 0;
res = (char *)&env_new.data; res = (char *)&env_new.data;
len = hexport('\0', &res, ENV_SIZE); len = hexport_r(&env_htab, '\0', &res, ENV_SIZE);
if (len < 0) { if (len < 0) {
error("Cannot export environment: errno = %d\n", errno); error("Cannot export environment: errno = %d\n", errno);
return 1; return 1;

@ -109,7 +109,7 @@ int saveenv(void)
}; };
res = (char *)&env_new.data; res = (char *)&env_new.data;
len = hexport('\0', &res, ENV_SIZE); len = hexport_r(&env_htab, '\0', &res, ENV_SIZE);
if (len < 0) { if (len < 0) {
error("Cannot export environment: errno = %d\n", errno); error("Cannot export environment: errno = %d\n", errno);
return 1; return 1;

@ -92,7 +92,7 @@ int saveenv(void)
} }
res = (char *)&env_new.data; res = (char *)&env_new.data;
len = hexport('\0', &res, ENV_SIZE); len = hexport_r(&env_htab, '\0', &res, ENV_SIZE);
if (len < 0) { if (len < 0) {
error("Cannot export environment: errno = %d\n", errno); error("Cannot export environment: errno = %d\n", errno);
return 1; return 1;
@ -308,7 +308,7 @@ int saveenv(void)
} }
res = (char *)&env_new.data; res = (char *)&env_new.data;
len = hexport('\0', &res, ENV_SIZE); len = hexport_r(&env_htab, '\0', &res, ENV_SIZE);
if (len < 0) { if (len < 0) {
error("Cannot export environment: errno = %d\n", errno); error("Cannot export environment: errno = %d\n", errno);
goto done; goto done;

@ -149,6 +149,12 @@ typedef struct environment_s {
unsigned char data[ENV_SIZE]; /* Environment data */ unsigned char data[ENV_SIZE]; /* Environment data */
} env_t; } env_t;
#ifndef DO_DEPS_ONLY
#include <search.h>
extern struct hsearch_data env_htab;
/* Function that returns a character from the environment */ /* Function that returns a character from the environment */
unsigned char env_get_char (int); unsigned char env_get_char (int);
@ -165,4 +171,6 @@ void set_default_env(const char *s);
/* Import from binary representation into hash table */ /* Import from binary representation into hash table */
int env_import(const char *buf, int check); int env_import(const char *buf, int check);
#endif
#endif /* _ENVIRONMENT_H_ */ #endif /* _ENVIRONMENT_H_ */

@ -32,15 +32,6 @@
#define __set_errno(val) do { errno = val; } while (0) #define __set_errno(val) do { errno = val; } while (0)
/*
* Prototype structure for a linked-list data structure.
* This is the type used by the `insque' and `remque' functions.
*/
/* For use with hsearch(3). */
typedef int (*__compar_fn_t) (__const void *, __const void *);
typedef __compar_fn_t comparison_fn_t;
/* Action which shall be performed in the call the hsearch. */ /* Action which shall be performed in the call the hsearch. */
typedef enum { typedef enum {
FIND, FIND,
@ -69,11 +60,9 @@ struct hsearch_data {
}; };
/* Create a new hashing table which will at most contain NEL elements. */ /* Create a new hashing table which will at most contain NEL elements. */
extern int hcreate(size_t __nel);
extern int hcreate_r(size_t __nel, struct hsearch_data *__htab); extern int hcreate_r(size_t __nel, struct hsearch_data *__htab);
/* Destroy current internal hashing table. */ /* Destroy current internal hashing table. */
extern void hdestroy(void);
extern void hdestroy_r(struct hsearch_data *__htab); extern void hdestroy_r(struct hsearch_data *__htab);
/* /*
@ -82,25 +71,20 @@ extern void hdestroy_r(struct hsearch_data *__htab);
* NULL. If ACTION is `ENTER' replace existing data (if any) with * NULL. If ACTION is `ENTER' replace existing data (if any) with
* ITEM.data. * ITEM.data.
* */ * */
extern ENTRY *hsearch(ENTRY __item, ACTION __action);
extern int hsearch_r(ENTRY __item, ACTION __action, ENTRY ** __retval, extern int hsearch_r(ENTRY __item, ACTION __action, ENTRY ** __retval,
struct hsearch_data *__htab); struct hsearch_data *__htab);
/* Search and delete entry matching ITEM.key in internal hash table. */ /* Search and delete entry matching ITEM.key in internal hash table. */
extern int hdelete(const char *__key);
extern int hdelete_r(const char *__key, struct hsearch_data *__htab); extern int hdelete_r(const char *__key, struct hsearch_data *__htab);
extern ssize_t hexport(const char __sep, char **__resp, size_t __size);
extern ssize_t hexport_r(struct hsearch_data *__htab, extern ssize_t hexport_r(struct hsearch_data *__htab,
const char __sep, char **__resp, size_t __size); const char __sep, char **__resp, size_t __size);
extern int himport(const char *__env, size_t __size, const char __sep,
int __flag);
extern int himport_r(struct hsearch_data *__htab, extern int himport_r(struct hsearch_data *__htab,
const char *__env, size_t __size, const char __sep, const char *__env, size_t __size, const char __sep,
int __flag); int __flag);
/* Flags for himport() / himport_r() */ /* Flags for himport_r() */
#define H_NOCLEAR 1 /* do not clear hash table before importing */ #define H_NOCLEAR 1 /* do not clear hash table before importing */
#endif /* search.h */ #endif /* search.h */

@ -60,11 +60,6 @@
*/ */
/* /*
* The non-reentrant version use a global space for storing the hash table.
*/
static struct hsearch_data htab;
/*
* The reentrant version has no static variables to maintain the state. * The reentrant version has no static variables to maintain the state.
* Instead the interface of all functions is extended to take an argument * Instead the interface of all functions is extended to take an argument
* which describes the current status. * which describes the current status.
@ -97,11 +92,6 @@ static int isprime(unsigned int number)
return number % div != 0; return number % div != 0;
} }
int hcreate(size_t nel)
{
return hcreate_r(nel, &htab);
}
/* /*
* Before using the hash table we must allocate memory for it. * Before using the hash table we must allocate memory for it.
* Test for an existing table are done. We allocate one element * Test for an existing table are done. We allocate one element
@ -110,6 +100,7 @@ int hcreate(size_t nel)
* The contents of the table is zeroed, especially the field used * The contents of the table is zeroed, especially the field used
* becomes zero. * becomes zero.
*/ */
int hcreate_r(size_t nel, struct hsearch_data *htab) int hcreate_r(size_t nel, struct hsearch_data *htab)
{ {
/* Test for correct arguments. */ /* Test for correct arguments. */
@ -143,15 +134,12 @@ int hcreate_r(size_t nel, struct hsearch_data *htab)
/* /*
* hdestroy() * hdestroy()
*/ */
void hdestroy(void)
{
hdestroy_r(&htab);
}
/* /*
* After using the hash table it has to be destroyed. The used memory can * After using the hash table it has to be destroyed. The used memory can
* be freed and the local static variable can be marked as not used. * be freed and the local static variable can be marked as not used.
*/ */
void hdestroy_r(struct hsearch_data *htab) void hdestroy_r(struct hsearch_data *htab)
{ {
int i; int i;
@ -214,15 +202,6 @@ void hdestroy_r(struct hsearch_data *htab)
* example for functions like hdelete(). * example for functions like hdelete().
*/ */
ENTRY *hsearch(ENTRY item, ACTION action)
{
ENTRY *result;
(void) hsearch_r(item, action, &result, &htab);
return result;
}
int hsearch_r(ENTRY item, ACTION action, ENTRY ** retval, int hsearch_r(ENTRY item, ACTION action, ENTRY ** retval,
struct hsearch_data *htab) struct hsearch_data *htab)
{ {
@ -369,11 +348,6 @@ int hsearch_r(ENTRY item, ACTION action, ENTRY ** retval,
* do that. * do that.
*/ */
int hdelete(const char *key)
{
return hdelete_r(key, &htab);
}
int hdelete_r(const char *key, struct hsearch_data *htab) int hdelete_r(const char *key, struct hsearch_data *htab)
{ {
ENTRY e, *ep; ENTRY e, *ep;
@ -442,11 +416,6 @@ int hdelete_r(const char *key, struct hsearch_data *htab)
* bytes in the string will be '\0'-padded. * bytes in the string will be '\0'-padded.
*/ */
ssize_t hexport(const char sep, char **resp, size_t size)
{
return hexport_r(&htab, sep, resp, size);
}
static int cmpkey(const void *p1, const void *p2) static int cmpkey(const void *p1, const void *p2)
{ {
ENTRY *e1 = *(ENTRY **) p1; ENTRY *e1 = *(ENTRY **) p1;
@ -605,11 +574,6 @@ ssize_t hexport_r(struct hsearch_data *htab, const char sep,
* '\0' and '\n' have really been tested. * '\0' and '\n' have really been tested.
*/ */
int himport(const char *env, size_t size, const char sep, int flag)
{
return himport_r(&htab, env, size, sep, flag);
}
int himport_r(struct hsearch_data *htab, int himport_r(struct hsearch_data *htab,
const char *env, size_t size, const char sep, int flag) const char *env, size_t size, const char sep, int flag)
{ {

Loading…
Cancel
Save