aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/cru/base/platform/unix/Timer.h42
-rw-r--r--src/base/CMakeLists.txt1
-rw-r--r--src/base/platform/unix/Timer.cpp5
3 files changed, 48 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
diff --git a/src/base/CMakeLists.txt b/src/base/CMakeLists.txt
index e0a16768..300898af 100644
--- a/src/base/CMakeLists.txt
+++ b/src/base/CMakeLists.txt
@@ -25,6 +25,7 @@ target_compile_definitions(CruBase PUBLIC $<$<CONFIG:Debug>:CRU_DEBUG>)
if (UNIX AND NOT EMSCRIPTEN)
target_sources(CruBase PRIVATE
platform/unix/PosixSpawnSubProcess.cpp
+ platform/unix/Timer.cpp
platform/unix/UnixFile.cpp
platform/unix/UnixFileStream.cpp
)
diff --git a/src/base/platform/unix/Timer.cpp b/src/base/platform/unix/Timer.cpp
new file mode 100644
index 00000000..25264dc8
--- /dev/null
+++ b/src/base/platform/unix/Timer.cpp
@@ -0,0 +1,5 @@
+#include "cru/base/platform/unix/Timer.h"
+
+namespace cru::platform::unix {
+int UnixTimerFile::GetReadFd() const { return this->read_fd_; }
+} // namespace cru::platform::unix