mirror of
https://github.com/kunkundi/crossdesk.git
synced 2026-10-16 00:33:22 +08:00
48 lines
1.1 KiB
C++
48 lines
1.1 KiB
C++
#include "runtime/session_lifecycle.h"
|
|
|
|
namespace crossdesk::gui_detail {
|
|
|
|
CallbackGuard::CallbackGuard(SessionCallbackGate& callbacks)
|
|
: callbacks_(callbacks), accepted_(callbacks.BeginCallback()) {}
|
|
|
|
CallbackGuard::~CallbackGuard() {
|
|
if (accepted_) {
|
|
callbacks_.EndCallback();
|
|
}
|
|
}
|
|
|
|
bool SessionCallbackGate::IsActive() const {
|
|
std::lock_guard lock(mutex_);
|
|
return accepting_callbacks_;
|
|
}
|
|
|
|
CallbackGuard SessionCallbackGate::Enter() {
|
|
return CallbackGuard(*this);
|
|
}
|
|
|
|
bool SessionCallbackGate::BeginCallback() {
|
|
std::lock_guard lock(mutex_);
|
|
if (!accepting_callbacks_) {
|
|
return false;
|
|
}
|
|
++running_callbacks_;
|
|
return true;
|
|
}
|
|
|
|
void SessionCallbackGate::EndCallback() {
|
|
std::lock_guard lock(mutex_);
|
|
--running_callbacks_;
|
|
if (running_callbacks_ == 0) {
|
|
callbacks_finished_.notify_all();
|
|
}
|
|
}
|
|
|
|
void SessionCallbackGate::Close() {
|
|
std::unique_lock lock(mutex_);
|
|
accepting_callbacks_ = false;
|
|
// Waiting releases the lock so running callbacks can call EndCallback().
|
|
callbacks_finished_.wait(lock, [this] { return running_callbacks_ == 0; });
|
|
}
|
|
|
|
} // namespace crossdesk::gui_detail
|