Commit b40b9d93 by Mike Stump

crtstuff.c (__do_global_dtors_aux): Allow finalization code to be run more than once.

        * crtstuff.c (__do_global_dtors_aux): Allow finalization code to
        be run more than once.
        * libgcc2.c (__do_global_dtors): Ditto.

From-SVN: r13023
parent 3e943b59
......@@ -111,15 +111,23 @@ typedef void (*func_ptr) (void);
functions in each root executable and one in each shared library, but
although they all have the same code, each one is unique in that it
refers to one particular associated `__DTOR_LIST__' which belongs to the
same particular root executable or shared library file. */
same particular root executable or shared library file.
On some systems, this routine is run more than once from the .fini,
when exit is called recursively, so we arrange to remember where in
the list we left off processing, and we resume at that point,
should we be re-invoked. */
static func_ptr __DTOR_LIST__[];
static void
__do_global_dtors_aux ()
{
func_ptr *p;
for (p = __DTOR_LIST__ + 1; *p; p++)
(*p) ();
static func_ptr *p = __DTOR_LIST__ + 1;
while (*p)
{
p++;
(*(p-1)) ();
}
}
/* Stick a call to __do_global_dtors_aux into the .fini section. */
......
......@@ -2829,9 +2829,12 @@ __do_global_dtors ()
#ifdef DO_GLOBAL_DTORS_BODY
DO_GLOBAL_DTORS_BODY;
#else
func_ptr *p;
for (p = __DTOR_LIST__ + 1; *p; )
(*p++) ();
static func_ptr *p = __DTOR_LIST__ + 1;
while (*p)
{
p++;
(*(p-1)) ();
}
#endif
}
#endif
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment