Services/APT: Use the AppletAttributes union directly when dealing with applet attrs.

master
Subv 2017-08-07 16:09:55 +07:00
parent 73fba0de46
commit 177e8ce655
1 changed files with 15 additions and 19 deletions

@ -60,11 +60,20 @@ enum class AppletSlot : u8 {
Error, Error,
}; };
union AppletAttributes {
u32 raw;
BitField<0, 3, u32> applet_pos;
AppletAttributes() : raw(0) {}
AppletAttributes(u32 attributes) : raw(attributes) {}
};
struct AppletSlotData { struct AppletSlotData {
AppletId applet_id; AppletId applet_id;
AppletSlot slot; AppletSlot slot;
bool registered; bool registered;
u32 attributes; AppletAttributes attributes;
Kernel::SharedPtr<Kernel::Event> notification_event; Kernel::SharedPtr<Kernel::Event> notification_event;
Kernel::SharedPtr<Kernel::Event> parameter_event; Kernel::SharedPtr<Kernel::Event> parameter_event;
}; };
@ -72,19 +81,6 @@ struct AppletSlotData {
// Holds data about the concurrently running applets in the system. // Holds data about the concurrently running applets in the system.
static std::array<AppletSlotData, NumAppletSlot> applet_slots = {}; static std::array<AppletSlotData, NumAppletSlot> applet_slots = {};
union AppletAttributes {
u32 raw;
BitField<0, 3, u32> applet_pos;
AppletAttributes(u32 attributes) : raw(attributes) {}
};
// Helper function to extract the AppletPos from the lower bits of the applet attributes
static u32 GetAppletPos(AppletAttributes attributes) {
return attributes.applet_pos;
}
// This overload returns nullptr if no applet with the specified id has been started. // This overload returns nullptr if no applet with the specified id has been started.
static AppletSlotData* GetAppletSlotData(AppletId id) { static AppletSlotData* GetAppletSlotData(AppletId id) {
auto GetSlot = [](AppletSlot slot) -> AppletSlotData* { auto GetSlot = [](AppletSlot slot) -> AppletSlotData* {
@ -118,7 +114,7 @@ static AppletSlotData* GetAppletSlotData(AppletId id) {
if (slot->applet_id == AppletId::None) if (slot->applet_id == AppletId::None)
return nullptr; return nullptr;
u32 applet_pos = GetAppletPos(slot->attributes); u32 applet_pos = slot->attributes.applet_pos;
if (id == AppletId::AnyLibraryApplet && applet_pos == static_cast<u32>(AppletPos::Library)) if (id == AppletId::AnyLibraryApplet && applet_pos == static_cast<u32>(AppletPos::Library))
return slot; return slot;
@ -146,13 +142,13 @@ static AppletSlotData* GetAppletSlotData(AppletId id) {
return nullptr; return nullptr;
} }
static AppletSlotData* GetAppletSlotData(u32 attributes) { static AppletSlotData* GetAppletSlotData(AppletAttributes attributes) {
// Mapping from AppletPos to AppletSlot // Mapping from AppletPos to AppletSlot
static constexpr std::array<AppletSlot, 6> applet_position_slots = { static constexpr std::array<AppletSlot, 6> applet_position_slots = {
AppletSlot::Application, AppletSlot::LibraryApplet, AppletSlot::SystemApplet, AppletSlot::Application, AppletSlot::LibraryApplet, AppletSlot::SystemApplet,
AppletSlot::LibraryApplet, AppletSlot::Error, AppletSlot::LibraryApplet}; AppletSlot::LibraryApplet, AppletSlot::Error, AppletSlot::LibraryApplet};
u32 applet_pos = GetAppletPos(attributes); u32 applet_pos = attributes.applet_pos;
if (applet_pos >= applet_position_slots.size()) if (applet_pos >= applet_position_slots.size())
return nullptr; return nullptr;
@ -194,7 +190,7 @@ void Initialize(Service::Interface* self) {
} }
slot_data->applet_id = static_cast<AppletId>(app_id); slot_data->applet_id = static_cast<AppletId>(app_id);
slot_data->attributes = attributes; slot_data->attributes.raw = attributes;
IPC::RequestBuilder rb = rp.MakeBuilder(1, 3); IPC::RequestBuilder rb = rp.MakeBuilder(1, 3);
rb.Push(RESULT_SUCCESS); rb.Push(RESULT_SUCCESS);
@ -1020,7 +1016,7 @@ void Init() {
auto& slot_data = applet_slots[slot]; auto& slot_data = applet_slots[slot];
slot_data.slot = static_cast<AppletSlot>(slot); slot_data.slot = static_cast<AppletSlot>(slot);
slot_data.applet_id = AppletId::None; slot_data.applet_id = AppletId::None;
slot_data.attributes = 0; slot_data.attributes.raw = 0;
slot_data.registered = false; slot_data.registered = false;
slot_data.notification_event = slot_data.notification_event =
Kernel::Event::Create(Kernel::ResetType::OneShot, "APT:Notification"); Kernel::Event::Create(Kernel::ResetType::OneShot, "APT:Notification");