summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Subv2016-05-22 11:22:49 -0500
committerGravatar Subv2016-06-05 09:35:31 -0500
commit3d9fbffbabbe2125ae6208d2d0049552e9293e49 (patch)
tree3a3d81d602b210bbf38323dd4898ff5225bf8754 /src
parentMerge pull request #1863 from mailwl/gpu-threadid-reset (diff)
downloadyuzu-3d9fbffbabbe2125ae6208d2d0049552e9293e49.tar.gz
yuzu-3d9fbffbabbe2125ae6208d2d0049552e9293e49.tar.xz
yuzu-3d9fbffbabbe2125ae6208d2d0049552e9293e49.zip
Kernel: Added ClientPort and ServerPort classes.
This is part of an ongoing effort to implement support for multiple processes.
Diffstat (limited to 'src')
-rw-r--r--src/core/CMakeLists.txt4
-rw-r--r--src/core/hle/kernel/client_port.cpp16
-rw-r--r--src/core/hle/kernel/client_port.h34
-rw-r--r--src/core/hle/kernel/kernel.h6
-rw-r--r--src/core/hle/kernel/server_port.cpp38
-rw-r--r--src/core/hle/kernel/server_port.h43
6 files changed, 139 insertions, 2 deletions
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt
index ed80cf0e4..2fde9747c 100644
--- a/src/core/CMakeLists.txt
+++ b/src/core/CMakeLists.txt
@@ -29,6 +29,7 @@ set(SRCS
29 hle/applets/mii_selector.cpp 29 hle/applets/mii_selector.cpp
30 hle/applets/swkbd.cpp 30 hle/applets/swkbd.cpp
31 hle/kernel/address_arbiter.cpp 31 hle/kernel/address_arbiter.cpp
32 hle/kernel/client_port.cpp
32 hle/kernel/event.cpp 33 hle/kernel/event.cpp
33 hle/kernel/kernel.cpp 34 hle/kernel/kernel.cpp
34 hle/kernel/memory.cpp 35 hle/kernel/memory.cpp
@@ -36,6 +37,7 @@ set(SRCS
36 hle/kernel/process.cpp 37 hle/kernel/process.cpp
37 hle/kernel/resource_limit.cpp 38 hle/kernel/resource_limit.cpp
38 hle/kernel/semaphore.cpp 39 hle/kernel/semaphore.cpp
40 hle/kernel/server_port.cpp
39 hle/kernel/session.cpp 41 hle/kernel/session.cpp
40 hle/kernel/shared_memory.cpp 42 hle/kernel/shared_memory.cpp
41 hle/kernel/thread.cpp 43 hle/kernel/thread.cpp
@@ -164,6 +166,7 @@ set(HEADERS
164 hle/applets/mii_selector.h 166 hle/applets/mii_selector.h
165 hle/applets/swkbd.h 167 hle/applets/swkbd.h
166 hle/kernel/address_arbiter.h 168 hle/kernel/address_arbiter.h
169 hle/kernel/client_port.h
167 hle/kernel/event.h 170 hle/kernel/event.h
168 hle/kernel/kernel.h 171 hle/kernel/kernel.h
169 hle/kernel/memory.h 172 hle/kernel/memory.h
@@ -171,6 +174,7 @@ set(HEADERS
171 hle/kernel/process.h 174 hle/kernel/process.h
172 hle/kernel/resource_limit.h 175 hle/kernel/resource_limit.h
173 hle/kernel/semaphore.h 176 hle/kernel/semaphore.h
177 hle/kernel/server_port.h
174 hle/kernel/session.h 178 hle/kernel/session.h
175 hle/kernel/shared_memory.h 179 hle/kernel/shared_memory.h
176 hle/kernel/thread.h 180 hle/kernel/thread.h
diff --git a/src/core/hle/kernel/client_port.cpp b/src/core/hle/kernel/client_port.cpp
new file mode 100644
index 000000000..444ce8d45
--- /dev/null
+++ b/src/core/hle/kernel/client_port.cpp
@@ -0,0 +1,16 @@
1// Copyright 2016 Citra Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#include "common/assert.h"
6
7#include "core/hle/kernel/client_port.h"
8#include "core/hle/kernel/kernel.h"
9#include "core/hle/kernel/server_port.h"
10
11namespace Kernel {
12
13ClientPort::ClientPort() {}
14ClientPort::~ClientPort() {}
15
16} // namespace
diff --git a/src/core/hle/kernel/client_port.h b/src/core/hle/kernel/client_port.h
new file mode 100644
index 000000000..b3d15cfc5
--- /dev/null
+++ b/src/core/hle/kernel/client_port.h
@@ -0,0 +1,34 @@
1// Copyright 2016 Citra Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#pragma once
6
7#include <string>
8
9#include "common/common_types.h"
10
11#include "core/hle/kernel/kernel.h"
12
13namespace Kernel {
14
15class ClientPort : public Object {
16public:
17 friend class ServerPort;
18 std::string GetTypeName() const override { return "ClientPort"; }
19 std::string GetName() const override { return name; }
20
21 static const HandleType HANDLE_TYPE = HandleType::ClientPort;
22 HandleType GetHandleType() const override { return HANDLE_TYPE; }
23
24 SharedPtr<ServerPort> server_port; ///< ServerPort associated with this client port.
25 u32 max_sessions; ///< Maximum number of simultaneous sessions the port can have
26 u32 active_sessions; ///< Number of currently open sessions to this port
27 std::string name; ///< Name of client port (optional)
28
29protected:
30 ClientPort();
31 ~ClientPort() override;
32};
33
34} // namespace
diff --git a/src/core/hle/kernel/kernel.h b/src/core/hle/kernel/kernel.h
index 4d4276f7a..a53d408d4 100644
--- a/src/core/hle/kernel/kernel.h
+++ b/src/core/hle/kernel/kernel.h
@@ -35,7 +35,7 @@ enum KernelHandle : Handle {
35 35
36enum class HandleType : u32 { 36enum class HandleType : u32 {
37 Unknown = 0, 37 Unknown = 0,
38 Port = 1, 38 ServerPort = 1,
39 Session = 2, 39 Session = 2,
40 Event = 3, 40 Event = 3,
41 Mutex = 4, 41 Mutex = 4,
@@ -48,6 +48,7 @@ enum class HandleType : u32 {
48 Timer = 11, 48 Timer = 11,
49 ResourceLimit = 12, 49 ResourceLimit = 12,
50 CodeSet = 13, 50 CodeSet = 13,
51 ClientPort = 14,
51}; 52};
52 53
53enum { 54enum {
@@ -72,6 +73,7 @@ public:
72 bool IsWaitable() const { 73 bool IsWaitable() const {
73 switch (GetHandleType()) { 74 switch (GetHandleType()) {
74 case HandleType::Session: 75 case HandleType::Session:
76 case HandleType::ServerPort:
75 case HandleType::Event: 77 case HandleType::Event:
76 case HandleType::Mutex: 78 case HandleType::Mutex:
77 case HandleType::Thread: 79 case HandleType::Thread:
@@ -80,13 +82,13 @@ public:
80 return true; 82 return true;
81 83
82 case HandleType::Unknown: 84 case HandleType::Unknown:
83 case HandleType::Port:
84 case HandleType::SharedMemory: 85 case HandleType::SharedMemory:
85 case HandleType::Redirection: 86 case HandleType::Redirection:
86 case HandleType::Process: 87 case HandleType::Process:
87 case HandleType::AddressArbiter: 88 case HandleType::AddressArbiter:
88 case HandleType::ResourceLimit: 89 case HandleType::ResourceLimit:
89 case HandleType::CodeSet: 90 case HandleType::CodeSet:
91 case HandleType::ClientPort:
90 return false; 92 return false;
91 } 93 }
92 } 94 }
diff --git a/src/core/hle/kernel/server_port.cpp b/src/core/hle/kernel/server_port.cpp
new file mode 100644
index 000000000..ca41265ff
--- /dev/null
+++ b/src/core/hle/kernel/server_port.cpp
@@ -0,0 +1,38 @@
1// Copyright 2016 Citra Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#include "common/assert.h"
6
7#include "core/hle/kernel/kernel.h"
8#include "core/hle/kernel/server_port.h"
9#include "core/hle/kernel/thread.h"
10
11namespace Kernel {
12
13ServerPort::ServerPort() {}
14ServerPort::~ServerPort() {}
15
16bool ServerPort::ShouldWait() {
17 // If there are no pending sessions, we wait until a new one is added.
18 return pending_sessions.size() == 0;
19}
20
21void ServerPort::Acquire() {
22 ASSERT_MSG(!ShouldWait(), "object unavailable!");
23}
24
25std::tuple<SharedPtr<ServerPort>, SharedPtr<ClientPort>> ServerPort::CreatePortPair(u32 max_sessions, std::string name) {
26 SharedPtr<ServerPort> server_port(new ServerPort);
27 SharedPtr<ClientPort> client_port(new ClientPort);
28
29 server_port->name = name + "_Server";
30 client_port->name = name + "_Client";
31 client_port->server_port = server_port;
32 client_port->max_sessions = max_sessions;
33 client_port->active_sessions = 0;
34
35 return std::make_tuple(std::move(server_port), std::move(client_port));
36}
37
38} // namespace
diff --git a/src/core/hle/kernel/server_port.h b/src/core/hle/kernel/server_port.h
new file mode 100644
index 000000000..e41ef8ce4
--- /dev/null
+++ b/src/core/hle/kernel/server_port.h
@@ -0,0 +1,43 @@
1// Copyright 2016 Citra Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#pragma once
6
7#include <string>
8
9#include "common/common_types.h"
10
11#include "core/hle/kernel/kernel.h"
12
13namespace Kernel {
14
15class ServerPort final : public WaitObject {
16public:
17 /**
18 * Creates a pair of a ServerPort and an associated ClientPort.
19 * @param max_sessions Maximum number of sessions to the port
20 * @param name Optional name of the ports
21 * @return The created port tuple
22 */
23 static std::tuple<SharedPtr<ServerPort>, SharedPtr<ClientPort>> CreatePortPair(u32 max_sessions, std::string name = "UnknownPort");
24
25 std::string GetTypeName() const override { return "ServerPort"; }
26 std::string GetName() const override { return name; }
27
28 static const HandleType HANDLE_TYPE = HandleType::ServerPort;
29 HandleType GetHandleType() const override { return HANDLE_TYPE; }
30
31 std::string name; ///< Name of port (optional)
32
33 std::vector<SharedPtr<WaitObject>> pending_sessions; ///< ServerSessions waiting to be accepted by the port
34
35 bool ShouldWait() override;
36 void Acquire() override;
37
38private:
39 ServerPort();
40 ~ServerPort() override;
41};
42
43} // namespace