This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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_;


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]