This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[gold][patch] Fix plugin API to call cleanup handlers on error exits
- From: Cary Coutant <ccoutant at google dot com>
- To: Binutils <binutils at sourceware dot org>
- Date: Tue, 23 Dec 2008 17:11:13 -0800
- Subject: [gold][patch] Fix plugin API to call cleanup handlers on error exits
This patch fixes the plugin API so that cleanup handlers are called
just before gold exits, if they haven't been called already. This
assures that any temporary files or directories created by the plugin
when it is loaded will always be removed.
-cary
* gold.cc (gold_exit): Call plugin cleanup handlers on exit.
* plugin.cc (Plugin_manager::finish): Rename as
layout_deferred_objects. Move cleanup to separate function.
(Plugin_manager::cleanup): New function.
(Plugin_finish::run): Call layout_deferred_objects and cleanup
separately.
* plugin.h (Plugin_manager::finish): Rename as
layout_deferred_objects.
(Plugin_manager::cleanup): New function.
(Plugin_manager::cleanup_done): New field.
Index: gold.cc
===================================================================
RCS file: /cvs/src/src/gold/gold.cc,v
retrieving revision 1.59
diff -u -p -r1.59 gold.cc
--- gold.cc 7 Oct 2008 23:40:21 -0000 1.59
+++ gold.cc 24 Dec 2008 01:02:58 -0000
@@ -50,6 +50,10 @@ const char* program_name;
void
gold_exit(bool status)
{
+ if (parameters != NULL
+ && parameters->options_valid()
+ && parameters->options().has_plugins())
+ parameters->options().plugins()->cleanup();
if (!status && parameters != NULL && parameters->options_valid())
unlink_if_ordinary(parameters->options().output_file_name());
exit(status ? EXIT_SUCCESS : EXIT_FAILURE);
Index: plugin.cc
===================================================================
RCS file: /cvs/src/src/gold/plugin.cc,v
retrieving revision 1.7
diff -u -p -r1.7 plugin.cc
--- plugin.cc 23 Dec 2008 23:46:55 -0000 1.7
+++ plugin.cc 24 Dec 2008 01:02:58 -0000
@@ -306,10 +306,10 @@ Plugin_manager::all_symbols_read(Workque
*last_blocker = this->this_blocker_;
}
-// Layout deferred sections and call the cleanup handlers.
+// Layout deferred objects.
void
-Plugin_manager::finish()
+Plugin_manager::layout_deferred_objects()
{
Deferred_layout_list::iterator obj;
@@ -317,11 +317,20 @@ Plugin_manager::finish()
obj != this->deferred_layout_objects_.end();
++obj)
(*obj)->layout_deferred_sections(this->layout_);
+}
+
+// Call the cleanup handlers.
+void
+Plugin_manager::cleanup()
+{
+ if (this->cleanup_done_)
+ return;
for (this->current_ = this->plugins_.begin();
this->current_ != this->plugins_.end();
++this->current_)
(*this->current_)->cleanup();
+ this->cleanup_done_ = true;
}
// Make a new Pluginobj object. This is called when the plugin calls
@@ -766,7 +775,12 @@ class Plugin_finish : public Task
void
run(Workqueue*)
- { parameters->options().plugins()->finish(); }
+ {
+ Plugin_manager* plugins = parameters->options().plugins();
+ gold_assert(plugins != NULL);
+ plugins->layout_deferred_objects();
+ plugins->cleanup();
+ }
std::string
get_name() const
Index: plugin.h
===================================================================
RCS file: /cvs/src/src/gold/plugin.h,v
retrieving revision 1.3
diff -u -p -r1.3 plugin.h
--- plugin.h 23 Dec 2008 02:02:20 -0000 1.3
+++ plugin.h 24 Dec 2008 01:02:58 -0000
@@ -121,9 +121,9 @@ class Plugin_manager
public:
Plugin_manager(const General_options& options)
: plugins_(), objects_(), deferred_layout_objects_(), input_file_(NULL),
- plugin_input_file_(), in_replacement_phase_(false), options_(options),
- workqueue_(NULL), input_objects_(NULL), symtab_(NULL), layout_(NULL),
- dirpath_(NULL), mapfile_(NULL), this_blocker_(NULL)
+ plugin_input_file_(), in_replacement_phase_(false), cleanup_done_(false),
+ options_(options), workqueue_(NULL), input_objects_(NULL), symtab_(NULL),
+ layout_(NULL), dirpath_(NULL), mapfile_(NULL), this_blocker_(NULL)
{ this->current_ = plugins_.end(); }
~Plugin_manager();
@@ -155,9 +155,13 @@ class Plugin_manager
Symbol_table* symtab, Layout* layout, Dirsearch* dirpath,
Mapfile* mapfile, Task_token** last_blocker);
- // Run deferred layout and call the cleanup handlers.
+ // Run deferred layout.
void
- finish();
+ layout_deferred_objects();
+
+ // Call the cleanup handlers.
+ void
+ cleanup();
// Register a claim-file handler.
void
@@ -248,6 +252,9 @@ class Plugin_manager
// placeholder symbols from the Pluginobj objects.
bool in_replacement_phase_;
+ // TRUE if the cleanup handlers have been called.
+ bool cleanup_done_;
+
const General_options& options_;
Workqueue* workqueue_;
Input_objects* input_objects_;