aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2017-01-16 22:39:27 +0100
committerEelco Dolstra <edolstra@gmail.com>2017-01-16 22:39:27 +0100
commit8079ab87a2a7cd288a35334517da7a808af8e1e0 (patch)
tree011aa471421d7d51033077994464ecdd3fe9a1eb
parent2b9d0a99cbf7649c20492bc539e2823a2d2e57c5 (diff)
AutoCloseDir: Use std::unique_ptr
-rw-r--r--src/libstore/gc.cc16
-rw-r--r--src/libstore/optimise-store.cc8
-rw-r--r--src/libutil/util.cc46
-rw-r--r--src/libutil/util.hh15
4 files changed, 20 insertions, 65 deletions
diff --git a/src/libstore/gc.cc b/src/libstore/gc.cc
index f8c4a0723..8e90913cc 100644
--- a/src/libstore/gc.cc
+++ b/src/libstore/gc.cc
@@ -379,7 +379,7 @@ void LocalStore::findRuntimeRoots(PathSet & roots)
auto digitsRegex = std::regex(R"(^\d+$)");
auto mapRegex = std::regex(R"(^\s*\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+(/\S+)\s*$)");
auto storePathRegex = std::regex(quoteRegexChars(storeDir) + R"(/[0-9a-z]+[0-9a-zA-Z\+\-\._\?=]*)");
- while (errno = 0, ent = readdir(procDir)) {
+ while (errno = 0, ent = readdir(procDir.get())) {
checkInterrupt();
if (std::regex_match(ent->d_name, digitsRegex)) {
readProcLink((format("/proc/%1%/exe") % ent->d_name).str(), paths);
@@ -393,14 +393,14 @@ void LocalStore::findRuntimeRoots(PathSet & roots)
throw SysError(format("opening %1%") % fdStr);
}
struct dirent * fd_ent;
- while (errno = 0, fd_ent = readdir(fdDir)) {
+ while (errno = 0, fd_ent = readdir(fdDir.get())) {
if (fd_ent->d_name[0] != '.') {
readProcLink((format("%1%/%2%") % fdStr % fd_ent->d_name).str(), paths);
}
}
if (errno)
throw SysError(format("iterating /proc/%1%/fd") % ent->d_name);
- fdDir.close();
+ fdDir.reset();
auto mapLines =
tokenizeString<std::vector<string>>(readFile((format("/proc/%1%/maps") % ent->d_name).str(), true), "\n");
@@ -651,13 +651,13 @@ void LocalStore::tryToDelete(GCState & state, const Path & path)
the link count. */
void LocalStore::removeUnusedLinks(const GCState & state)
{
- AutoCloseDir dir = opendir(linksDir.c_str());
+ AutoCloseDir dir(opendir(linksDir.c_str()));
if (!dir) throw SysError(format("opening directory ‘%1%’") % linksDir);
long long actualSize = 0, unsharedSize = 0;
struct dirent * dirent;
- while (errno = 0, dirent = readdir(dir)) {
+ while (errno = 0, dirent = readdir(dir.get())) {
checkInterrupt();
string name = dirent->d_name;
if (name == "." || name == "..") continue;
@@ -776,7 +776,7 @@ void LocalStore::collectGarbage(const GCOptions & options, GCResults & results)
try {
- AutoCloseDir dir = opendir(realStoreDir.c_str());
+ AutoCloseDir dir(opendir(realStoreDir.c_str()));
if (!dir) throw SysError(format("opening directory ‘%1%’") % realStoreDir);
/* Read the store and immediately delete all paths that
@@ -787,7 +787,7 @@ void LocalStore::collectGarbage(const GCOptions & options, GCResults & results)
can start faster. */
Paths entries;
struct dirent * dirent;
- while (errno = 0, dirent = readdir(dir)) {
+ while (errno = 0, dirent = readdir(dir.get())) {
checkInterrupt();
string name = dirent->d_name;
if (name == "." || name == "..") continue;
@@ -798,7 +798,7 @@ void LocalStore::collectGarbage(const GCOptions & options, GCResults & results)
tryToDelete(state, path);
}
- dir.close();
+ dir.reset();
/* Now delete the unreachable valid paths. Randomise the
order in which we delete entries to make the collector
diff --git a/src/libstore/optimise-store.cc b/src/libstore/optimise-store.cc
index 454c8b49d..b71c7e905 100644
--- a/src/libstore/optimise-store.cc
+++ b/src/libstore/optimise-store.cc
@@ -47,11 +47,11 @@ LocalStore::InodeHash LocalStore::loadInodeHash()
debug("loading hash inodes in memory");
InodeHash inodeHash;
- AutoCloseDir dir = opendir(linksDir.c_str());
+ AutoCloseDir dir(opendir(linksDir.c_str()));
if (!dir) throw SysError(format("opening directory ‘%1%’") % linksDir);
struct dirent * dirent;
- while (errno = 0, dirent = readdir(dir)) { /* sic */
+ while (errno = 0, dirent = readdir(dir.get())) { /* sic */
checkInterrupt();
// We don't care if we hit non-hash files, anything goes
inodeHash.insert(dirent->d_ino);
@@ -68,11 +68,11 @@ Strings LocalStore::readDirectoryIgnoringInodes(const Path & path, const InodeHa
{
Strings names;
- AutoCloseDir dir = opendir(path.c_str());
+ AutoCloseDir dir(opendir(path.c_str()));
if (!dir) throw SysError(format("opening directory ‘%1%’") % path);
struct dirent * dirent;
- while (errno = 0, dirent = readdir(dir)) { /* sic */
+ while (errno = 0, dirent = readdir(dir.get())) { /* sic */
checkInterrupt();
if (inodeHash.count(dirent->d_ino)) {
diff --git a/src/libutil/util.cc b/src/libutil/util.cc
index 0e1849df0..961c14e3a 100644
--- a/src/libutil/util.cc
+++ b/src/libutil/util.cc
@@ -234,11 +234,11 @@ DirEntries readDirectory(const Path & path)
DirEntries entries;
entries.reserve(64);
- AutoCloseDir dir = opendir(path.c_str());
+ AutoCloseDir dir(opendir(path.c_str()));
if (!dir) throw SysError(format("opening directory ‘%1%’") % path);
struct dirent * dirent;
- while (errno = 0, dirent = readdir(dir)) { /* sic */
+ while (errno = 0, dirent = readdir(dir.get())) { /* sic */
checkInterrupt();
string name = dirent->d_name;
if (name == "." || name == "..") continue;
@@ -645,48 +645,6 @@ void Pipe::create()
//////////////////////////////////////////////////////////////////////
-AutoCloseDir::AutoCloseDir()
-{
- dir = 0;
-}
-
-
-AutoCloseDir::AutoCloseDir(DIR * dir)
-{
- this->dir = dir;
-}
-
-
-AutoCloseDir::~AutoCloseDir()
-{
- close();
-}
-
-
-void AutoCloseDir::operator =(DIR * dir)
-{
- this->dir = dir;
-}
-
-
-AutoCloseDir::operator DIR *()
-{
- return dir;
-}
-
-
-void AutoCloseDir::close()
-{
- if (dir) {
- closedir(dir);
- dir = 0;
- }
-}
-
-
-//////////////////////////////////////////////////////////////////////
-
-
Pid::Pid()
: pid(-1), separatePG(false), killSignal(SIGKILL)
{
diff --git a/src/libutil/util.hh b/src/libutil/util.hh
index d42099781..679c3a1b6 100644
--- a/src/libutil/util.hh
+++ b/src/libutil/util.hh
@@ -180,18 +180,15 @@ public:
};
-class AutoCloseDir
+struct DIRDeleter
{
- DIR * dir;
-public:
- AutoCloseDir();
- AutoCloseDir(DIR * dir);
- ~AutoCloseDir();
- void operator =(DIR * dir);
- operator DIR *();
- void close();
+ void operator()(DIR * dir) const {
+ closedir(dir);
+ }
};
+typedef std::unique_ptr<DIR, DIRDeleter> AutoCloseDir;
+
class Pid
{