do
while (__exit_funcs->idx > 0)
exit (int status){  /* We do it this way to handle recursive calls to exit () made by     the functions registered with `atexit' and `on_exit'. We call     everyone on the list and use the status value in the last     exit (). */  while (__exit_funcs != NULL)    {      struct exit_function_list *old;      do	{	  const struct exit_function *const f =	    &__exit_funcs->fns[--__exit_funcs->idx];	  switch (f->flavor)	    {	    case ef_free:	    case ef_us:	      break;	    case ef_on:	      (*f->func.on.fn) (status, f->func.on.arg);	      break;	    case ef_at:	      (*f->func.at) ();	      break;	    }	}      while (__exit_funcs->idx > 0);      old = __exit_funcs;      __exit_funcs = __exit_funcs->next;      if (__exit_funcs != NULL)	/* Don't free the last element in the chain, this is the statically	   allocate element.  */	free (old);    }#ifdef	HAVE_GNU_LD  RUN_HOOK (__libc_atexit, ());#else  {    extern void _cleanup (void);    _cleanup ();  }#endif  _exit (status);}