Преглед изворни кода

applet: Use std::queue instead of std::vector for storage stack

Zach Hilman пре 7 година
родитељ
комит
4ee087fb3c

+ 22 - 10
src/core/hle/service/am/am.cpp

@@ -567,12 +567,12 @@ public:
 
 
 private:
 private:
     void AppletStorageProxyOutData(IStorage storage) {
     void AppletStorageProxyOutData(IStorage storage) {
-        storage_stack.push_back(std::make_shared<IStorage>(storage));
+        storage_stack.push(std::make_shared<IStorage>(storage));
         pop_out_data_event->Signal();
         pop_out_data_event->Signal();
     }
     }
 
 
     void AppletStorageProxyOutInteractiveData(IStorage storage) {
     void AppletStorageProxyOutInteractiveData(IStorage storage) {
-        interactive_storage_stack.push_back(std::make_shared<IStorage>(storage));
+        interactive_storage_stack.push(std::make_shared<IStorage>(storage));
         pop_interactive_out_data_event->Signal();
         pop_interactive_out_data_event->Signal();
     }
     }
 
 
@@ -621,7 +621,7 @@ private:
 
 
     void PushInData(Kernel::HLERequestContext& ctx) {
     void PushInData(Kernel::HLERequestContext& ctx) {
         IPC::RequestParser rp{ctx};
         IPC::RequestParser rp{ctx};
-        storage_stack.push_back(rp.PopIpcInterface<IStorage>());
+        storage_stack.push(rp.PopIpcInterface<IStorage>());
 
 
         IPC::ResponseBuilder rb{ctx, 2};
         IPC::ResponseBuilder rb{ctx, 2};
         rb.Push(RESULT_SUCCESS);
         rb.Push(RESULT_SUCCESS);
@@ -631,17 +631,23 @@ private:
 
 
     void PopOutData(Kernel::HLERequestContext& ctx) {
     void PopOutData(Kernel::HLERequestContext& ctx) {
         IPC::ResponseBuilder rb{ctx, 2, 0, 1};
         IPC::ResponseBuilder rb{ctx, 2, 0, 1};
+
+        if (storage_stack.empty()) {
+            rb.Push(ResultCode(-1));
+            return;
+        }
+
         rb.Push(RESULT_SUCCESS);
         rb.Push(RESULT_SUCCESS);
-        rb.PushIpcInterface<IStorage>(std::move(storage_stack.back()));
+        rb.PushIpcInterface<IStorage>(std::move(storage_stack.front()));
 
 
-        storage_stack.pop_back();
+        storage_stack.pop();
 
 
         LOG_DEBUG(Service_AM, "called");
         LOG_DEBUG(Service_AM, "called");
     }
     }
 
 
     void PushInteractiveInData(Kernel::HLERequestContext& ctx) {
     void PushInteractiveInData(Kernel::HLERequestContext& ctx) {
         IPC::RequestParser rp{ctx};
         IPC::RequestParser rp{ctx};
-        interactive_storage_stack.push_back(rp.PopIpcInterface<IStorage>());
+        interactive_storage_stack.push(rp.PopIpcInterface<IStorage>());
 
 
         ASSERT(applet->IsInitialized());
         ASSERT(applet->IsInitialized());
         applet->ReceiveInteractiveData(interactive_storage_stack.back());
         applet->ReceiveInteractiveData(interactive_storage_stack.back());
@@ -657,10 +663,16 @@ private:
 
 
     void PopInteractiveOutData(Kernel::HLERequestContext& ctx) {
     void PopInteractiveOutData(Kernel::HLERequestContext& ctx) {
         IPC::ResponseBuilder rb{ctx, 2, 0, 1};
         IPC::ResponseBuilder rb{ctx, 2, 0, 1};
+
+        if (interactive_storage_stack.empty()) {
+            rb.Push(ResultCode(-1));
+            return;
+        }
+
         rb.Push(RESULT_SUCCESS);
         rb.Push(RESULT_SUCCESS);
-        rb.PushIpcInterface<IStorage>(std::move(interactive_storage_stack.back()));
+        rb.PushIpcInterface<IStorage>(std::move(interactive_storage_stack.front()));
 
 
-        interactive_storage_stack.pop_back();
+        interactive_storage_stack.pop();
 
 
         LOG_DEBUG(Service_AM, "called");
         LOG_DEBUG(Service_AM, "called");
     }
     }
@@ -682,8 +694,8 @@ private:
     }
     }
 
 
     std::shared_ptr<Applets::Applet> applet;
     std::shared_ptr<Applets::Applet> applet;
-    std::vector<std::shared_ptr<IStorage>> storage_stack;
-    std::vector<std::shared_ptr<IStorage>> interactive_storage_stack;
+    std::queue<std::shared_ptr<IStorage>> storage_stack;
+    std::queue<std::shared_ptr<IStorage>> interactive_storage_stack;
     Kernel::SharedPtr<Kernel::Event> state_changed_event;
     Kernel::SharedPtr<Kernel::Event> state_changed_event;
     Kernel::SharedPtr<Kernel::Event> pop_out_data_event;
     Kernel::SharedPtr<Kernel::Event> pop_out_data_event;
     Kernel::SharedPtr<Kernel::Event> pop_interactive_out_data_event;
     Kernel::SharedPtr<Kernel::Event> pop_interactive_out_data_event;

+ 11 - 1
src/core/hle/service/am/applets/applets.cpp

@@ -2,7 +2,10 @@
 // Licensed under GPLv2 or any later version
 // Licensed under GPLv2 or any later version
 // Refer to the license.txt file included.
 // Refer to the license.txt file included.
 
 
+#include <cstring>
+#include "common/assert.h"
 #include "core/frontend/applets/software_keyboard.h"
 #include "core/frontend/applets/software_keyboard.h"
+#include "core/hle/service/am/am.h"
 #include "core/hle/service/am/applets/applets.h"
 #include "core/hle/service/am/applets/applets.h"
 
 
 namespace Service::AM::Applets {
 namespace Service::AM::Applets {
@@ -11,8 +14,15 @@ Applet::Applet() = default;
 
 
 Applet::~Applet() = default;
 Applet::~Applet() = default;
 
 
-void Applet::Initialize(std::vector<std::shared_ptr<IStorage>> storage) {
+void Applet::Initialize(std::queue<std::shared_ptr<IStorage>> storage) {
     storage_stack = std::move(storage);
     storage_stack = std::move(storage);
+
+    const auto common_data = storage_stack.front()->GetData();
+    storage_stack.pop();
+
+    ASSERT(common_data.size() >= sizeof(CommonArguments));
+    std::memcpy(&common_args, common_data.data(), sizeof(CommonArguments));
+
     initialized = true;
     initialized = true;
 }
 }
 
 

+ 4 - 3
src/core/hle/service/am/applets/applets.h

@@ -6,7 +6,7 @@
 
 
 #include <functional>
 #include <functional>
 #include <memory>
 #include <memory>
-#include <vector>
+#include <queue>
 #include "common/swap.h"
 #include "common/swap.h"
 
 
 union ResultCode;
 union ResultCode;
@@ -29,7 +29,7 @@ public:
     Applet();
     Applet();
     virtual ~Applet();
     virtual ~Applet();
 
 
-    virtual void Initialize(std::vector<std::shared_ptr<IStorage>> storage);
+    virtual void Initialize(std::queue<std::shared_ptr<IStorage>> storage);
 
 
     virtual bool TransactionComplete() const = 0;
     virtual bool TransactionComplete() const = 0;
     virtual ResultCode GetStatus() const = 0;
     virtual ResultCode GetStatus() const = 0;
@@ -53,7 +53,8 @@ protected:
     };
     };
     static_assert(sizeof(CommonArguments) == 0x20, "CommonArguments has incorrect size.");
     static_assert(sizeof(CommonArguments) == 0x20, "CommonArguments has incorrect size.");
 
 
-    std::vector<std::shared_ptr<IStorage>> storage_stack;
+    CommonArguments common_args;
+    std::queue<std::shared_ptr<IStorage>> storage_stack;
     bool initialized = false;
     bool initialized = false;
 };
 };
 
 

