aboutsummaryrefslogtreecommitdiff
path: root/src/libutil/util.hh
diff options
context:
space:
mode:
Diffstat (limited to 'src/libutil/util.hh')
-rw-r--r--src/libutil/util.hh64
1 files changed, 32 insertions, 32 deletions
diff --git a/src/libutil/util.hh b/src/libutil/util.hh
index 2e48034ae..b68d48582 100644
--- a/src/libutil/util.hh
+++ b/src/libutil/util.hh
@@ -139,18 +139,6 @@ string drainFD(int fd);
/* Automatic cleanup of resources. */
-template <class T>
-struct AutoDeleteArray
-{
- T * p;
- AutoDeleteArray(T * p) : p(p) { }
- ~AutoDeleteArray()
- {
- delete [] p;
- }
-};
-
-
class AutoDelete
{
Path path;
@@ -192,32 +180,30 @@ 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
{
- pid_t pid;
- bool separatePG;
- int killSignal;
+ pid_t pid = -1;
+ bool separatePG = false;
+ int killSignal = SIGKILL;
public:
Pid();
Pid(pid_t pid);
~Pid();
void operator =(pid_t pid);
operator pid_t();
- void kill(bool quiet = false);
- int wait(bool block);
+ int kill(bool quiet = false);
+ int wait();
+
void setSeparatePG(bool separatePG);
void setKillSignal(int signal);
pid_t release();
@@ -233,11 +219,10 @@ void killUser(uid_t uid);
pid to the caller. */
struct ProcessOptions
{
- string errorPrefix;
- bool dieWithParent;
- bool runExitHandlers;
- bool allowVfork;
- ProcessOptions() : errorPrefix("error: "), dieWithParent(true), runExitHandlers(false), allowVfork(true) { };
+ string errorPrefix = "error: ";
+ bool dieWithParent = true;
+ bool runExitHandlers = false;
+ bool allowVfork = true;
};
pid_t startProcess(std::function<void()> fun, const ProcessOptions & options = ProcessOptions());
@@ -278,7 +263,7 @@ void restoreSIGPIPE();
/* User interruption. */
-extern volatile sig_atomic_t _isInterrupted;
+extern bool _isInterrupted;
extern thread_local bool interruptThrown;
@@ -434,4 +419,19 @@ void callSuccess(
}
+/* Start a thread that handles various signals. Also block those signals
+ on the current thread (and thus any threads created by it). */
+void startSignalHandlerThread();
+
+struct InterruptCallback
+{
+ virtual ~InterruptCallback() { };
+};
+
+/* Register a function that gets called on SIGINT (in a non-signal
+ context). */
+std::unique_ptr<InterruptCallback> createInterruptCallback(
+ std::function<void()> callback);
+
+
}