aboutsummaryrefslogtreecommitdiff
path: root/include/cru/base/platform/unix
diff options
context:
space:
mode:
Diffstat (limited to 'include/cru/base/platform/unix')
-rw-r--r--include/cru/base/platform/unix/Timer.h42
1 files changed, 42 insertions, 0 deletions
diff --git a/include/cru/base/platform/unix/Timer.h b/include/cru/base/platform/unix/Timer.h
new file mode 100644
index 00000000..e2cbff7d
--- /dev/null
+++ b/include/cru/base/platform/unix/Timer.h
@@ -0,0 +1,42 @@
+#pragma once
+
+#if !defined(__unix) && !defined(__APPLE__)
+#error "This file can only be included on unix."
+#endif
+
+#include "../../Base.h"
+#include "../../Exception.h"
+#include "UnixFile.h"
+
+#include <chrono>
+#include <thread>
+
+namespace cru::platform::unix {
+class UnixTimerFile : public Object2 {
+ public:
+ template <class Rep, class Period>
+ explicit UnixTimerFile(std::chrono::duration<Rep, Period> time) {
+ auto fds = OpenUniDirectionalPipe();
+ this->read_fd_ = std::move(fds.read);
+ this->write_fd_ = std::move(fds.write);
+
+ this->thread_ = std::thread([this, &time] {
+ std::this_thread::sleep_for(time);
+ constexpr auto buffer = "";
+ auto written = ::write(this->write_fd_, buffer, 1);
+ if (written != 1) {
+ throw Exception(
+ "Failed to write to pipe in UnixTimerFile thread at timeout.");
+ }
+ });
+ this->thread_.detach();
+ }
+
+ int GetReadFd() const;
+
+ private:
+ UnixFileDescriptor write_fd_;
+ UnixFileDescriptor read_fd_;
+ std::thread thread_;
+};
+} // namespace cru::platform::unix