From 5e59a8e38c9f8992e6ffd9dbbde11e1f873780e1 Mon Sep 17 00:00:00 2001 From: Yuqian Yang Date: Wed, 3 Sep 2025 12:30:46 +0800 Subject: Add unix timer file. Not tested. --- include/cru/base/platform/unix/Timer.h | 42 ++++++++++++++++++++++++++++++++++ src/base/CMakeLists.txt | 1 + src/base/platform/unix/Timer.cpp | 5 ++++ 3 files changed, 48 insertions(+) create mode 100644 include/cru/base/platform/unix/Timer.h create mode 100644 src/base/platform/unix/Timer.cpp 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 +#include + +namespace cru::platform::unix { +class UnixTimerFile : public Object2 { + public: + template + explicit UnixTimerFile(std::chrono::duration 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 $<$: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 -- cgit v1.2.3