summaryrefslogtreecommitdiff
path: root/src/helpers
diff options
context:
space:
mode:
Diffstat (limited to 'src/helpers')
-rw-r--r--src/helpers/MiscFunctions.cpp44
-rw-r--r--src/helpers/MiscFunctions.hpp5
-rw-r--r--src/helpers/Monitor.cpp17
-rw-r--r--src/helpers/Monitor.hpp1
-rw-r--r--src/helpers/sync/SyncTimeline.cpp26
-rw-r--r--src/helpers/sync/SyncTimeline.hpp32
6 files changed, 59 insertions, 66 deletions
diff --git a/src/helpers/MiscFunctions.cpp b/src/helpers/MiscFunctions.cpp
index 5ebb0842..f532617c 100644
--- a/src/helpers/MiscFunctions.cpp
+++ b/src/helpers/MiscFunctions.cpp
@@ -836,50 +836,48 @@ bool envEnabled(const std::string& env) {
return std::string(ENV) == "1";
}
-std::pair<int, std::string> openExclusiveShm() {
+std::pair<CFileDescriptor, std::string> openExclusiveShm() {
// Only absolute paths can be shared across different shm_open() calls
std::string name = "/" + g_pTokenManager->getRandomUUID();
for (size_t i = 0; i < 69; ++i) {
- int fd = shm_open(name.c_str(), O_RDWR | O_CREAT | O_EXCL, 0600);
- if (fd >= 0)
- return {fd, name};
+ CFileDescriptor fd{shm_open(name.c_str(), O_RDWR | O_CREAT | O_EXCL, 0600)};
+ if (fd.isValid())
+ return {std::move(fd), name};
}
- return {-1, ""};
+ return {{}, ""};
}
-int allocateSHMFile(size_t len) {
+CFileDescriptor allocateSHMFile(size_t len) {
auto [fd, name] = openExclusiveShm();
- if (fd < 0)
- return -1;
+ if (!fd.isValid())
+ return {};
shm_unlink(name.c_str());
int ret;
do {
- ret = ftruncate(fd, len);
+ ret = ftruncate(fd.get(), len);
} while (ret < 0 && errno == EINTR);
if (ret < 0) {
- close(fd);
- return -1;
+ return {};
}
- return fd;
+ return std::move(fd);
}
-bool allocateSHMFilePair(size_t size, int* rw_fd_ptr, int* ro_fd_ptr) {
+bool allocateSHMFilePair(size_t size, CFileDescriptor& rw_fd_ptr, CFileDescriptor& ro_fd_ptr) {
auto [fd, name] = openExclusiveShm();
- if (fd < 0) {
+ if (!fd.isValid()) {
return false;
}
// CLOEXEC is guaranteed to be set by shm_open
- int ro_fd = shm_open(name.c_str(), O_RDONLY, 0);
- if (ro_fd < 0) {
+ CFileDescriptor ro_fd{shm_open(name.c_str(), O_RDONLY, 0)};
+ if (!ro_fd.isValid()) {
shm_unlink(name.c_str());
- close(fd);
return false;
}
@@ -887,24 +885,20 @@ bool allocateSHMFilePair(size_t size, int* rw_fd_ptr, int* ro_fd_ptr) {
// Make sure the file cannot be re-opened in read-write mode (e.g. via
// "/proc/self/fd/" on Linux)
- if (fchmod(fd, 0) != 0) {
- close(fd);
- close(ro_fd);
+ if (fchmod(fd.get(), 0) != 0) {
return false;
}
int ret;
do {
- ret = ftruncate(fd, size);
+ ret = ftruncate(fd.get(), size);
} while (ret < 0 && errno == EINTR);
if (ret < 0) {
- close(fd);
- close(ro_fd);
return false;
}
- *rw_fd_ptr = fd;
- *ro_fd_ptr = ro_fd;
+ rw_fd_ptr = std::move(fd);
+ ro_fd_ptr = std::move(ro_fd);
return true;
}
diff --git a/src/helpers/MiscFunctions.hpp b/src/helpers/MiscFunctions.hpp
index d0824284..bd288638 100644
--- a/src/helpers/MiscFunctions.hpp
+++ b/src/helpers/MiscFunctions.hpp
@@ -5,6 +5,7 @@
#include <vector>
#include <format>
#include <expected>
+#include <hyprutils/os/FileDescriptor.hpp>
#include "../SharedDefs.hpp"
#include "../macros.hpp"
@@ -35,8 +36,8 @@ double normalizeAngleRad(double ang);
std::vector<SCallstackFrameInfo> getBacktrace();
void throwError(const std::string& err);
bool envEnabled(const std::string& env);
-int allocateSHMFile(size_t len);
-bool allocateSHMFilePair(size_t size, int* rw_fd_ptr, int* ro_fd_ptr);
+Hyprutils::OS::CFileDescriptor allocateSHMFile(size_t len);
+bool allocateSHMFilePair(size_t size, Hyprutils::OS::CFileDescriptor& rw_fd_ptr, Hyprutils::OS::CFileDescriptor& ro_fd_ptr);
float stringToPercentage(const std::string& VALUE, const float REL);
template <typename... Args>
diff --git a/src/helpers/Monitor.cpp b/src/helpers/Monitor.cpp
index 42acf485..fc3de3aa 100644
--- a/src/helpers/Monitor.cpp
+++ b/src/helpers/Monitor.cpp
@@ -32,6 +32,7 @@
#include <ranges>
using namespace Hyprutils::String;
using namespace Hyprutils::Utils;
+using namespace Hyprutils::OS;
static int ratHandler(void* data) {
g_pHyprRenderer->renderMonitor(((CMonitor*)data)->self.lock());
@@ -1301,19 +1302,15 @@ bool CMonitor::attemptDirectScanout() {
// wait for the explicit fence if present, and if kms explicit is allowed
bool DOEXPLICIT = PSURFACE->syncobj && PSURFACE->syncobj->current.acquireTimeline && PSURFACE->syncobj->current.acquireTimeline->timeline && explicitOptions.explicitKMSEnabled;
- int explicitWaitFD = -1;
+ CFileDescriptor explicitWaitFD;
if (DOEXPLICIT) {
explicitWaitFD = PSURFACE->syncobj->current.acquireTimeline->timeline->exportAsSyncFileFD(PSURFACE->syncobj->current.acquirePoint);
- if (explicitWaitFD < 0)
+ if (!explicitWaitFD.isValid())
Debug::log(TRACE, "attemptDirectScanout: failed to acquire an explicit wait fd");
}
- DOEXPLICIT = DOEXPLICIT && explicitWaitFD >= 0;
+ DOEXPLICIT = DOEXPLICIT && explicitWaitFD.isValid();
- auto cleanup = CScopeGuard([explicitWaitFD, this]() {
- output->state->resetExplicitFences();
- if (explicitWaitFD >= 0)
- close(explicitWaitFD);
- });
+ auto cleanup = CScopeGuard([this]() { output->state->resetExplicitFences(); });
timespec now;
clock_gettime(CLOCK_MONOTONIC, &now);
@@ -1323,8 +1320,8 @@ bool CMonitor::attemptDirectScanout() {
output->state->resetExplicitFences();
if (DOEXPLICIT) {
- Debug::log(TRACE, "attemptDirectScanout: setting IN_FENCE for aq to {}", explicitWaitFD);
- output->state->setExplicitInFence(explicitWaitFD);
+ Debug::log(TRACE, "attemptDirectScanout: setting IN_FENCE for aq to {}", explicitWaitFD.get());
+ output->state->setExplicitInFence(explicitWaitFD.get());
}
bool ok = output->commit();
diff --git a/src/helpers/Monitor.hpp b/src/helpers/Monitor.hpp
index 2b02c30a..c67bccc5 100644
--- a/src/helpers/Monitor.hpp
+++ b/src/helpers/Monitor.hpp
@@ -16,6 +16,7 @@
#include "DamageRing.hpp"
#include <aquamarine/output/Output.hpp>
#include <aquamarine/allocator/Swapchain.hpp>
+#include <hyprutils/os/FileDescriptor.hpp>
// Enum for the different types of auto directions, e.g. auto-left, auto-up.
enum eAutoDirs : uint8_t {
diff --git a/src/helpers/sync/SyncTimeline.cpp b/src/helpers/sync/SyncTimeline.cpp
index 16b5bd92..46b617bc 100644
--- a/src/helpers/sync/SyncTimeline.cpp
+++ b/src/helpers/sync/SyncTimeline.cpp
@@ -4,6 +4,7 @@
#include <xf86drm.h>
#include <sys/eventfd.h>
+using namespace Hyprutils::OS;
SP<CSyncTimeline> CSyncTimeline::create(int drmFD_) {
auto timeline = SP<CSyncTimeline>(new CSyncTimeline);
@@ -85,10 +86,9 @@ bool CSyncTimeline::addWaiter(const std::function<void()>& waiter, uint64_t poin
auto w = makeShared<SWaiter>();
w->fn = waiter;
w->timeline = self;
+ w->eventFd = CFileDescriptor{eventfd(0, EFD_CLOEXEC)};
- int eventFD = eventfd(0, EFD_CLOEXEC);
-
- if (eventFD < 0) {
+ if (!w->eventFd.isValid()) {
Debug::log(ERR, "CSyncTimeline::addWaiter: failed to acquire an eventfd");
return false;
}
@@ -97,19 +97,17 @@ bool CSyncTimeline::addWaiter(const std::function<void()>& waiter, uint64_t poin
.handle = handle,
.flags = flags,
.point = point,
- .fd = eventFD,
+ .fd = w->eventFd.get(),
};
if (drmIoctl(drmFD, DRM_IOCTL_SYNCOBJ_EVENTFD, &syncobjEventFD) != 0) {
Debug::log(ERR, "CSyncTimeline::addWaiter: drmIoctl failed");
- close(eventFD);
return false;
}
- w->source = wl_event_loop_add_fd(g_pEventLoopManager->m_sWayland.loop, eventFD, WL_EVENT_READABLE, ::handleWaiterFD, w.get());
+ w->source = wl_event_loop_add_fd(g_pEventLoopManager->m_sWayland.loop, w->eventFd.get(), WL_EVENT_READABLE, ::handleWaiterFD, w.get());
if (!w->source) {
Debug::log(ERR, "CSyncTimeline::addWaiter: wl_event_loop_add_fd failed");
- close(eventFD);
return false;
}
@@ -126,32 +124,32 @@ void CSyncTimeline::removeWaiter(SWaiter* w) {
std::erase_if(waiters, [w](const auto& e) { return e.get() == w; });
}
-int CSyncTimeline::exportAsSyncFileFD(uint64_t src) {
+CFileDescriptor CSyncTimeline::exportAsSyncFileFD(uint64_t src) {
int sync = -1;
uint32_t syncHandle = 0;
if (drmSyncobjCreate(drmFD, 0, &syncHandle)) {
Debug::log(ERR, "exportAsSyncFileFD: drmSyncobjCreate failed");
- return -1;
+ return {};
}
if (drmSyncobjTransfer(drmFD, syncHandle, 0, handle, src, 0)) {
Debug::log(ERR, "exportAsSyncFileFD: drmSyncobjTransfer failed");
drmSyncobjDestroy(drmFD, syncHandle);
- return -1;
+ return {};
}
if (drmSyncobjExportSyncFile(drmFD, syncHandle, &sync)) {
Debug::log(ERR, "exportAsSyncFileFD: drmSyncobjExportSyncFile failed");
drmSyncobjDestroy(drmFD, syncHandle);
- return -1;
+ return {};
}
drmSyncobjDestroy(drmFD, syncHandle);
- return sync;
+ return CFileDescriptor{sync};
}
-bool CSyncTimeline::importFromSyncFileFD(uint64_t dst, int fd) {
+bool CSyncTimeline::importFromSyncFileFD(uint64_t dst, CFileDescriptor& fd) {
uint32_t syncHandle = 0;
if (drmSyncobjCreate(drmFD, 0, &syncHandle)) {
@@ -159,7 +157,7 @@ bool CSyncTimeline::importFromSyncFileFD(uint64_t dst, int fd) {
return false;
}
- if (drmSyncobjImportSyncFile(drmFD, syncHandle, fd)) {
+ if (drmSyncobjImportSyncFile(drmFD, syncHandle, fd.get())) {
Debug::log(ERR, "importFromSyncFileFD: drmSyncobjImportSyncFile failed");
drmSyncobjDestroy(drmFD, syncHandle);
return false;
diff --git a/src/helpers/sync/SyncTimeline.hpp b/src/helpers/sync/SyncTimeline.hpp
index 88ad4921..ba65e004 100644
--- a/src/helpers/sync/SyncTimeline.hpp
+++ b/src/helpers/sync/SyncTimeline.hpp
@@ -4,6 +4,7 @@
#include <optional>
#include <vector>
#include <functional>
+#include <hyprutils/os/FileDescriptor.hpp>
#include "../memory/Memory.hpp"
/*
@@ -20,26 +21,27 @@ class CSyncTimeline {
~CSyncTimeline();
struct SWaiter {
- std::function<void()> fn;
- wl_event_source* source = nullptr;
- WP<CSyncTimeline> timeline;
+ std::function<void()> fn;
+ wl_event_source* source = nullptr;
+ WP<CSyncTimeline> timeline;
+ Hyprutils::OS::CFileDescriptor eventFd;
};
// check if the timeline point has been signaled
// flags: DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT or DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE
// std::nullopt on fail
- std::optional<bool> check(uint64_t point, uint32_t flags);
-
- bool addWaiter(const std::function<void()>& waiter, uint64_t point, uint32_t flags);
- void removeWaiter(SWaiter*);
- int exportAsSyncFileFD(uint64_t src);
- bool importFromSyncFileFD(uint64_t dst, int fd);
- bool transfer(SP<CSyncTimeline> from, uint64_t fromPoint, uint64_t toPoint);
- void signal(uint64_t point);
-
- int drmFD = -1;
- uint32_t handle = 0;
- WP<CSyncTimeline> self;
+ std::optional<bool> check(uint64_t point, uint32_t flags);
+
+ bool addWaiter(const std::function<void()>& waiter, uint64_t point, uint32_t flags);
+ void removeWaiter(SWaiter*);
+ Hyprutils::OS::CFileDescriptor exportAsSyncFileFD(uint64_t src);
+ bool importFromSyncFileFD(uint64_t dst, Hyprutils::OS::CFileDescriptor& fd);
+ bool transfer(SP<CSyncTimeline> from, uint64_t fromPoint, uint64_t toPoint);
+ void signal(uint64_t point);
+
+ int drmFD = -1;
+ uint32_t handle = 0;
+ WP<CSyncTimeline> self;
private:
CSyncTimeline() = default;