Index: utils.h |
diff --git a/utils.h b/utils.h |
index 57fb3bb36adc735f32cbccc0615f14b065bcf3e3..208abe8d48c2a2e976b5b9173b9e935d5baeca64 100644 |
--- a/utils.h |
+++ b/utils.h |
@@ -237,12 +237,17 @@ bool SetProcessPriority(ProcessPriority priority); |
class ScopedFilesystemUnmounter { |
public: |
explicit ScopedFilesystemUnmounter(const std::string& mountpoint) |
- : mountpoint_(mountpoint) {} |
+ : mountpoint_(mountpoint), |
+ should_unmount_(true) {} |
~ScopedFilesystemUnmounter() { |
- utils::UnmountFilesystem(mountpoint_); |
+ if (should_unmount_) { |
+ utils::UnmountFilesystem(mountpoint_); |
+ } |
} |
+ void set_should_unmount(bool unmount) { should_unmount_ = unmount; } |
private: |
const std::string mountpoint_; |
+ bool should_unmount_; |
DISALLOW_COPY_AND_ASSIGN(ScopedFilesystemUnmounter); |
}; |
@@ -250,15 +255,13 @@ class ScopedFilesystemUnmounter { |
class ScopedFdCloser { |
public: |
explicit ScopedFdCloser(int* fd) : fd_(fd), should_close_(true) {} |
- void set_should_close(bool should_close) { should_close_ = should_close; } |
~ScopedFdCloser() { |
- if (!should_close_) |
- return; |
- if (fd_ && (*fd_ >= 0)) { |
+ if (should_close_ && fd_ && (*fd_ >= 0)) { |
close(*fd_); |
*fd_ = -1; |
} |
} |
+ void set_should_close(bool should_close) { should_close_ = should_close; } |
private: |
int* fd_; |
bool should_close_; |
@@ -283,16 +286,37 @@ class ScopedPathUnlinker { |
// Utility class to delete an empty directory when it goes out of scope. |
class ScopedDirRemover { |
public: |
- explicit ScopedDirRemover(const std::string& path) : path_(path) {} |
+ explicit ScopedDirRemover(const std::string& path) |
+ : path_(path), |
+ should_remove_(true) {} |
~ScopedDirRemover() { |
- if (rmdir(path_.c_str()) < 0) |
+ if (should_remove_ && (rmdir(path_.c_str()) < 0)) { |
PLOG(ERROR) << "Unable to remove dir " << path_; |
+ } |
} |
- private: |
+ void set_should_remove(bool should_remove) { should_remove_ = should_remove; } |
+ |
+ protected: |
const std::string path_; |
+ |
+ private: |
+ bool should_remove_; |
DISALLOW_COPY_AND_ASSIGN(ScopedDirRemover); |
}; |
+// Utility class to unmount a filesystem mounted on a temporary directory and |
+// delete the temporary directory when it goes out of scope. |
+class ScopedTempUnmounter : public ScopedDirRemover { |
+ public: |
+ explicit ScopedTempUnmounter(const std::string& path) : |
+ ScopedDirRemover(path) {} |
+ ~ScopedTempUnmounter() { |
+ utils::UnmountFilesystem(path_); |
+ } |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(ScopedTempUnmounter); |
+}; |
+ |
// A little object to call ActionComplete on the ActionProcessor when |
// it's destructed. |
class ScopedActionCompleter { |