mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-11-04 07:38:47 +00:00 
			
		
		
		
	Merge pull request #4710 from wwylele/why-instrusive-ptr
Kernel: replace boost::intrusive_ptr with std::shared_ptr
This commit is contained in:
		
						commit
						daeba65fb4
					
				
					 99 changed files with 544 additions and 554 deletions
				
			
		| 
						 | 
				
			
			@ -6,7 +6,6 @@
 | 
			
		|||
 | 
			
		||||
#include <array>
 | 
			
		||||
#include <memory>
 | 
			
		||||
#include "core/hle/kernel/kernel.h"
 | 
			
		||||
#include "core/hle/service/service.h"
 | 
			
		||||
 | 
			
		||||
namespace Core {
 | 
			
		||||
| 
						 | 
				
			
			@ -151,9 +150,9 @@ protected:
 | 
			
		|||
 | 
			
		||||
    bool ac_connected = false;
 | 
			
		||||
 | 
			
		||||
    Kernel::SharedPtr<Kernel::Event> close_event;
 | 
			
		||||
    Kernel::SharedPtr<Kernel::Event> connect_event;
 | 
			
		||||
    Kernel::SharedPtr<Kernel::Event> disconnect_event;
 | 
			
		||||
    std::shared_ptr<Kernel::Event> close_event;
 | 
			
		||||
    std::shared_ptr<Kernel::Event> connect_event;
 | 
			
		||||
    std::shared_ptr<Kernel::Event> disconnect_event;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void InstallInterfaces(Core::System& system);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1138,7 +1138,7 @@ private:
 | 
			
		|||
};
 | 
			
		||||
 | 
			
		||||
