summaryrefslogtreecommitdiff
path: root/gold/fileread.cc
diff options
context:
space:
mode:
authorRalf Wildenhues <Ralf.Wildenhues@gmx.de>2010-12-14 21:33:26 +0000
committerRalf Wildenhues <Ralf.Wildenhues@gmx.de>2010-12-14 21:33:26 +0000
commitfedb228d125f9f510c29371a038cd70a9f9c5c61 (patch)
tree28c92c0766d08b11199afff27a3bb3914201ecee /gold/fileread.cc
parenta8852dc55e66b770e87e3028189ed2be09e86b81 (diff)
downloadbinutils-gdb-fedb228d125f9f510c29371a038cd70a9f9c5c61.tar.gz
gold: fix race in FileRead::~View.
gold/: * fileread.cc (file_counts_lock, file_counts_initialize_lock) (total_mapped_bytes, current_mapped_bytes, maximum_mapped_bytes): Move definition before File_read::View member definitions. (File_read::View::~View): Initialize and hold lock before updating current_mapped_bytes.
Diffstat (limited to 'gold/fileread.cc')
-rw-r--r--gold/fileread.cc27
1 files changed, 17 insertions, 10 deletions
diff --git a/gold/fileread.cc b/gold/fileread.cc
index a16738a0d59..14a02b2f52f 100644
--- a/gold/fileread.cc
+++ b/gold/fileread.cc
@@ -57,6 +57,17 @@ readv(int, const iovec*, int)
namespace gold
{
+// Class File_read.
+
+// A lock for the File_read static variables.
+static Lock* file_counts_lock = NULL;
+static Initialize_lock file_counts_initialize_lock(&file_counts_lock);
+
+// The File_read static variables.
+unsigned long long File_read::total_mapped_bytes;
+unsigned long long File_read::current_mapped_bytes;
+unsigned long long File_read::maximum_mapped_bytes;
+
// Class File_read::View.
File_read::View::~View()
@@ -70,7 +81,12 @@ File_read::View::~View()
case DATA_MMAPPED:
if (::munmap(const_cast<unsigned char*>(this->data_), this->size_) != 0)
gold_warning(_("munmap failed: %s"), strerror(errno));
- File_read::current_mapped_bytes -= this->size_;
+ if (!parameters->options_valid() || parameters->options().stats())
+ {
+ file_counts_initialize_lock.initialize();
+ Hold_optional_lock hl(file_counts_lock);
+ File_read::current_mapped_bytes -= this->size_;
+ }
break;
case DATA_NOT_OWNED:
break;
@@ -100,15 +116,6 @@ File_read::View::is_locked()
// Class File_read.
-// A lock for the File_read static variables.
-static Lock* file_counts_lock = NULL;
-static Initialize_lock file_counts_initialize_lock(&file_counts_lock);
-
-// The File_read static variables.
-unsigned long long File_read::total_mapped_bytes;
-unsigned long long File_read::current_mapped_bytes;
-unsigned long long File_read::maximum_mapped_bytes;
-
File_read::~File_read()
{
gold_assert(this->token_.is_writable());