2
0
Fork 0
mirror of https://github.com/yuzu-mirror/yuzu synced 2024-12-26 20:43:05 +00:00
yuzu/src/common/thread.h
Lioncash 394095438a common/thread: Remove unused functions
Many of these functions are carried over from Dolphin (where they aren't
used anymore). Given these have no use (and we really shouldn't be
screwing around with OS-specific thread scheduler handling from the
emulator, these can be removed.

The function for setting the thread name is left, however, since it can
have debugging utility usages.
2019-03-29 13:26:21 -04:00

82 lines
2.1 KiB
C++

// Copyright 2013 Dolphin Emulator Project / 2014 Citra Emulator Project
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
#pragma once
#include <chrono>
#include <condition_variable>
#include <cstddef>
#include <mutex>
#include <thread>
namespace Common {
class Event {
public:
void Set() {
std::lock_guard<std::mutex> lk(mutex);
if (!is_set) {
is_set = true;
condvar.notify_one();
}
}
void Wait() {
std::unique_lock<std::mutex> lk(mutex);
condvar.wait(lk, [&] { return is_set; });
is_set = false;
}
template <class Clock, class Duration>
bool WaitUntil(const std::chrono::time_point<Clock, Duration>& time) {
std::unique_lock<std::mutex> lk(mutex);
if (!condvar.wait_until(lk, time, [this] { return is_set; }))
return false;
is_set = false;
return true;
}
void Reset() {
std::unique_lock<std::mutex> lk(mutex);
// no other action required, since wait loops on the predicate and any lingering signal will
// get cleared on the first iteration
is_set = false;
}
private:
bool is_set = false;
std::condition_variable condvar;
std::mutex mutex;
};
class Barrier {
public:
explicit Barrier(std::size_t count_) : count(count_) {}
/// Blocks until all "count" threads have called Sync()
void Sync() {
std::unique_lock<std::mutex> lk(mutex);
const std::size_t current_generation = generation;
if (++waiting == count) {
generation++;
waiting = 0;
condvar.notify_all();
} else {
condvar.wait(lk,
[this, current_generation] { return current_generation != generation; });
}
}
private:
std::condition_variable condvar;
std::mutex mutex;
std::size_t count;
std::size_t waiting = 0;
std::size_t generation = 0; // Incremented once each time the barrier is used
};
void SetCurrentThreadName(const char* name);
} // namespace Common