new-ipc: implement deferral. sm now works.
This commit is contained in:
@@ -127,6 +127,10 @@ namespace sts::sf::hipc {
|
||||
|
||||
os::Mutex waitlist_mutex;
|
||||
os::WaitableManager waitlist;
|
||||
|
||||
os::Mutex deferred_session_mutex;
|
||||
using DeferredSessionList = typename util::IntrusiveListMemberTraits<&ServerSession::deferred_list_node>::ListType;
|
||||
DeferredSessionList deferred_session_list;
|
||||
private:
|
||||
virtual void RegisterSessionToWaitList(ServerSession *session) override final;
|
||||
void RegisterToWaitList(os::WaitableHolder *holder);
|
||||
@@ -138,6 +142,8 @@ namespace sts::sf::hipc {
|
||||
Result ProcessForMitmServer(os::WaitableHolder *holder);
|
||||
Result ProcessForSession(os::WaitableHolder *holder);
|
||||
|
||||
void ProcessDeferredSessions();
|
||||
|
||||
template<typename ServiceImpl, auto MakeShared = std::make_shared<ServiceImpl>>
|
||||
void RegisterServerImpl(Handle port_handle, sm::ServiceName service_name, bool managed, cmif::ServiceObjectHolder &&static_holder) {
|
||||
/* Allocate server memory. */
|
||||
|
||||
@@ -32,6 +32,7 @@ namespace sts::sf::hipc {
|
||||
NON_COPYABLE(ServerSession);
|
||||
NON_MOVEABLE(ServerSession);
|
||||
private:
|
||||
util::IntrusiveListNode deferred_list_node;
|
||||
cmif::ServiceObjectHolder srv_obj_holder;
|
||||
cmif::PointerAndSize pointer_buffer;
|
||||
cmif::PointerAndSize saved_message;
|
||||
|
||||
@@ -936,10 +936,15 @@ namespace sts::sf::impl {
|
||||
if constexpr (Info.arg_type == ArgumentType::InData) {
|
||||
/* New in rawdata. */
|
||||
constexpr size_t Offset = CommandMeta::InDataOffsets[Info.in_raw_data_index];
|
||||
return *reinterpret_cast<const T *>(in_raw_data.GetAddress() + Offset);
|
||||
if constexpr (!std::is_same<T, bool>::value) {
|
||||
return *reinterpret_cast<const T *>(in_raw_data.GetAddress() + Offset);
|
||||
} else {
|
||||
/* Special case bools. */
|
||||
return *reinterpret_cast<const u8 *>(in_raw_data.GetAddress() + Offset) & 1;
|
||||
}
|
||||
} else if constexpr (Info.arg_type == ArgumentType::OutData) {
|
||||
/* New out rawdata. */
|
||||
constexpr size_t Offset = CommandMeta::InDataOffsets[Info.in_raw_data_index];
|
||||
constexpr size_t Offset = CommandMeta::InDataOffsets[Info.out_raw_data_index];
|
||||
return T(out_raw_holder.template GetAddress<Offset, T::TypeSize>());
|
||||
} else if constexpr (Info.arg_type == ArgumentType::InHandle) {
|
||||
/* New InHandle. */
|
||||
|
||||
Reference in New Issue
Block a user