2017-05-29 15:45:30 -07:00
|
|
|
// Copyright 2014 Citra Emulator Project
|
|
|
|
// Licensed under GPLv2 or any later version
|
|
|
|
// Refer to the license.txt file included.
|
|
|
|
|
|
|
|
#include <algorithm>
|
|
|
|
#include "common/assert.h"
|
2018-12-31 15:09:41 -08:00
|
|
|
#include "common/common_types.h"
|
2017-05-29 15:45:30 -07:00
|
|
|
#include "common/logging/log.h"
|
2019-03-29 14:13:00 -07:00
|
|
|
#include "core/core.h"
|
2019-09-11 09:47:37 -07:00
|
|
|
#include "core/hle/kernel/kernel.h"
|
2018-08-01 19:40:00 -07:00
|
|
|
#include "core/hle/kernel/object.h"
|
2017-05-29 15:45:30 -07:00
|
|
|
#include "core/hle/kernel/process.h"
|
2020-02-11 13:36:39 -08:00
|
|
|
#include "core/hle/kernel/synchronization.h"
|
2020-02-11 06:46:25 -08:00
|
|
|
#include "core/hle/kernel/synchronization_object.h"
|
2017-05-29 15:45:30 -07:00
|
|
|
#include "core/hle/kernel/thread.h"
|
|
|
|
|
|
|
|
namespace Kernel {
|
|
|
|
|
2020-02-11 06:46:25 -08:00
|
|
|
SynchronizationObject::SynchronizationObject(KernelCore& kernel) : Object{kernel} {}
|
|
|
|
SynchronizationObject::~SynchronizationObject() = default;
|
2018-08-28 09:30:33 -07:00
|
|
|
|
2020-02-11 13:36:39 -08:00
|
|
|
void SynchronizationObject::Signal() {
|
|
|
|
kernel.Synchronization().SignalObject(*this);
|
|
|
|
}
|
|
|
|
|
2020-02-11 06:46:25 -08:00
|
|
|
void SynchronizationObject::AddWaitingThread(std::shared_ptr<Thread> thread) {
|
2017-05-29 15:45:30 -07:00
|
|
|
auto itr = std::find(waiting_threads.begin(), waiting_threads.end(), thread);
|
|
|
|
if (itr == waiting_threads.end())
|
|
|
|
waiting_threads.push_back(std::move(thread));
|
|
|
|
}
|
|
|
|
|
2020-02-11 06:46:25 -08:00
|
|
|
void SynchronizationObject::RemoveWaitingThread(std::shared_ptr<Thread> thread) {
|
2017-05-29 15:45:30 -07:00
|
|
|
auto itr = std::find(waiting_threads.begin(), waiting_threads.end(), thread);
|
|
|
|
// If a thread passed multiple handles to the same object,
|
|
|
|
// the kernel might attempt to remove the thread from the object's
|
|
|
|
// waiting threads list multiple times.
|
|
|
|
if (itr != waiting_threads.end())
|
|
|
|
waiting_threads.erase(itr);
|
|
|
|
}
|
|
|
|
|
2020-02-26 18:26:53 -08:00
|
|
|
void SynchronizationObject::ClearWaitingThreads() {
|
|
|
|
waiting_threads.clear();
|
|
|
|
}
|
|
|
|
|
2020-02-11 06:46:25 -08:00
|
|
|
const std::vector<std::shared_ptr<Thread>>& SynchronizationObject::GetWaitingThreads() const {
|
2017-05-29 15:45:30 -07:00
|
|
|
return waiting_threads;
|
|
|
|
}
|
|
|
|
|
|
|
|
} // namespace Kernel
|