Commit 6828f02c authored by Richard Levitte's avatar Richard Levitte
Browse files

The info removal code was overcomplicated, and error-prone (references being...

The info removal code was overcomplicated, and error-prone (references being wrongly decreased).  Fixed.
parent 47d21694
Loading
Loading
Loading
Loading
+11 −24
Original line number Diff line number Diff line
@@ -223,27 +223,6 @@ static unsigned long app_info_hash(APP_INFO *a)
	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()
	{
	APP_INFO tmp;
@@ -255,6 +234,12 @@ static APP_INFO *remove_info()
		if ((ret=(APP_INFO *)lh_delete(amih,(char *)&tmp)) != NULL)
			{
			APP_INFO *next=ret->next;

			if (next != NULL)
				{
				next->references++;
				lh_insert(amih,(char *)next);
				}
#ifdef LEVITTE_DEBUG
			if (ret->thread != tmp.thread)
				{
@@ -263,11 +248,13 @@ static APP_INFO *remove_info()
				abort();
				}
#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);