+ 6 - 3
src/core/hle/service/am/applets/software_keyboard.cpp

@@ -42,7 +42,7 @@ SoftwareKeyboard::SoftwareKeyboard() = default;
 
 
 SoftwareKeyboard::~SoftwareKeyboard() = default;
 SoftwareKeyboard::~SoftwareKeyboard() = default;
 
 
-void SoftwareKeyboard::Initialize(std::vector<std::shared_ptr<IStorage>> storage_) {
+void SoftwareKeyboard::Initialize(std::queue<std::shared_ptr<IStorage>> storage_) {
     complete = false;
     complete = false;
     initial_text.clear();
     initial_text.clear();
     final_data.clear();
     final_data.clear();
@@ -50,11 +50,14 @@ void SoftwareKeyboard::Initialize(std::vector<std::shared_ptr<IStorage>> storage
     Applet::Initialize(std::move(storage_));
     Applet::Initialize(std::move(storage_));
 
 
     ASSERT(storage_stack.size() >= 2);
     ASSERT(storage_stack.size() >= 2);
-    const auto& keyboard_config = storage_stack[1]->GetData();
+    const auto& keyboard_config = storage_stack.front()->GetData();
+    storage_stack.pop();
+
     ASSERT(keyboard_config.size() >= sizeof(KeyboardConfig));
     ASSERT(keyboard_config.size() >= sizeof(KeyboardConfig));
     std::memcpy(&config, keyboard_config.data(), sizeof(KeyboardConfig));
     std::memcpy(&config, keyboard_config.data(), sizeof(KeyboardConfig));
 
 
-    const auto& work_buffer = storage_stack[2]->GetData();
+    const auto& work_buffer = storage_stack.front()->GetData();
+    storage_stack.pop();
 
 
     if (config.initial_string_size == 0)
     if (config.initial_string_size == 0)
         return;
         return;

+ 1 - 1
src/core/hle/service/am/applets/software_keyboard.h

@@ -49,7 +49,7 @@ public:
     SoftwareKeyboard();
     SoftwareKeyboard();
     ~SoftwareKeyboard() override;
     ~SoftwareKeyboard() override;
 
 
-    void Initialize(std::vector<std::shared_ptr<IStorage>> storage) override;
+    void Initialize(std::queue<std::shared_ptr<IStorage>> storage) override;
 
 
     bool TransactionComplete() const override;
     bool TransactionComplete() const override;
     ResultCode GetStatus() const override;
     ResultCode GetStatus() const override;