X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gold%2Fdescriptors.cc;h=53d24c5c51c0caff5114fbfcd8b575018b9115cf;hb=54ac3df1adbf7b4b3470a8df08caa0aea4c89616;hp=2ab0d5c8816306dd58d561bf69a08e47d0f6ef57;hpb=d0a9ace301659a82d936cfba740564f6a9ec288a;p=deliverable%2Fbinutils-gdb.git diff --git a/gold/descriptors.cc b/gold/descriptors.cc index 2ab0d5c881..53d24c5c51 100644 --- a/gold/descriptors.cc +++ b/gold/descriptors.cc @@ -1,6 +1,6 @@ // descriptors.cc -- manage file descriptors for gold -// Copyright 2008, 2009, 2010, 2011 Free Software Foundation, Inc. +// Copyright (C) 2008-2020 Free Software Foundation, Inc. // Written by Ian Lance Taylor . // This file is part of gold. @@ -26,8 +26,10 @@ #include #include #include +#include #include +#include "debug.h" #include "parameters.h" #include "options.h" #include "gold-threads.h" @@ -45,7 +47,7 @@ #endif static inline void -set_close_on_exec(int fd) +set_close_on_exec(int fd ATTRIBUTE_UNUSED) { // Mingw does not define F_SETFD. #ifdef F_SETFD @@ -81,6 +83,9 @@ Descriptors::open(int descriptor, const char* name, int flags, int mode) gold_assert(lock_initialized || descriptor < 0); + if (is_debugging_enabled(DEBUG_FILES)) + this->limit_ = 8; + if (descriptor >= 0) { Hold_lock hl(*this->lock_); @@ -99,6 +104,8 @@ Descriptors::open(int descriptor, const char* name, int flags, int mode) pod->stack_next = -1; pod->is_on_stack = false; } + gold_debug(DEBUG_FILES, "Reused existing descriptor %d for \"%s\"", + descriptor, name); return descriptor; } } @@ -128,6 +135,8 @@ Descriptors::open(int descriptor, const char* name, int flags, int mode) errno = ENOENT; } + gold_debug(DEBUG_FILES, "Opened new descriptor %d for \"%s\"", + new_descriptor, name); return new_descriptor; } @@ -162,6 +171,8 @@ Descriptors::open(int descriptor, const char* name, int flags, int mode) if (this->current_ >= this->limit_) this->close_some_descriptor(); + gold_debug(DEBUG_FILES, "Opened new descriptor %d for \"%s\"", + new_descriptor, name); return new_descriptor; } } @@ -209,6 +220,9 @@ Descriptors::release(int descriptor, bool permanent) pod->is_on_stack = true; } } + + gold_debug(DEBUG_FILES, "Released descriptor %d for \"%s\"", + descriptor, pod->name); } // Close some descriptor. The lock is held when this is called. We @@ -233,6 +247,8 @@ Descriptors::close_some_descriptor() if (::close(i) < 0) gold_warning(_("while closing %s: %s"), pod->name, strerror(errno)); --this->current_; + gold_debug(DEBUG_FILES, "Closed descriptor %d for \"%s\"", + i, pod->name); pod->name = NULL; if (last < 0) this->stack_top_ = pod->stack_next; @@ -251,6 +267,30 @@ 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)); + gold_debug(DEBUG_FILES, "Closed descriptor %d for \"%s\" (close_all)", + static_cast(i), pod->name); + 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;