AutoCloseDir: Use std::unique_ptr
This commit is contained in:
		
							parent
							
								
									2b9d0a99cb
								
							
						
					
					
						commit
						8079ab87a2
					
				
					 4 changed files with 20 additions and 65 deletions
				
			
		|  | @ -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 | ||||
|  |  | |||
|  | @ -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)) { | ||||
|  |  | |||
|  | @ -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; | ||||
|  | @ -642,48 +642,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; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| //////////////////////////////////////////////////////////////////////
 | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -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 | ||||
| { | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue