The info removal code was overcomplicated, and error-prone (references being wrongly decreased). Fixed.

This commit is contained in:
Richard Levitte 1999-11-12 21:51:24 +00:00
parent 47d216940c
commit 6828f02c9a

View File

@ -223,27 +223,6 @@ static unsigned long app_info_hash(APP_INFO *a)
return(ret); return(ret);
} }
static APP_INFO *free_info(APP_INFO *app_info)
{
APP_INFO *next;
if (app_info == NULL)
return NULL;
if (--(app_info->references) > 0)
return app_info;
app_info->references = 0;
next = app_info->next;
app_info->next = NULL; /* Just to make sure */
Free(app_info);
if (next != app_info)
return free_info(next);
return NULL;
}
static APP_INFO *remove_info() static APP_INFO *remove_info()
{ {
APP_INFO tmp; APP_INFO tmp;
@ -255,6 +234,12 @@ static APP_INFO *remove_info()
if ((ret=(APP_INFO *)lh_delete(amih,(char *)&tmp)) != NULL) if ((ret=(APP_INFO *)lh_delete(amih,(char *)&tmp)) != NULL)
{ {
APP_INFO *next=ret->next; APP_INFO *next=ret->next;
if (next != NULL)
{
next->references++;
lh_insert(amih,(char *)next);
}
#ifdef LEVITTE_DEBUG #ifdef LEVITTE_DEBUG
if (ret->thread != tmp.thread) if (ret->thread != tmp.thread)
{ {
@ -263,11 +248,13 @@ static APP_INFO *remove_info()
abort(); abort();
} }
#endif #endif
if (next != NULL) if (--(ret->references) <= 0)
{ {
lh_insert(amih,(char *)next); ret->next = NULL;
if (next != NULL)
next->references--;
Free(ret);
} }
free_info(ret);
} }
} }
return(ret); return(ret);