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.
This commit is contained in:
Ralf Wildenhues 2010-12-14 21:33:26 +00:00
parent a8852dc55e
commit fedb228d12
2 changed files with 25 additions and 10 deletions

View File

@ -1,3 +1,11 @@
2010-12-14 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
* 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 <Ralf.Wildenhues@gmx.de>
* dwarf_reader.cc: Remove outdated comment.

View File

@ -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());