From: Ralf Wildenhues Date: Tue, 14 Dec 2010 21:33:26 +0000 (+0000) Subject: gold: fix race in FileRead::~View. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=fedb228d125f9f510c29371a038cd70a9f9c5c61;p=binutils-gdb.git 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. --- diff --git a/gold/ChangeLog b/gold/ChangeLog index 7e1f6137dee..526fb78ae7b 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,11 @@ +2010-12-14 Ralf Wildenhues + + * 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. + 2010-12-14 Ralf Wildenhues * dwarf_reader.cc: Remove outdated comment. 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(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());