ResultVal<std::unique_ptr<AMFileWrapper>> GetFileFromSession(
 | 
			
		||||
    Kernel::SharedPtr<Kernel::ClientSession> file_session) {
 | 
			
		||||
    std::shared_ptr<Kernel::ClientSession> file_session) {
 | 
			
		||||
    // Step up the chain from ClientSession->ServerSession and then
 | 
			
		||||
    // cast to File. For AM on 3DS, invalid handles actually hang the system.
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1147,7 +1147,8 @@ ResultVal<std::unique_ptr<AMFileWrapper>> GetFileFromSession(
 | 
			
		|||
        return Kernel::ERR_INVALID_HANDLE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Kernel::SharedPtr<Kernel::ServerSession> server = file_session->parent->server;
 | 
			
		||||
    std::shared_ptr<Kernel::ServerSession> server =
 | 
			
		||||
        Kernel::SharedFrom(file_session->parent->server);
 | 
			
		||||
    if (server == nullptr) {
 | 
			
		||||
        LOG_WARNING(Service_AM, "File handle ServerSession disconnected!");
 | 
			
		||||
        return Kernel::ERR_SESSION_CLOSED_BY_REMOTE;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -576,7 +576,7 @@ private:
 | 
			
		|||
    Core::System& system;
 | 
			
		||||
    bool cia_installing = false;
 | 
			
		||||
    std::array<std::vector<u64_le>, 3> am_title_list;
 | 
			
		||||
    Kernel::SharedPtr<Kernel::Mutex> system_updater_mutex;
 | 
			
		||||
    std::shared_ptr<Kernel::Mutex> system_updater_mutex;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void InstallInterfaces(Core::System& system);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -384,7 +384,7 @@ ResultCode AppletManager::FinishPreloadingLibraryApplet(AppletId applet_id) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
ResultCode AppletManager::StartLibraryApplet(AppletId applet_id,
 | 
			
		||||
                                             Kernel::SharedPtr<Kernel::Object> object,
 | 
			
		||||
                                             std::shared_ptr<Kernel::Object> object,
 | 
			
		||||
                                             const std::vector<u8>& buffer) {
 | 
			
		||||
    MessageParameter param;
 | 
			
		||||
    param.destination_id = applet_id;
 | 
			
		||||
| 
						 | 
				
			
			@ -424,7 +424,7 @@ ResultCode AppletManager::PrepareToCloseLibraryApplet(bool not_pause, bool exiti
 | 
			
		|||
    return RESULT_SUCCESS;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ResultCode AppletManager::CloseLibraryApplet(Kernel::SharedPtr<Kernel::Object> object,
 | 
			
		||||
ResultCode AppletManager::CloseLibraryApplet(std::shared_ptr<Kernel::Object> object,
 | 
			
		||||
                                             std::vector<u8> buffer) {
 | 
			
		||||
    auto& slot = applet_slots[static_cast<std::size_t>(AppletSlot::LibraryApplet)];
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,6 +5,7 @@
 | 
			
		|||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <array>
 | 
			
		||||
#include <memory>
 | 
			
		||||
#include <optional>
 | 
			
		||||
#include <vector>
 | 
			
		||||
#include "core/hle/kernel/event.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -81,13 +82,13 @@ struct MessageParameter {
 | 
			
		|||
    AppletId sender_id = AppletId::None;
 | 
			
		||||
    AppletId destination_id = AppletId::None;
 | 
			
		||||
    SignalType signal = SignalType::None;
 | 
			
		||||
    Kernel::SharedPtr<Kernel::Object> object = nullptr;
 | 
			
		||||
    std::shared_ptr<Kernel::Object> object = nullptr;
 | 
			
		||||
    std::vector<u8> buffer;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/// Holds information about the parameters used in StartLibraryApplet
 | 
			
		||||
struct AppletStartupParameter {
 | 
			
		||||
    Kernel::SharedPtr<Kernel::Object> object = nullptr;
 | 
			
		||||
    std::shared_ptr<Kernel::Object> object = nullptr;
 | 
			
		||||
    std::vector<u8> buffer;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -125,8 +126,8 @@ public:
 | 
			
		|||
                         AppletId receiver_appid);
 | 
			
		||||
 | 
			
		||||
    struct InitializeResult {
 | 
			
		||||
        Kernel::SharedPtr<Kernel::Event> notification_event;
 | 
			
		||||
        Kernel::SharedPtr<Kernel::Event> parameter_event;
 | 
			
		||||
        std::shared_ptr<Kernel::Event> notification_event;
 | 
			
		||||
        std::shared_ptr<Kernel::Event> parameter_event;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    ResultVal<InitializeResult> Initialize(AppletId app_id, AppletAttributes attributes);
 | 
			
		||||
| 
						 | 
				
			
			@ -135,10 +136,10 @@ public:
 | 
			
		|||
    ResultCode PrepareToStartLibraryApplet(AppletId applet_id);
 | 
			
		||||
    ResultCode PreloadLibraryApplet(AppletId applet_id);
 | 
			
		||||
    ResultCode FinishPreloadingLibraryApplet(AppletId applet_id);
 | 
			
		||||
    ResultCode StartLibraryApplet(AppletId applet_id, Kernel::SharedPtr<Kernel::Object> object,
 | 
			
		||||
    ResultCode StartLibraryApplet(AppletId applet_id, std::shared_ptr<Kernel::Object> object,
 | 
			
		||||
                                  const std::vector<u8>& buffer);
 | 
			
		||||
    ResultCode PrepareToCloseLibraryApplet(bool not_pause, bool exiting, bool jump_home);
 | 
			
		||||
    ResultCode CloseLibraryApplet(Kernel::SharedPtr<Kernel::Object> object, std::vector<u8> buffer);
 | 
			
		||||
    ResultCode CloseLibraryApplet(std::shared_ptr<Kernel::Object> object, std::vector<u8> buffer);
 | 
			
		||||
 | 
			
		||||
    ResultCode PrepareToDoApplicationJump(u64 title_id, FS::MediaType media_type,
 | 
			
		||||
                                          ApplicationJumpFlags flags);
 | 
			
		||||
| 
						 | 
				
			
			@ -189,8 +190,8 @@ private:
 | 
			
		|||
        bool registered;
 | 
			
		||||
        bool loaded;
 | 
			
		||||
        AppletAttributes attributes;
 | 
			
		||||
        Kernel::SharedPtr<Kernel::Event> notification_event;
 | 
			
		||||
        Kernel::SharedPtr<Kernel::Event> parameter_event;
 | 
			
		||||
        std::shared_ptr<Kernel::Event> notification_event;
 | 
			
		||||
        std::shared_ptr<Kernel::Event> parameter_event;
 | 
			
		||||
 | 
			
		||||
        void Reset() {
 | 
			
		||||
            applet_id = AppletId::None;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -308,7 +308,7 @@ void Module::Interface::SendParameter(Kernel::HLERequestContext& ctx) {
 | 
			
		|||
    AppletId dst_app_id = rp.PopEnum<AppletId>();
 | 
			
		||||
    SignalType signal_type = rp.PopEnum<SignalType>();
 | 
			
		||||
    u32 buffer_size = rp.Pop<u32>();
 | 
			
		||||
    Kernel::SharedPtr<Kernel::Object> object = rp.PopGenericObject();
 | 
			
		||||
    std::shared_ptr<Kernel::Object> object = rp.PopGenericObject();
 | 
			
		||||
    std::vector<u8> buffer = rp.PopStaticBuffer();
 | 
			
		||||
 | 
			
		||||
    LOG_DEBUG(Service_APT,
 | 
			
		||||
| 
						 | 
				
			
			@ -586,7 +586,7 @@ void Module::Interface::StartLibraryApplet(Kernel::HLERequestContext& ctx) {
 | 
			
		|||
    AppletId applet_id = rp.PopEnum<AppletId>();
 | 
			
		||||
 | 
			
		||||
    std::size_t buffer_size = rp.Pop<u32>();
 | 
			
		||||
    Kernel::SharedPtr<Kernel::Object> object = rp.PopGenericObject();
 | 
			
		||||
    std::shared_ptr<Kernel::Object> object = rp.PopGenericObject();
 | 
			
		||||
    std::vector<u8> buffer = rp.PopStaticBuffer();
 | 
			
		||||
 | 
			
		||||
    LOG_DEBUG(Service_APT, "called, applet_id={:08X}", static_cast<u32>(applet_id));
 | 
			
		||||
| 
						 | 
				
			
			@ -598,7 +598,7 @@ void Module::Interface::StartLibraryApplet(Kernel::HLERequestContext& ctx) {
 | 
			
		|||
void Module::Interface::CloseApplication(Kernel::HLERequestContext& ctx) {
 | 
			
		||||
    IPC::RequestParser rp(ctx, 0x27, 1, 4);
 | 
			
		||||
    u32 parameters_size = rp.Pop<u32>();
 | 
			
		||||
    Kernel::SharedPtr<Kernel::Object> object = rp.PopGenericObject();
 | 
			
		||||
    std::shared_ptr<Kernel::Object> object = rp.PopGenericObject();
 | 
			
		||||
    std::vector<u8> buffer = rp.PopStaticBuffer();
 | 
			
		||||
 | 
			
		||||
    LOG_DEBUG(Service_APT, "called");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,11 +4,11 @@
 | 
			
		|||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <memory>
 | 
			
		||||
#include <vector>
 | 
			
		||||
#include "common/common_funcs.h"
 | 
			
		||||
#include "common/common_types.h"
 | 
			
		||||
#include "common/swap.h"
 | 
			
		||||
#include "core/hle/kernel/kernel.h"
 | 
			
		||||
#include "core/hle/service/service.h"
 | 
			
		||||
 | 
			
		||||
namespace Core {
 | 
			
		||||
| 
						 | 
				
			
			@ -603,11 +603,11 @@ private:
 | 
			
		|||
    Core::System& system;
 | 
			
		||||
 | 
			
		||||
    /// Handle to shared memory region designated to for shared system font
 | 
			
		||||
    Kernel::SharedPtr<Kernel::SharedMemory> shared_font_mem;
 | 
			
		||||
    std::shared_ptr<Kernel::SharedMemory> shared_font_mem;
 | 
			
		||||
    bool shared_font_loaded = false;
 | 
			
		||||
    bool shared_font_relocated = false;
 | 
			
		||||
 | 
			
		||||
    Kernel::SharedPtr<Kernel::Mutex> lock;
 | 
			
		||||
    std::shared_ptr<Kernel::Mutex> lock;
 | 
			
		||||
 | 
			
		||||
    u32 cpu_percent = 0; ///< CPU time available to the running application
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,7 +7,7 @@
 | 
			
		|||
 | 
			
		||||
namespace Service::APT::BCFNT {
 | 
			
		||||
 | 
			
		||||
void RelocateSharedFont(Kernel::SharedPtr<Kernel::SharedMemory> shared_font, VAddr new_address) {
 | 
			
		||||
void RelocateSharedFont(std::shared_ptr<Kernel::SharedMemory> shared_font, VAddr new_address) {
 | 
			
		||||
    static const u32 SharedFontStartOffset = 0x80;
 | 
			
		||||
    const u8* cfnt_ptr = shared_font->GetPointer(SharedFontStartOffset);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,6 +4,7 @@
 | 
			
		|||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <memory>
 | 
			
		||||
#include "common/swap.h"
 | 
			
		||||
#include "core/hle/kernel/shared_memory.h"
 | 
			
		||||
#include "core/hle/service/service.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -83,6 +84,6 @@ struct CWDH {
 | 
			
		|||
 * @param shared_font SharedMemory object that contains the Shared Font
 | 
			
		||||
 * @param new_address New base for the offsets in the structure.
 | 
			
		||||
 */
 | 
			
		||||
void RelocateSharedFont(Kernel::SharedPtr<Kernel::SharedMemory> shared_font, VAddr new_address);
 | 
			
		||||
void RelocateSharedFont(std::shared_ptr<Kernel::SharedMemory> shared_font, VAddr new_address);
 | 
			
		||||
 | 
			
		||||
} // namespace Service::APT::BCFNT
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -282,7 +282,7 @@ void Module::Interface::SendProperty(Kernel::HLERequestContext& ctx) {
 | 
			
		|||
void Module::Interface::SendPropertyHandle(Kernel::HLERequestContext& ctx) {
 | 
			
		||||
    IPC::RequestParser rp(ctx, 0x15, 1, 2);
 | 
			
		||||
    const u16 property_id = rp.Pop<u16>();
 | 
			
		||||
    const Kernel::SharedPtr<Kernel::Object> object = rp.PopGenericObject();
 | 
			
		||||
    const std::shared_ptr<Kernel::Object> object = rp.PopGenericObject();
 | 
			
		||||
 | 
			
		||||
    IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
 | 
			
		||||
    rb.Push(RESULT_SUCCESS);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,6 +4,7 @@
 | 
			
		|||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <memory>
 | 
			
		||||
#include "core/hle/kernel/event.h"
 | 
			
		||||
#include "core/hle/service/service.h"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -961,7 +962,7 @@ public:
 | 
			
		|||
    };
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    Kernel::SharedPtr<Kernel::Event> task_finish_event;
 | 
			
		||||
    std::shared_ptr<Kernel::Event> task_finish_event;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void InstallInterfaces(Core::System& system);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -769,9 +769,9 @@ private:
 | 
			
		|||
 | 
			
		||||
        u16 transfer_bytes{256};
 | 
			
		||||
 | 
			
		||||
        Kernel::SharedPtr<Kernel::Event> completion_event;
 | 
			
		||||
        Kernel::SharedPtr<Kernel::Event> buffer_error_interrupt_event;
 | 
			
		||||
        Kernel::SharedPtr<Kernel::Event> vsync_interrupt_event;
 | 
			
		||||
        std::shared_ptr<Kernel::Event> completion_event;
 | 
			
		||||
        std::shared_ptr<Kernel::Event> buffer_error_interrupt_event;
 | 
			
		||||
        std::shared_ptr<Kernel::Event> vsync_interrupt_event;
 | 
			
		||||
 | 
			
		||||
        std::future<std::vector<u16>> capture_result; // will hold the received frame.
 | 
			
		||||
        Kernel::Process* dest_process{nullptr};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,6 +4,7 @@
 | 
			
		|||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <memory>
 | 
			
		||||
#include "common/bit_field.h"
 | 
			
		||||
#include "common/common_funcs.h"
 | 
			
		||||
#include "core/hle/kernel/event.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -608,8 +609,8 @@ private:
 | 
			
		|||
 | 
			
		||||
    std::unique_ptr<FileSys::ArchiveBackend> cecd_system_save_data_archive;
 | 
			
		||||
 | 
			
		||||
    Kernel::SharedPtr<Kernel::Event> cecinfo_event;
 | 
			
		||||
    Kernel::SharedPtr<Kernel::Event> change_state_event;
 | 
			
		||||
    std::shared_ptr<Kernel::Event> cecinfo_event;
 | 
			
		||||
    std::shared_ptr<Kernel::Event> change_state_event;
 | 
			
		||||
 | 
			
		||||
    Core::System& system;
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,6 +4,7 @@
 | 
			
		|||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <memory>
 | 
			
		||||
#include "core/hle/kernel/mutex.h"
 | 
			
		||||
#include "core/hle/kernel/shared_memory.h"
 | 
			
		||||
#include "core/hle/service/service.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -176,8 +177,8 @@ private:
 | 
			
		|||
 | 
			
		||||
    Core::System& system;
 | 
			
		||||
 | 
			
		||||
    Kernel::SharedPtr<Kernel::Mutex> mutex = nullptr;
 | 
			
		||||
    Kernel::SharedPtr<Kernel::SharedMemory> shared_memory = nullptr;
 | 
			
		||||
    std::shared_ptr<Kernel::Mutex> mutex = nullptr;
 | 
			
		||||
    std::shared_ptr<Kernel::SharedMemory> shared_memory = nullptr;
 | 
			
		||||
 | 
			
		||||
    static constexpr u32 MaxCaptureUnits = 2;
 | 
			
		||||
    std::array<bool, MaxCaptureUnits> capture_units = {false, false};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -308,7 +308,7 @@ void DSP_DSP::SignalInterrupt(InterruptType type, DspPipe pipe) {
 | 
			
		|||
        event->Signal();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Kernel::SharedPtr<Kernel::Event>& DSP_DSP::GetInterruptEvent(InterruptType type, DspPipe pipe) {
 | 
			
		||||
std::shared_ptr<Kernel::Event>& DSP_DSP::GetInterruptEvent(InterruptType type, DspPipe pipe) {
 | 
			
		||||
    switch (type) {
 | 
			
		||||
    case InterruptType::Zero:
 | 
			
		||||
        return interrupt_zero;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,6 +4,7 @@
 | 
			
		|||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <memory>
 | 
			
		||||
#include "audio_core/dsp_interface.h"
 | 
			
		||||
#include "core/hle/kernel/event.h"
 | 
			
		||||
#include "core/hle/result.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -249,21 +250,20 @@ private:
 | 
			
		|||
    void ForceHeadphoneOut(Kernel::HLERequestContext& ctx);
 | 
			
		||||
 | 
			
		||||
    /// Returns the Interrupt Event for a given pipe
 | 
			
		||||
    Kernel::SharedPtr<Kernel::Event>& GetInterruptEvent(InterruptType type,
 | 
			
		||||
                                                        AudioCore::DspPipe pipe);
 | 
			
		||||
    std::shared_ptr<Kernel::Event>& GetInterruptEvent(InterruptType type, AudioCore::DspPipe pipe);
 | 
			
		||||
    /// Checks if we are trying to register more than 6 events
 | 
			
		||||
    bool HasTooManyEventsRegistered() const;
 | 
			
		||||
 | 
			
		||||
    Core::System& system;
 | 
			
		||||
 | 
			
		||||
    Kernel::SharedPtr<Kernel::Event> semaphore_event;
 | 
			
		||||
    std::shared_ptr<Kernel::Event> semaphore_event;
 | 
			
		||||
    u16 preset_semaphore = 0;
 | 
			
		||||
 | 
			
		||||
    Kernel::SharedPtr<Kernel::Event> interrupt_zero = nullptr; /// Currently unknown purpose
 | 
			
		||||
    Kernel::SharedPtr<Kernel::Event> interrupt_one = nullptr;  /// Currently unknown purpose
 | 
			
		||||
    std::shared_ptr<Kernel::Event> interrupt_zero = nullptr; /// Currently unknown purpose
 | 
			
		||||
    std::shared_ptr<Kernel::Event> interrupt_one = nullptr;  /// Currently unknown purpose
 | 
			
		||||
 | 
			
		||||
    /// Each DSP pipe has an associated interrupt
 | 
			
		||||
    std::array<Kernel::SharedPtr<Kernel::Event>, AudioCore::num_dsp_pipe> pipes = {{}};
 | 
			
		||||
    std::array<std::shared_ptr<Kernel::Event>, AudioCore::num_dsp_pipe> pipes = {{}};
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void InstallInterfaces(Core::System& system);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,8 +4,8 @@
 | 
			
		|||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <memory>
 | 
			
		||||
#include "core/file_sys/archive_backend.h"
 | 
			
		||||
#include "core/hle/kernel/kernel.h"
 | 
			
		||||
#include "core/hle/service/service.h"
 | 
			
		||||
 | 
			
		||||
namespace Service::FS {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -71,12 +71,13 @@ void File::Read(Kernel::HLERequestContext& ctx) {
 | 
			
		|||
    rb.PushMappedBuffer(buffer);
 | 
			
		||||
 | 
			
		||||
    std::chrono::nanoseconds read_timeout_ns{backend->GetReadDelayNs(length)};
 | 
			
		||||
    ctx.SleepClientThread(
 | 
			
		||||
        system.Kernel().GetThreadManager().GetCurrentThread(), "file::read", read_timeout_ns,
 | 
			
		||||
        [](Kernel::SharedPtr<Kernel::Thread> /*thread*/, Kernel::HLERequestContext& /*ctx*/,
 | 
			
		||||
           Kernel::ThreadWakeupReason /*reason*/) {
 | 
			
		||||
            // Nothing to do here
 | 
			
		||||
        });
 | 
			
		||||
    ctx.SleepClientThread(Kernel::SharedFrom(system.Kernel().GetThreadManager().GetCurrentThread()),
 | 
			
		||||
                          "file::read", read_timeout_ns,
 | 
			
		||||
                          [](std::shared_ptr<Kernel::Thread> /*thread*/,
 | 
			
		||||
                             Kernel::HLERequestContext& /*ctx*/,
 | 
			
		||||
                             Kernel::ThreadWakeupReason /*reason*/) {
 | 
			
		||||
                              // Nothing to do here
 | 
			
		||||
                          });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void File::Write(Kernel::HLERequestContext& ctx) {
 | 
			
		||||
| 
						 | 
				
			
			@ -195,11 +196,10 @@ void File::OpenLinkFile(Kernel::HLERequestContext& ctx) {
 | 
			
		|||
    LOG_WARNING(Service_FS, "(STUBBED) File command OpenLinkFile {}", GetName());
 | 
			
		||||
    using Kernel::ClientSession;
 | 
			
		||||
    using Kernel::ServerSession;
 | 
			
		||||
    using Kernel::SharedPtr;
 | 
			
		||||
    IPC::RequestParser rp(ctx, 0x080C, 0, 0);
 | 
			
		||||
    IPC::RequestBuilder rb = rp.MakeBuilder(1, 2);
 | 
			
		||||
    auto sessions = system.Kernel().CreateSessionPair(GetName());
 | 
			
		||||
    auto server = std::get<SharedPtr<ServerSession>>(sessions);
 | 
			
		||||
    auto server = std::get<std::shared_ptr<ServerSession>>(sessions);
 | 
			
		||||
    ClientConnected(server);
 | 
			
		||||
 | 
			
		||||
    FileSessionSlot* slot = GetSessionData(server);
 | 
			
		||||
| 
						 | 
				
			
			@ -211,7 +211,7 @@ void File::OpenLinkFile(Kernel::HLERequestContext& ctx) {
 | 
			
		|||
    slot->subfile = false;
 | 
			
		||||
 | 
			
		||||
    rb.Push(RESULT_SUCCESS);
 | 
			
		||||
    rb.PushMoveObjects(std::get<SharedPtr<ClientSession>>(sessions));
 | 
			
		||||
    rb.PushMoveObjects(std::get<std::shared_ptr<ClientSession>>(sessions));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void File::OpenSubFile(Kernel::HLERequestContext& ctx) {
 | 
			
		||||
| 
						 | 
				
			
			@ -245,9 +245,8 @@ void File::OpenSubFile(Kernel::HLERequestContext& ctx) {
 | 
			
		|||
 | 
			
		||||
    using Kernel::ClientSession;
 | 
			
		||||
    using Kernel::ServerSession;
 | 
			
		||||
    using Kernel::SharedPtr;
 | 
			
		||||
    auto sessions = system.Kernel().CreateSessionPair(GetName());
 | 
			
		||||
    auto server = std::get<SharedPtr<ServerSession>>(sessions);
 | 
			
		||||
    auto server = std::get<std::shared_ptr<ServerSession>>(sessions);
 | 
			
		||||
    ClientConnected(server);
 | 
			
		||||
 | 
			
		||||
    FileSessionSlot* slot = GetSessionData(server);
 | 
			
		||||
| 
						 | 
				
			
			@ -257,12 +256,12 @@ void File::OpenSubFile(Kernel::HLERequestContext& ctx) {
 | 
			
		|||
    slot->subfile = true;
 | 
			
		||||
 | 
			
		||||
    rb.Push(RESULT_SUCCESS);
 | 
			
		||||
    rb.PushMoveObjects(std::get<SharedPtr<ClientSession>>(sessions));
 | 
			
		||||
    rb.PushMoveObjects(std::get<std::shared_ptr<ClientSession>>(sessions));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Kernel::SharedPtr<Kernel::ClientSession> File::Connect() {
 | 
			
		||||
std::shared_ptr<Kernel::ClientSession> File::Connect() {
 | 
			
		||||
    auto sessions = system.Kernel().CreateSessionPair(GetName());
 | 
			
		||||
    auto server = std::get<Kernel::SharedPtr<Kernel::ServerSession>>(sessions);
 | 
			
		||||
    auto server = std::get<std::shared_ptr<Kernel::ServerSession>>(sessions);
 | 
			
		||||
    ClientConnected(server);
 | 
			
		||||
 | 
			
		||||
    FileSessionSlot* slot = GetSessionData(server);
 | 
			
		||||
| 
						 | 
				
			
			@ -271,16 +270,16 @@ Kernel::SharedPtr<Kernel::ClientSession> File::Connect() {
 | 
			
		|||
    slot->size = backend->GetSize();
 | 
			
		||||
    slot->subfile = false;
 | 
			
		||||
 | 
			
		||||
    return std::get<Kernel::SharedPtr<Kernel::ClientSession>>(sessions);
 | 
			
		||||
    return std::get<std::shared_ptr<Kernel::ClientSession>>(sessions);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::size_t File::GetSessionFileOffset(Kernel::SharedPtr<Kernel::ServerSession> session) {
 | 
			
		||||
std::size_t File::GetSessionFileOffset(std::shared_ptr<Kernel::ServerSession> session) {
 | 
			
		||||
    const FileSessionSlot* slot = GetSessionData(session);
 | 
			
		||||
    ASSERT(slot);
 | 
			
		||||
    return slot->offset;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::size_t File::GetSessionFileSize(Kernel::SharedPtr<Kernel::ServerSession> session) {
 | 
			
		||||
std::size_t File::GetSessionFileSize(std::shared_ptr<Kernel::ServerSession> session) {
 | 
			
		||||
    const FileSessionSlot* slot = GetSessionData(session);
 | 
			
		||||
    ASSERT(slot);
 | 
			
		||||
    return slot->size;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,8 +4,8 @@
 | 
			
		|||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <memory>
 | 
			
		||||
#include "core/file_sys/archive_backend.h"
 | 
			
		||||
#include "core/hle/kernel/kernel.h"
 | 
			
		||||
#include "core/hle/service/service.h"
 | 
			
		||||
 | 
			
		||||
namespace Core {
 | 
			
		||||
| 
						 | 
				
			
			@ -37,15 +37,15 @@ public:
 | 
			
		|||
    std::unique_ptr<FileSys::FileBackend> backend; ///< File backend interface
 | 
			
		||||
 | 
			
		||||
    /// Creates a new session to this File and returns the ClientSession part of the connection.
 | 
			
		||||
    Kernel::SharedPtr<Kernel::ClientSession> Connect();
 | 
			
		||||
    std::shared_ptr<Kernel::ClientSession> Connect();
 | 
			
		||||
 | 
			
		||||
    // Returns the start offset of an open file represented by the input session, opened with
 | 
			
		||||
    // OpenSubFile.
 | 
			
		||||
    std::size_t GetSessionFileOffset(Kernel::SharedPtr<Kernel::ServerSession> session);
 | 
			
		||||
    std::size_t GetSessionFileOffset(std::shared_ptr<Kernel::ServerSession> session);
 | 
			
		||||
 | 
			
		||||
    // Returns the size of an open file represented by the input session, opened with
 | 
			
		||||
    // OpenSubFile.
 | 
			
		||||
    std::size_t GetSessionFileSize(Kernel::SharedPtr<Kernel::ServerSession> session);
 | 
			
		||||
    std::size_t GetSessionFileSize(std::shared_ptr<Kernel::ServerSession> session);
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    void Read(Kernel::HLERequestContext& ctx);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -30,7 +30,6 @@
 | 
			
		|||
 | 
			
		||||
using Kernel::ClientSession;
 | 
			
		||||
using Kernel::ServerSession;
 | 
			
		||||
using Kernel::SharedPtr;
 | 
			
		||||
 | 
			
		||||
namespace Service::FS {
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -72,12 +71,13 @@ void FS_USER::OpenFile(Kernel::HLERequestContext& ctx) {
 | 
			
		|||
        LOG_ERROR(Service_FS, "failed to get a handle for file {}", file_path.DebugStr());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ctx.SleepClientThread(
 | 
			
		||||
        system.Kernel().GetThreadManager().GetCurrentThread(), "fs_user::open", open_timeout_ns,
 | 
			
		||||
        [](Kernel::SharedPtr<Kernel::Thread> /*thread*/, Kernel::HLERequestContext& /*ctx*/,
 | 
			
		||||
           Kernel::ThreadWakeupReason /*reason*/) {
 | 
			
		||||
            // Nothing to do here
 | 
			
		||||
        });
 | 
			
		||||
    ctx.SleepClientThread(Kernel::SharedFrom(system.Kernel().GetThreadManager().GetCurrentThread()),
 | 
			
		||||
                          "fs_user::open", open_timeout_ns,
 | 
			
		||||
                          [](std::shared_ptr<Kernel::Thread> /*thread*/,
 | 
			
		||||
                             Kernel::HLERequestContext& /*ctx*/,
 | 
			
		||||
                             Kernel::ThreadWakeupReason /*reason*/) {
 | 
			
		||||
                              // Nothing to do here
 | 
			
		||||
                          });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void FS_USER::OpenFileDirectly(Kernel::HLERequestContext& ctx) {
 | 
			
		||||
| 
						 | 
				
			
			@ -130,9 +130,9 @@ void FS_USER::OpenFileDirectly(Kernel::HLERequestContext& ctx) {
 | 
			
		|||
                  file_path.DebugStr(), mode.hex, attributes);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ctx.SleepClientThread(system.Kernel().GetThreadManager().GetCurrentThread(),
 | 
			
		||||
    ctx.SleepClientThread(Kernel::SharedFrom(system.Kernel().GetThreadManager().GetCurrentThread()),
 | 
			
		||||
                          "fs_user::open_directly", open_timeout_ns,
 | 
			
		||||
                          [](Kernel::SharedPtr<Kernel::Thread> /*thread*/,
 | 
			
		||||
                          [](std::shared_ptr<Kernel::Thread> /*thread*/,
 | 
			
		||||
                             Kernel::HLERequestContext& /*ctx*/,
 | 
			
		||||
                             Kernel::ThreadWakeupReason /*reason*/) {
 | 
			
		||||
                              // Nothing to do here
 | 
			
		||||
| 
						 | 
				
			
			@ -309,8 +309,8 @@ void FS_USER::OpenDirectory(Kernel::HLERequestContext& ctx) {
 | 
			
		|||
    if (dir_res.Succeeded()) {
 | 
			
		||||
        std::shared_ptr<Directory> directory = *dir_res;
 | 
			
		||||
        auto sessions = system.Kernel().CreateSessionPair(directory->GetName());
 | 
			
		||||
        directory->ClientConnected(std::get<SharedPtr<ServerSession>>(sessions));
 | 
			
		||||
        rb.PushMoveObjects(std::get<SharedPtr<ClientSession>>(sessions));
 | 
			
		||||
        directory->ClientConnected(std::get<std::shared_ptr<ServerSession>>(sessions));
 | 
			
		||||
        rb.PushMoveObjects(std::get<std::shared_ptr<ClientSession>>(sessions));
 | 
			
		||||
    } else {
 | 
			
		||||
        LOG_ERROR(Service_FS, "failed to get a handle for directory type={} size={} data={}",
 | 
			
		||||
                  static_cast<u32>(dirname_type), dirname_size, dir_path.DebugStr());
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -88,7 +88,7 @@ static u32 GetUnusedThreadId() {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
/// Gets a pointer to a thread command buffer in GSP shared memory
 | 
			
		||||
static inline u8* GetCommandBuffer(Kernel::SharedPtr<Kernel::SharedMemory> shared_memory,
 | 
			
		||||
static inline u8* GetCommandBuffer(std::shared_ptr<Kernel::SharedMemory> shared_memory,
 | 
			
		||||
                                   u32 thread_id) {
 | 
			
		||||
    return shared_memory->GetPointer(0x800 + (thread_id * sizeof(CommandBuffer)));
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -104,12 +104,12 @@ FrameBufferUpdate* GSP_GPU::GetFrameBufferInfo(u32 thread_id, u32 screen_index)
 | 
			
		|||
 | 
			
		||||
/// Gets a pointer to the interrupt relay queue for a given thread index
 | 
			
		||||
static inline InterruptRelayQueue* GetInterruptRelayQueue(
 | 
			
		||||
    Kernel::SharedPtr<Kernel::SharedMemory> shared_memory, u32 thread_id) {
 | 
			
		||||
    std::shared_ptr<Kernel::SharedMemory> shared_memory, u32 thread_id) {
 | 
			
		||||
    u8* ptr = shared_memory->GetPointer(sizeof(InterruptRelayQueue) * thread_id);
 | 
			
		||||
    return reinterpret_cast<InterruptRelayQueue*>(ptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void GSP_GPU::ClientDisconnected(Kernel::SharedPtr<Kernel::ServerSession> server_session) {
 | 
			
		||||
void GSP_GPU::ClientDisconnected(std::shared_ptr<Kernel::ServerSession> server_session) {
 | 
			
		||||
    SessionData* session_data = GetSessionData(server_session);
 | 
			
		||||
    if (active_thread_id == session_data->thread_id)
 | 
			
		||||
        ReleaseRight(session_data);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,6 +5,7 @@
 | 
			
		|||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <cstddef>
 | 
			
		||||
#include <memory>
 | 
			
		||||
#include <string>
 | 
			
		||||
#include "common/bit_field.h"
 | 
			
		||||
#include "common/common_types.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -187,7 +188,7 @@ struct SessionData : public Kernel::SessionRequestHandler::SessionDataBase {
 | 
			
		|||
    ~SessionData();
 | 
			
		||||
 | 
			
		||||
    /// Event triggered when GSP interrupt has been signalled
 | 
			
		||||
    Kernel::SharedPtr<Kernel::Event> interrupt_event;
 | 
			
		||||
    std::shared_ptr<Kernel::Event> interrupt_event;
 | 
			
		||||
    /// Thread index into interrupt relay queue
 | 
			
		||||
    u32 thread_id;
 | 
			
		||||
    /// Whether RegisterInterruptRelayQueue was called for this session
 | 
			
		||||
| 
						 | 
				
			
			@ -199,7 +200,7 @@ public:
 | 
			
		|||
    explicit GSP_GPU(Core::System& system);
 | 
			
		||||
    ~GSP_GPU() = default;
 | 
			
		||||
 | 
			
		||||
    void ClientDisconnected(Kernel::SharedPtr<Kernel::ServerSession> server_session) override;
 | 
			
		||||
    void ClientDisconnected(std::shared_ptr<Kernel::ServerSession> server_session) override;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Signals that the specified interrupt type has occurred to userland code
 | 
			
		||||
| 
						 | 
				
			
			@ -406,7 +407,7 @@ private:
 | 
			
		|||
    Core::System& system;
 | 
			
		||||
 | 
			
		||||
    /// GSP shared memory
 | 
			
		||||
    Kernel::SharedPtr<Kernel::SharedMemory> shared_memory;
 | 
			
		||||
    std::shared_ptr<Kernel::SharedMemory> shared_memory;
 | 
			
		||||
 | 
			
		||||
    /// Thread id that currently has GPU rights or -1 if none.
 | 
			
		||||
    int active_thread_id = -1;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,7 +14,6 @@
 | 
			
		|||
#include "common/common_funcs.h"
 | 
			
		||||
#include "common/common_types.h"
 | 
			
		||||
#include "core/frontend/input.h"
 | 
			
		||||
#include "core/hle/kernel/kernel.h"
 | 
			
		||||
#include "core/hle/service/service.h"
 | 
			
		||||
#include "core/settings.h"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -312,14 +311,14 @@ private:
 | 
			
		|||
    Core::System& system;
 | 
			
		||||
 | 
			
		||||
    // Handle to shared memory region designated to HID_User service
 | 
			
		||||
    Kernel::SharedPtr<Kernel::SharedMemory> shared_mem;
 | 
			
		||||
    std::shared_ptr<Kernel::SharedMemory> shared_mem;
 | 
			
		||||
 | 
			
		||||
    // Event handles
 | 
			
		||||
    Kernel::SharedPtr<Kernel::Event> event_pad_or_touch_1;
 | 
			
		||||
    Kernel::SharedPtr<Kernel::Event> event_pad_or_touch_2;
 | 
			
		||||
    Kernel::SharedPtr<Kernel::Event> event_accelerometer;
 | 
			
		||||
    Kernel::SharedPtr<Kernel::Event> event_gyroscope;
 | 
			
		||||
    Kernel::SharedPtr<Kernel::Event> event_debug_pad;
 | 
			
		||||
    std::shared_ptr<Kernel::Event> event_pad_or_touch_1;
 | 
			
		||||
    std::shared_ptr<Kernel::Event> event_pad_or_touch_2;
 | 
			
		||||
    std::shared_ptr<Kernel::Event> event_accelerometer;
 | 
			
		||||
    std::shared_ptr<Kernel::Event> event_gyroscope;
 | 
			
		||||
    std::shared_ptr<Kernel::Event> event_debug_pad;
 | 
			
		||||
 | 
			
		||||
    // The HID module of a 3DS does not store the PadState.
 | 
			
		||||
    // Storing this here was necessary for emulation specific tasks like cheats or scripting.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -265,7 +265,7 @@ private:
 | 
			
		|||
 | 
			
		||||
    void DecryptClCertA();
 | 
			
		||||
 | 
			
		||||
    Kernel::SharedPtr<Kernel::SharedMemory> shared_memory = nullptr;
 | 
			
		||||
    std::shared_ptr<Kernel::SharedMemory> shared_memory = nullptr;
 | 
			
		||||
 | 
			
		||||
    /// The next number to use when a new HTTP session is initalized.
 | 
			
		||||
    u32 session_counter = 0;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,7 +10,6 @@
 | 
			
		|||
#include "common/common_types.h"
 | 
			
		||||
#include "common/swap.h"
 | 
			
		||||
#include "core/frontend/input.h"
 | 
			
		||||
#include "core/hle/kernel/kernel.h"
 | 
			
		||||
#include "core/hle/service/service.h"
 | 
			
		||||
 | 
			
		||||
namespace Kernel {
 | 
			
		||||
| 
						 | 
				
			
			@ -78,8 +77,8 @@ private:
 | 
			
		|||
    void UpdateCallback(u64 userdata, s64 cycles_late);
 | 
			
		||||
 | 
			
		||||
    Core::System& system;
 | 
			
		||||
    Kernel::SharedPtr<Kernel::Event> update_event;
 | 
			
		||||
    Kernel::SharedPtr<Kernel::SharedMemory> shared_memory;
 | 
			
		||||
    std::shared_ptr<Kernel::Event> update_event;
 | 
			
		||||
    std::shared_ptr<Kernel::SharedMemory> shared_memory;
 | 
			
		||||
    u32 next_pad_index{0};
 | 
			
		||||
    Core::TimingEventType* update_callback_id;
 | 
			
		||||
    std::unique_ptr<Input::ButtonDevice> zl_button;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -66,7 +66,7 @@ static_assert(sizeof(SharedMemoryHeader) == 16, "SharedMemoryHeader has wrong si
 | 
			
		|||
 */
 | 
			
		||||
class BufferManager {
 | 
			
		||||
public:
 | 
			
		||||
    BufferManager(Kernel::SharedPtr<Kernel::SharedMemory> shared_memory_, u32 info_offset_,
 | 
			
		||||
    BufferManager(std::shared_ptr<Kernel::SharedMemory> shared_memory_, u32 info_offset_,
 | 
			
		||||
                  u32 buffer_offset_, u32 max_packet_count_, u32 buffer_size)
 | 
			
		||||
        : shared_memory(shared_memory_), info_offset(info_offset_), buffer_offset(buffer_offset_),
 | 
			
		||||
          max_packet_count(max_packet_count_),
 | 
			
		||||
| 
						 | 
				
			
			@ -174,7 +174,7 @@ private:
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    BufferInfo info{0, 0, 0, 0};
 | 
			
		||||
    Kernel::SharedPtr<Kernel::SharedMemory> shared_memory;
 | 
			
		||||
    std::shared_ptr<Kernel::SharedMemory> shared_memory;
 | 
			
		||||
    u32 info_offset;
 | 
			
		||||
    u32 buffer_offset;
 | 
			
		||||
    u32 max_packet_count;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -162,8 +162,8 @@ private:
 | 
			
		|||
 | 
			
		||||
    void PutToReceive(const std::vector<u8>& payload);
 | 
			
		||||
 | 
			
		||||
    Kernel::SharedPtr<Kernel::Event> conn_status_event, send_event, receive_event;
 | 
			
		||||
    Kernel::SharedPtr<Kernel::SharedMemory> shared_memory;
 | 
			
		||||
    std::shared_ptr<Kernel::Event> conn_status_event, send_event, receive_event;
 | 
			
		||||
    std::shared_ptr<Kernel::SharedMemory> shared_memory;
 | 
			
		||||
    IRDevice* connected_device{nullptr};
 | 
			
		||||
    std::unique_ptr<BufferManager> receive_buffer;
 | 
			
		||||
    std::unique_ptr<ExtraHID> extra_hid;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -354,9 +354,9 @@ struct MIC_U::Impl {
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    std::atomic<bool> change_mic_impl_requested = false;
 | 
			
		||||
    Kernel::SharedPtr<Kernel::Event> buffer_full_event;
 | 
			
		||||
    std::shared_ptr<Kernel::Event> buffer_full_event;
 | 
			
		||||
    Core::TimingEventType* buffer_write_event = nullptr;
 | 
			
		||||
    Kernel::SharedPtr<Kernel::SharedMemory> shared_memory;
 | 
			
		||||
    std::shared_ptr<Kernel::SharedMemory> shared_memory;
 | 
			
		||||
    u32 client_version = 0;
 | 
			
		||||
    bool allow_shell_closed = false;
 | 
			
		||||
    bool clamp = false;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,7 +7,6 @@
 | 
			
		|||
#include <atomic>
 | 
			
		||||
#include <memory>
 | 
			
		||||
#include "common/common_types.h"
 | 
			
		||||
#include "core/hle/kernel/kernel.h"
 | 
			
		||||
#include "core/hle/service/service.h"
 | 
			
		||||
 | 
			
		||||
namespace Core {
 | 
			
		||||
| 
						 | 
				
			
			@ -232,8 +231,8 @@ public:
 | 
			
		|||
    };
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    Kernel::SharedPtr<Kernel::Event> tag_in_range_event;
 | 
			
		||||
    Kernel::SharedPtr<Kernel::Event> tag_out_of_range_event;
 | 
			
		||||
    std::shared_ptr<Kernel::Event> tag_in_range_event;
 | 
			
		||||
    std::shared_ptr<Kernel::Event> tag_out_of_range_event;
 | 
			
		||||
    std::atomic<TagState> nfc_tag_state = TagState::NotInitialized;
 | 
			
		||||
    CommunicationStatus nfc_status = CommunicationStatus::NfcInitialized;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,6 +4,7 @@
 | 
			
		|||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <memory>
 | 
			
		||||
#include "core/hle/service/service.h"
 | 
			
		||||
 | 
			
		||||
namespace Core {
 | 
			
		||||
| 
						 | 
				
			
			@ -39,7 +40,7 @@ private:
 | 
			
		|||
     */
 | 
			
		||||
    void CheckSysUpdateAvailable(Kernel::HLERequestContext& ctx);
 | 
			
		||||
 | 
			
		||||
    Kernel::SharedPtr<Kernel::Event> nim_system_update_event;
 | 
			
		||||
    std::shared_ptr<Kernel::Event> nim_system_update_event;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace Service::NIM
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,7 +11,7 @@
 | 
			
		|||
 | 
			
		||||
namespace Service::NS {
 | 
			
		||||
 | 
			
		||||
Kernel::SharedPtr<Kernel::Process> LaunchTitle(FS::MediaType media_type, u64 title_id) {
 | 
			
		||||
std::shared_ptr<Kernel::Process> LaunchTitle(FS::MediaType media_type, u64 title_id) {
 | 
			
		||||
    std::string path = AM::GetTitleContentPath(media_type, title_id);
 | 
			
		||||
    auto loader = Loader::GetLoader(path);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -20,7 +20,7 @@ Kernel::SharedPtr<Kernel::Process> LaunchTitle(FS::MediaType media_type, u64 tit
 | 
			
		|||
        return nullptr;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Kernel::SharedPtr<Kernel::Process> process;
 | 
			
		||||
    std::shared_ptr<Kernel::Process> process;
 | 
			
		||||
    Loader::ResultStatus result = loader->Load(process);
 | 
			
		||||
 | 
			
		||||
    if (result != Loader::ResultStatus::Success) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,6 +4,7 @@
 | 
			
		|||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <memory>
 | 
			
		||||
#include "core/hle/kernel/process.h"
 | 
			
		||||
#include "core/hle/service/fs/archive.h"
 | 
			
		||||
#include "core/hle/service/service.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -15,7 +16,7 @@ class System;
 | 
			
		|||
namespace Service::NS {
 | 
			
		||||
 | 
			
		||||
/// Loads and launches the title identified by title_id in the specified media type.
 | 
			
		||||
Kernel::SharedPtr<Kernel::Process> LaunchTitle(FS::MediaType media_type, u64 title_id);
 | 
			
		||||
std::shared_ptr<Kernel::Process> LaunchTitle(FS::MediaType media_type, u64 title_id);
 | 
			
		||||
 | 
			
		||||
/// Registers all NS services with the specified service manager.
 | 
			
		||||
void InstallInterfaces(Core::System& system);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,7 +4,6 @@
 | 
			
		|||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include "core/hle/kernel/kernel.h"
 | 
			
		||||
#include "core/hle/service/service.h"
 | 
			
		||||
 | 
			
		||||
namespace Service::NS {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -568,7 +568,7 @@ void NWM_UDS::RecvBeaconBroadcastData(Kernel::HLERequestContext& ctx) {
 | 
			
		|||
    // 'Official user processes create a new event handle which is then passed to this command.
 | 
			
		||||
    // However, those user processes don't save that handle anywhere afterwards.'
 | 
			
		||||
    // So we don't save/use that event too.
 | 
			
		||||
    Kernel::SharedPtr<Kernel::Event> input_event = rp.PopObject<Kernel::Event>();
 | 
			
		||||
    std::shared_ptr<Kernel::Event> input_event = rp.PopObject<Kernel::Event>();
 | 
			
		||||
 | 
			
		||||
    Kernel::MappedBuffer out_buffer = rp.PopMappedBuffer();
 | 
			
		||||
    ASSERT(out_buffer.GetSize() == out_buffer_size);
 | 
			
		||||
| 
						 | 
				
			
			@ -615,9 +615,9 @@ void NWM_UDS::RecvBeaconBroadcastData(Kernel::HLERequestContext& ctx) {
 | 
			
		|||
              out_buffer_size, wlan_comm_id, id, unk1, unk2, cur_buffer_size);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ResultVal<Kernel::SharedPtr<Kernel::Event>> NWM_UDS::Initialize(
 | 
			
		||||
ResultVal<std::shared_ptr<Kernel::Event>> NWM_UDS::Initialize(
 | 
			
		||||
    u32 sharedmem_size, const NodeInfo& node, u16 version,
 | 
			
		||||
    Kernel::SharedPtr<Kernel::SharedMemory> sharedmem) {
 | 
			
		||||
    std::shared_ptr<Kernel::SharedMemory> sharedmem) {
 | 
			
		||||
 | 
			
		||||
    current_node = node;
 | 
			
		||||
    initialized = true;
 | 
			
		||||
| 
						 | 
				
			
			@ -1179,9 +1179,9 @@ void NWM_UDS::ConnectToNetwork(Kernel::HLERequestContext& ctx, u16 command_id,
 | 
			
		|||
    static constexpr std::chrono::nanoseconds UDSConnectionTimeout{300000000};
 | 
			
		||||
 | 
			
		||||
    connection_event = ctx.SleepClientThread(
 | 
			
		||||
        system.Kernel().GetThreadManager().GetCurrentThread(), "uds::ConnectToNetwork",
 | 
			
		||||
        UDSConnectionTimeout,
 | 
			
		||||
        [command_id](Kernel::SharedPtr<Kernel::Thread> thread, Kernel::HLERequestContext& ctx,
 | 
			
		||||
        Kernel::SharedFrom(system.Kernel().GetThreadManager().GetCurrentThread()),
 | 
			
		||||
        "uds::ConnectToNetwork", UDSConnectionTimeout,
 | 
			
		||||
        [command_id](std::shared_ptr<Kernel::Thread> thread, Kernel::HLERequestContext& ctx,
 | 
			
		||||
                     Kernel::ThreadWakeupReason reason) {
 | 
			
		||||
            // TODO(B3N30): Add error handling for host full and timeout
 | 
			
		||||
            IPC::RequestBuilder rb(ctx, command_id, 1, 0);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,13 +10,13 @@
 | 
			
		|||
#include <deque>
 | 
			
		||||
#include <list>
 | 
			
		||||
#include <map>
 | 
			
		||||
#include <memory>
 | 
			
		||||
#include <mutex>
 | 
			
		||||
#include <unordered_map>
 | 
			
		||||
#include <vector>
 | 
			
		||||
#include <boost/optional.hpp>
 | 
			
		||||
#include "common/common_types.h"
 | 
			
		||||
#include "common/swap.h"
 | 
			
		||||
#include "core/hle/kernel/kernel.h"
 | 
			
		||||
#include "core/hle/service/service.h"
 | 
			
		||||
#include "network/network.h"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -416,9 +416,9 @@ private:
 | 
			
		|||
    template <u16 command_id>
 | 
			
		||||
    void DecryptBeaconData(Kernel::HLERequestContext& ctx);
 | 
			
		||||
 | 
			
		||||
    ResultVal<Kernel::SharedPtr<Kernel::Event>> Initialize(
 | 
			
		||||
    ResultVal<std::shared_ptr<Kernel::Event>> Initialize(
 | 
			
		||||
        u32 sharedmem_size, const NodeInfo& node, u16 version,
 | 
			
		||||
        Kernel::SharedPtr<Kernel::SharedMemory> sharedmem);
 | 
			
		||||
        std::shared_ptr<Kernel::SharedMemory> sharedmem);
 | 
			
		||||
 | 
			
		||||
    ResultCode BeginHostingNetwork(const u8* network_info_buffer, std::size_t network_info_size,
 | 
			
		||||
                                   std::vector<u8> passphrase);
 | 
			
		||||
| 
						 | 
				
			
			@ -477,11 +477,11 @@ private:
 | 
			
		|||
    boost::optional<Network::MacAddress> GetNodeMacAddress(u16 dest_node_id, u8 flags);
 | 
			
		||||
 | 
			
		||||
    // Event that is signaled every time the connection status changes.
 | 
			
		||||
    Kernel::SharedPtr<Kernel::Event> connection_status_event;
 | 
			
		||||
    std::shared_ptr<Kernel::Event> connection_status_event;
 | 
			
		||||
 | 
			
		||||
    // Shared memory provided by the application to store the receive buffer.
 | 
			
		||||
    // This is not currently used.
 | 
			
		||||
    Kernel::SharedPtr<Kernel::SharedMemory> recv_buffer_memory;
 | 
			
		||||
    std::shared_ptr<Kernel::SharedMemory> recv_buffer_memory;
 | 
			
		||||
 | 
			
		||||
    // Connection status of this 3DS.
 | 
			
		||||
    ConnectionStatus connection_status{};
 | 
			
		||||
| 
						 | 
				
			
			@ -503,7 +503,7 @@ private:
 | 
			
		|||
        u8 channel;          ///< Channel that this bind node was bound to.
 | 
			
		||||
        u16 network_node_id; ///< Node id this bind node is associated with, only packets from this
 | 
			
		||||
                             /// network node will be received.
 | 
			
		||||
        Kernel::SharedPtr<Kernel::Event> event;       ///< Receive event for this bind node.
 | 
			
		||||
        std::shared_ptr<Kernel::Event> event;         ///< Receive event for this bind node.
 | 
			
		||||
        std::deque<std::vector<u8>> received_packets; ///< List of packets received on this channel.
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -535,7 +535,7 @@ private:
 | 
			
		|||
    // network thread.
 | 
			
		||||
    std::mutex connection_status_mutex;
 | 
			
		||||
 | 
			
		||||
    Kernel::SharedPtr<Kernel::Event> connection_event;
 | 
			
		||||
    std::shared_ptr<Kernel::Event> connection_event;
 | 
			
		||||
 | 
			
		||||
    // Mutex to synchronize access to the list of received beacons between the emulation thread and
 | 
			
		||||
    // the network thread.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,7 +4,6 @@
 | 
			
		|||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include "core/hle/kernel/kernel.h"
 | 
			
		||||
#include "core/hle/service/service.h"
 | 
			
		||||
 | 
			
		||||
namespace Service::PXI {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -197,7 +197,7 @@ static bool AttemptLLE(const ServiceModuleInfo& service_module) {
 | 
			
		|||
                  service_module.name);
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
    Kernel::SharedPtr<Kernel::Process> process;
 | 
			
		||||
    std::shared_ptr<Kernel::Process> process;
 | 
			
		||||
    loader->Load(process);
 | 
			
		||||
    LOG_DEBUG(Service, "Service module \"{}\" has been successfully loaded.", service_module.name);
 | 
			
		||||
    return true;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,6 +7,7 @@
 | 
			
		|||
#include <array>
 | 
			
		||||
#include <cstddef>
 | 
			
		||||
#include <functional>
 | 
			
		||||
#include <memory>
 | 
			
		||||
#include <string>
 | 
			
		||||
#include <boost/container/flat_map.hpp>
 | 
			
		||||
#include "common/common_types.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -159,7 +160,7 @@ protected:
 | 
			
		|||
        return std::make_unique<SessionData>();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    SessionData* GetSessionData(Kernel::SharedPtr<Kernel::ServerSession> server_session) {
 | 
			
		||||
    SessionData* GetSessionData(std::shared_ptr<Kernel::ServerSession> server_session) {
 | 
			
		||||
        return ServiceFrameworkBase::GetSessionData<SessionData>(server_session);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -32,7 +32,7 @@ void ServiceManager::InstallInterfaces(Core::System& system) {
 | 
			
		|||
    system.ServiceManager().srv_interface = srv;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ResultVal<Kernel::SharedPtr<Kernel::ServerPort>> ServiceManager::RegisterService(
 | 
			
		||||
ResultVal<std::shared_ptr<Kernel::ServerPort>> ServiceManager::RegisterService(
 | 
			
		||||
    std::string name, unsigned int max_sessions) {
 | 
			
		||||
 | 
			
		||||
    CASCADE_CODE(ValidateServiceName(name));
 | 
			
		||||
| 
						 | 
				
			
			@ -46,7 +46,7 @@ ResultVal<Kernel::SharedPtr<Kernel::ServerPort>> ServiceManager::RegisterService
 | 
			
		|||
    return MakeResult(std::move(server_port));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ResultVal<Kernel::SharedPtr<Kernel::ClientPort>> ServiceManager::GetServicePort(
 | 
			
		||||
ResultVal<std::shared_ptr<Kernel::ClientPort>> ServiceManager::GetServicePort(
 | 
			
		||||
    const std::string& name) {
 | 
			
		||||
 | 
			
		||||
    CASCADE_CODE(ValidateServiceName(name));
 | 
			
		||||
| 
						 | 
				
			
			@ -58,7 +58,7 @@ ResultVal<Kernel::SharedPtr<Kernel::ClientPort>> ServiceManager::GetServicePort(
 | 
			
		|||
    return MakeResult(it->second);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ResultVal<Kernel::SharedPtr<Kernel::ClientSession>> ServiceManager::ConnectToService(
 | 
			
		||||
ResultVal<std::shared_ptr<Kernel::ClientSession>> ServiceManager::ConnectToService(
 | 
			
		||||
    const std::string& name) {
 | 
			
		||||
 | 
			
		||||
    CASCADE_RESULT(auto client_port, GetServicePort(name));
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -47,10 +47,10 @@ public:
 | 
			
		|||
 | 
			
		||||
    explicit ServiceManager(Core::System& system);
 | 
			
		||||
 | 
			
		||||
    ResultVal<Kernel::SharedPtr<Kernel::ServerPort>> RegisterService(std::string name,
 | 
			
		||||
                                                                     unsigned int max_sessions);
 | 
			
		||||
    ResultVal<Kernel::SharedPtr<Kernel::ClientPort>> GetServicePort(const std::string& name);
 | 
			
		||||
    ResultVal<Kernel::SharedPtr<Kernel::ClientSession>> ConnectToService(const std::string& name);
 | 
			
		||||
    ResultVal<std::shared_ptr<Kernel::ServerPort>> RegisterService(std::string name,
 | 
			
		||||
                                                                   unsigned int max_sessions);
 | 
			
		||||
    ResultVal<std::shared_ptr<Kernel::ClientPort>> GetServicePort(const std::string& name);
 | 
			
		||||
    ResultVal<std::shared_ptr<Kernel::ClientSession>> ConnectToService(const std::string& name);
 | 
			
		||||
 | 
			
		||||
    template <typename T>
 | 
			
		||||
    std::shared_ptr<T> GetService(const std::string& service_name) const {
 | 
			
		||||
| 
						 | 
				
			
			@ -73,7 +73,7 @@ private:
 | 
			
		|||
    std::weak_ptr<SRV> srv_interface;
 | 
			
		||||
 | 
			
		||||
    /// Map of registered services, retrieved using GetServicePort or ConnectToService.
 | 
			
		||||
    std::unordered_map<std::string, Kernel::SharedPtr<Kernel::ClientPort>> registered_services;
 | 
			
		||||
    std::unordered_map<std::string, std::shared_ptr<Kernel::ClientPort>> registered_services;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace Service::SM
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -100,7 +100,7 @@ void SRV::GetServiceHandle(Kernel::HLERequestContext& ctx) {
 | 
			
		|||
 | 
			
		||||
    // TODO(yuriks): Permission checks go here
 | 
			
		||||
 | 
			
		||||
    auto get_handle = [name, this](Kernel::SharedPtr<Kernel::Thread> thread,
 | 
			
		||||
    auto get_handle = [name, this](std::shared_ptr<Kernel::Thread> thread,
 | 
			
		||||
                                   Kernel::HLERequestContext& ctx,
 | 
			
		||||
                                   Kernel::ThreadWakeupReason reason) {
 | 
			
		||||
        LOG_ERROR(Service_SRV, "called service={} wakeup", name);
 | 
			
		||||
| 
						 | 
				
			
			@ -127,9 +127,9 @@ void SRV::GetServiceHandle(Kernel::HLERequestContext& ctx) {
 | 
			
		|||
    if (client_port.Failed()) {
 | 
			
		||||
        if (wait_until_available && client_port.Code() == ERR_SERVICE_NOT_REGISTERED) {
 | 
			
		||||
            LOG_INFO(Service_SRV, "called service={} delayed", name);
 | 
			
		||||
            Kernel::SharedPtr<Kernel::Event> get_service_handle_event =
 | 
			
		||||
                ctx.SleepClientThread(system.Kernel().GetThreadManager().GetCurrentThread(),
 | 
			
		||||
                                      "GetServiceHandle", std::chrono::nanoseconds(-1), get_handle);
 | 
			
		||||
            std::shared_ptr<Kernel::Event> get_service_handle_event = ctx.SleepClientThread(
 | 
			
		||||
                Kernel::SharedFrom(system.Kernel().GetThreadManager().GetCurrentThread()),
 | 
			
		||||
                "GetServiceHandle", std::chrono::nanoseconds(-1), get_handle);
 | 
			
		||||
            get_service_handle_delayed_map[name] = std::move(get_service_handle_event);
 | 
			
		||||
            return;
 | 
			
		||||
        } else {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,8 +4,8 @@
 | 
			
		|||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <memory>
 | 
			
		||||
#include <unordered_map>
 | 
			
		||||
#include "core/hle/kernel/kernel.h"
 | 
			
		||||
#include "core/hle/service/service.h"
 | 
			
		||||
 | 
			
		||||
namespace Core {
 | 
			
		||||
| 
						 | 
				
			
			@ -35,9 +35,8 @@ private:
 | 
			
		|||
    void RegisterService(Kernel::HLERequestContext& ctx);
 | 
			
		||||
 | 
			
		||||
    Core::System& system;
 | 
			
		||||
    Kernel::SharedPtr<Kernel::Semaphore> notification_semaphore;
 | 
			
		||||
    std::unordered_map<std::string, Kernel::SharedPtr<Kernel::Event>>
 | 
			
		||||
        get_service_handle_delayed_map;
 | 
			
		||||
    std::shared_ptr<Kernel::Semaphore> notification_semaphore;
 | 
			
		||||
    std::unordered_map<std::string, std::shared_ptr<Kernel::Event>> get_service_handle_delayed_map;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace Service::SM
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -8,7 +8,6 @@
 | 
			
		|||
#include <memory>
 | 
			
		||||
#include <string>
 | 
			
		||||
#include "common/common_types.h"
 | 
			
		||||
#include "core/hle/kernel/kernel.h"
 | 
			
		||||
#include "core/hle/result.h"
 | 
			
		||||
#include "core/hle/service/service.h"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -296,7 +295,7 @@ private:
 | 
			
		|||
 | 
			
		||||
    Core::System& system;
 | 
			
		||||
 | 
			
		||||
    Kernel::SharedPtr<Kernel::Event> completion_event;
 | 
			
		||||
    std::shared_ptr<Kernel::Event> completion_event;
 | 
			
		||||
    ConversionConfiguration conversion{};
 | 
			
		||||
    DitheringWeightParams dithering_weight_params{};
 | 
			
		||||
    bool temporal_dithering_enabled = false;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue