* descriptors.cc (Descriptors::close_all): New function.
authorIan Lance Taylor <ian@airs.com>
Mon, 11 Feb 2013 16:12:59 +0000 (16:12 +0000)
committerIan Lance Taylor <ian@airs.com>
Mon, 11 Feb 2013 16:12:59 +0000 (16:12 +0000)
* descriptors.h (class Descriptors): Declare close_all.
(close_all_descriptors): New inline function.
* plugin.cc: Include "descriptors.h".
(Plugin_manager::cleanup): Call close_all_descriptors.

gold/ChangeLog
gold/descriptors.cc
gold/descriptors.h
gold/plugin.cc

index 84b00e2ae490bbd5dbfb3c5bee759a1258cba652..509db4b52d74b2ba2936704bb7855c513a97a889 100644 (file)
@@ -1,3 +1,11 @@
+2013-02-11  Ian Lance Taylor  <iant@google.com>
+
+       * descriptors.cc (Descriptors::close_all): New function.
+       * descriptors.h (class Descriptors): Declare close_all.
+       (close_all_descriptors): New inline function.
+       * plugin.cc: Include "descriptors.h".
+       (Plugin_manager::cleanup): Call close_all_descriptors.
+
 2013-02-06  Alan Modra  <amodra@gmail.com>
 
        * README: Update coding style link.
index f3f071e32b269feac69082f15c85f580ce0146f0..b7fbaa61deb922579a5e84cf42be2e797ae31ae8 100644 (file)
@@ -1,6 +1,6 @@
 // descriptors.cc -- manage file descriptors for gold
 
-// Copyright 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
+// Copyright 2008, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc.
 // Written by Ian Lance Taylor <iant@google.com>.
 
 // This file is part of gold.
@@ -251,6 +251,28 @@ Descriptors::close_some_descriptor()
   return false;
 }
 
+// Close all the descriptors open for reading.
+
+void
+Descriptors::close_all()
+{
+  Hold_optional_lock hl(this->lock_);
+
+  for (size_t i = 0; i < this->open_descriptors_.size(); i++)
+    {
+      Open_descriptor* pod = &this->open_descriptors_[i];
+      if (pod->name != NULL && !pod->inuse && !pod->is_write)
+       {
+         if (::close(i) < 0)
+           gold_warning(_("while closing %s: %s"), pod->name, strerror(errno));
+         pod->name = NULL;
+         pod->stack_next = -1;
+         pod->is_on_stack = false;
+       }
+    }
+  this->stack_top_ = -1;
+}
+
 // The single global variable which manages descriptors.
 
 Descriptors descriptors;
index 8e154a631d31d1e80485fb704d0691b2f9bc6061..985f804574eb05c139f49e0600b8f397bc0a4077 100644 (file)
@@ -1,6 +1,6 @@
 // descriptors.h -- manage file descriptors for gold   -*- C++ -*-
 
-// Copyright 2008, 2009 Free Software Foundation, Inc.
+// Copyright 2008, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc.
 // Written by Ian Lance Taylor <iant@google.com>.
 
 // This file is part of gold.
@@ -56,6 +56,10 @@ class Descriptors
   void
   release(int descriptor, bool permanent);
 
+  // Close all the descriptors open for reading.
+  void
+  close_all();
+
  private:
   // Information kept for a descriptor.
   struct Open_descriptor
@@ -104,6 +108,10 @@ inline void
 release_descriptor(int descriptor, bool permanent)
 { descriptors.release(descriptor, permanent); }
 
+inline void
+close_all_descriptors()
+{ descriptors.close_all(); }
+
 } // End namespace gold.
 
 #endif // !defined(GOLD_DESCRIPTORS_H)
index 9176e066efc4ff7570dbf7aaf26a7d2c5c021fc1..e932c1c995bcf67085a41ae13ca509ee3676fa46 100644 (file)
@@ -71,6 +71,7 @@ dlerror(void)
 #include "target.h"
 #include "readsyms.h"
 #include "symtab.h"
+#include "descriptors.h"
 #include "elfcpp.h"
 
 namespace gold
@@ -697,6 +698,14 @@ Plugin_manager::layout_deferred_objects()
 void
 Plugin_manager::cleanup()
 {
+  if (this->any_added_)
+    {
+      // If any input files were added, close all the input files.
+      // This is because the plugin may want to remove them, and on
+      // Windows you are not allowed to remove an open file.
+      close_all_descriptors();
+    }
+
   for (this->current_ = this->plugins_.begin();
        this->current_ != this->plugins_.end();
        ++this->current_)