core: Fix unlock sync (#119)

* core: error on repeated unlock

* core: change termination points

This seems to fix sporadic freezes when unlocking.
This commit is contained in:
Maximilian Seidler 2024-03-02 15:21:41 +01:00 committed by GitHub
parent fa2a875e33
commit 4286cfb29c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -322,12 +322,9 @@ void CHyprlock::run() {
}; };
std::thread pollThr([this, &pollfds]() { std::thread pollThr([this, &pollfds]() {
while (1) { while (!m_bTerminate) {
int ret = poll(pollfds, 1, 5000 /* 5 seconds, reasonable. It's because we might need to terminate */); int ret = poll(pollfds, 1, 5000 /* 5 seconds, reasonable. It's because we might need to terminate */);
if (m_bTerminate)
break;
if (ret < 0) { if (ret < 0) {
Debug::log(CRIT, "[core] Polling fds failed with {}", errno); Debug::log(CRIT, "[core] Polling fds failed with {}", errno);
m_bTerminate = true; m_bTerminate = true;
@ -352,7 +349,7 @@ void CHyprlock::run() {
}); });
std::thread timersThr([this]() { std::thread timersThr([this]() {
while (1) { while (!m_bTerminate) {
// calc nearest thing // calc nearest thing
m_sLoopState.timersMutex.lock(); m_sLoopState.timersMutex.lock();
@ -369,9 +366,6 @@ void CHyprlock::run() {
m_sLoopState.timerCV.wait_for(lk, std::chrono::milliseconds((int)least + 1), [this] { return m_sLoopState.timerEvent; }); m_sLoopState.timerCV.wait_for(lk, std::chrono::milliseconds((int)least + 1), [this] { return m_sLoopState.timerEvent; });
m_sLoopState.timerEvent = false; m_sLoopState.timerEvent = false;
if (m_bTerminate)
break;
// notify main // notify main
std::lock_guard<std::mutex> lg2(m_sLoopState.eventLoopMutex); std::lock_guard<std::mutex> lg2(m_sLoopState.eventLoopMutex);
Debug::log(TRACE, "timer thread firing"); Debug::log(TRACE, "timer thread firing");
@ -410,7 +404,7 @@ void CHyprlock::run() {
do { do {
ret = wl_display_dispatch_pending(m_sWaylandState.display); ret = wl_display_dispatch_pending(m_sWaylandState.display);
wl_display_flush(m_sWaylandState.display); wl_display_flush(m_sWaylandState.display);
} while (ret > 0); } while (ret > 0 && !m_bTerminate);
// do timers // do timers
m_sLoopState.timersMutex.lock(); m_sLoopState.timersMutex.lock();
@ -717,6 +711,11 @@ void CHyprlock::lockSession() {
void CHyprlock::unlockSession() { void CHyprlock::unlockSession() {
Debug::log(LOG, "Unlocking session"); Debug::log(LOG, "Unlocking session");
if (m_bTerminate && !m_sLockState.lock) {
Debug::log(ERR, "Unlock already happend?");
return;
}
ext_session_lock_v1_unlock_and_destroy(m_sLockState.lock); ext_session_lock_v1_unlock_and_destroy(m_sLockState.lock);
m_sLockState.lock = nullptr; m_sLockState.lock = nullptr;