+2003-04-01 Geoffrey Keating <geoffk@apple.com>
+
+ * unwind-dw2-fde-darwin.c (DESTRUCTOR_MAY_BE_CALLED_LIVE): New.
+ (live_image_destructor): Reset image to initial state.
+ (examine_objects): Set DESTRUCTOR_MAY_BE_CALLED_LIVE.
+
2003-04-01 Eric Botcazou <ebotcazou@libertysurf.fr>
* config/sparc/sparc.c (input_operand): Accept bare
ALLOCED_IMAGE_MASK = 2, /* The FDE entries were allocated by
malloc, and must be freed. This isn't
used by newer libgcc versions. */
- IMAGE_IS_TEXT_MASK = 4 /* This image is in the TEXT segment. */
+ IMAGE_IS_TEXT_MASK = 4, /* This image is in the TEXT segment. */
+ DESTRUCTOR_MAY_BE_CALLED_LIVE = 8 /* The destructor may be called on an
+ object that's part of the live
+ image list. */
};
\f
-/* Delete any data we allocated on a live_images structure.
- IMAGE has already been removed from the KEYMGR_GCC3_LIVE_IMAGE_LIST.
- Called by KeyMgr (which will delete the struct after we return.) */
+/* Delete any data we allocated on a live_images structure. Either
+ IMAGE has already been removed from the
+ KEYMGR_GCC3_LIVE_IMAGE_LIST and the struct will be deleted
+ after we return, or that list is locked and we're being called
+ because this object might be about to be unloaded. Called by
+ KeyMgr. */
static void
live_image_destructor (struct live_images *image)
image->object_info = NULL;
if (image->examined_p & ALLOCED_IMAGE_MASK)
free (image->fde);
+ image->fde = NULL;
}
+ image->examined_p = 0;
+ image->destructor = NULL;
}
/* Run through the list of live images. If we can allocate memory,
image->destructor = live_image_destructor;
image->object_info = ob;
- image->examined_p |= EXAMINED_IMAGE_MASK;
+ image->examined_p |= (EXAMINED_IMAGE_MASK
+ | DESTRUCTOR_MAY_BE_CALLED_LIVE);
}
image->fde = real_fde;