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

This commit is contained in:
Zach Hilman 2018-11-17 12:19:06 -05:00
parent 19b2571aec
commit 4ee087fb3c
5 changed files with 46 additions and 20 deletions

View File

@ -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};
rb.Push(RESULT_SUCCESS);
rb.PushIpcInterface<IStorage>(std::move(storage_stack.back()));
storage_stack.pop_back(); if (storage_stack.empty()) {
rb.Push(ResultCode(-1));
return;
}
rb.Push(RESULT_SUCCESS);
rb.PushIpcInterface<IStorage>(std::move(storage_stack.front()));
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};
rb.Push(RESULT_SUCCESS);
rb.PushIpcInterface<IStorage>(std::move(interactive_storage_stack.back()));
interactive_storage_stack.pop_back(); if (interactive_storage_stack.empty()) {
rb.Push(ResultCode(-1));
return;
}
rb.Push(RESULT_SUCCESS);
rb.PushIpcInterface<IStorage>(std::move(interactive_storage_stack.front()));
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::queue<std::shared_ptr<IStorage>> storage_stack;
std::vector<std::shared_ptr<IStorage>> interactive_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;

View File

@ -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;
} }

View File

@ -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;
}; };

View File

@ -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;

View File

@ -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;