summaryrefslogtreecommitdiffstats
path: root/src/core/hle/kernel/hle_ipc.cpp
diff options
context:
space:
mode:
authorbunnei <bunneidev@gmail.com>2018-03-19 01:22:46 +0100
committerbunnei <bunneidev@gmail.com>2018-03-19 01:56:34 +0100
commitc86af6939c9777d78fbc48b81eb090553762d3d4 (patch)
tree957898b7a38e667490df2bbe5efff5259a48168a /src/core/hle/kernel/hle_ipc.cpp
parenthle_ipc: Use shared_ptr instead of unique_ptr to allow copies. (diff)
downloadyuzu-c86af6939c9777d78fbc48b81eb090553762d3d4.tar
yuzu-c86af6939c9777d78fbc48b81eb090553762d3d4.tar.gz
yuzu-c86af6939c9777d78fbc48b81eb090553762d3d4.tar.bz2
yuzu-c86af6939c9777d78fbc48b81eb090553762d3d4.tar.lz
yuzu-c86af6939c9777d78fbc48b81eb090553762d3d4.tar.xz
yuzu-c86af6939c9777d78fbc48b81eb090553762d3d4.tar.zst
yuzu-c86af6939c9777d78fbc48b81eb090553762d3d4.zip
Diffstat (limited to 'src/core/hle/kernel/hle_ipc.cpp')
-rw-r--r--src/core/hle/kernel/hle_ipc.cpp27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/core/hle/kernel/hle_ipc.cpp b/src/core/hle/kernel/hle_ipc.cpp
index aae14f09e..293756790 100644
--- a/src/core/hle/kernel/hle_ipc.cpp
+++ b/src/core/hle/kernel/hle_ipc.cpp
@@ -7,6 +7,7 @@
#include "common/common_funcs.h"
#include "common/common_types.h"
#include "core/hle/ipc_helpers.h"
+#include "core/hle/kernel/event.h"
#include "core/hle/kernel/handle_table.h"
#include "core/hle/kernel/hle_ipc.h"
#include "core/hle/kernel/kernel.h"
@@ -26,6 +27,32 @@ void SessionRequestHandler::ClientDisconnected(SharedPtr<ServerSession> server_s
boost::range::remove_erase(connected_sessions, server_session);
}
+SharedPtr<Event> HLERequestContext::SleepClientThread(SharedPtr<Thread> thread,
+ const std::string& reason, u64 timeout,
+ WakeupCallback&& callback) {
+
+ // Put the client thread to sleep until the wait event is signaled or the timeout expires.
+ thread->wakeup_callback =
+ [context = *this, callback](ThreadWakeupReason reason, SharedPtr<Thread> thread,
+ SharedPtr<WaitObject> object, size_t index) mutable -> bool {
+ ASSERT(thread->status == THREADSTATUS_WAIT_HLE_EVENT);
+ callback(thread, context, reason);
+ context.WriteToOutgoingCommandBuffer(*thread);
+ return true;
+ };
+
+ auto event = Kernel::Event::Create(Kernel::ResetType::OneShot, "HLE Pause Event: " + reason);
+ thread->status = THREADSTATUS_WAIT_HLE_EVENT;
+ thread->wait_objects = {event};
+ event->AddWaitingThread(thread);
+
+ if (timeout > 0) {
+ thread->WakeAfterDelay(timeout);
+ }
+
+ return event;
+}
+
HLERequestContext::HLERequestContext(SharedPtr<Kernel::ServerSession> server_session)
: server_session(std::move(server_session)) {
cmd_buf[0] = 0;