|
|
@ -40,7 +40,6 @@ private:
|
|
|
|
std::mutex m_session_mutex;
|
|
|
|
std::mutex m_session_mutex;
|
|
|
|
std::map<KServerSession*, std::shared_ptr<SessionRequestManager>> m_sessions;
|
|
|
|
std::map<KServerSession*, std::shared_ptr<SessionRequestManager>> m_sessions;
|
|
|
|
KEvent* m_wakeup_event;
|
|
|
|
KEvent* m_wakeup_event;
|
|
|
|
KProcess* m_process;
|
|
|
|
|
|
|
|
KThread* m_thread;
|
|
|
|
KThread* m_thread;
|
|
|
|
std::atomic<bool> m_shutdown_requested;
|
|
|
|
std::atomic<bool> m_shutdown_requested;
|
|
|
|
const std::string m_service_name;
|
|
|
|
const std::string m_service_name;
|
|
|
@ -180,39 +179,17 @@ ServiceThread::Impl::~Impl() {
|
|
|
|
|
|
|
|
|
|
|
|
// Close thread.
|
|
|
|
// Close thread.
|
|
|
|
m_thread->Close();
|
|
|
|
m_thread->Close();
|
|
|
|
|
|
|
|
|
|
|
|
// Close process.
|
|
|
|
|
|
|
|
m_process->Close();
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ServiceThread::Impl::Impl(KernelCore& kernel_, const std::string& service_name)
|
|
|
|
ServiceThread::Impl::Impl(KernelCore& kernel_, const std::string& service_name)
|
|
|
|
: kernel{kernel_}, m_service_name{service_name} {
|
|
|
|
: kernel{kernel_}, m_service_name{service_name} {
|
|
|
|
// Initialize process.
|
|
|
|
|
|
|
|
m_process = KProcess::Create(kernel);
|
|
|
|
|
|
|
|
KProcess::Initialize(m_process, kernel.System(), service_name,
|
|
|
|
|
|
|
|
KProcess::ProcessType::KernelInternal, kernel.GetSystemResourceLimit());
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Reserve a new event from the process resource limit
|
|
|
|
|
|
|
|
KScopedResourceReservation event_reservation(m_process, LimitableResource::EventCountMax);
|
|
|
|
|
|
|
|
ASSERT(event_reservation.Succeeded());
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Initialize event.
|
|
|
|
// Initialize event.
|
|
|
|
m_wakeup_event = KEvent::Create(kernel);
|
|
|
|
m_wakeup_event = KEvent::Create(kernel);
|
|
|
|
m_wakeup_event->Initialize(m_process);
|
|
|
|
m_wakeup_event->Initialize(nullptr);
|
|
|
|
|
|
|
|
|
|
|
|
// Commit the event reservation.
|
|
|
|
|
|
|
|
event_reservation.Commit();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Reserve a new thread from the process resource limit
|
|
|
|
|
|
|
|
KScopedResourceReservation thread_reservation(m_process, LimitableResource::ThreadCountMax);
|
|
|
|
|
|
|
|
ASSERT(thread_reservation.Succeeded());
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Initialize thread.
|
|
|
|
// Initialize thread.
|
|
|
|
m_thread = KThread::Create(kernel);
|
|
|
|
m_thread = KThread::Create(kernel);
|
|
|
|
ASSERT(KThread::InitializeDummyThread(m_thread, m_process).IsSuccess());
|
|
|
|
ASSERT(KThread::InitializeDummyThread(m_thread, nullptr).IsSuccess());
|
|
|
|
|
|
|
|
|
|
|
|
// Commit the thread reservation.
|
|
|
|
|
|
|
|
thread_reservation.Commit();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Start thread.
|
|
|
|
// Start thread.
|
|
|
|
m_host_thread = std::jthread([this] { LoopProcess(); });
|
|
|
|
m_host_thread = std::jthread([this] { LoopProcess(); });
|
|
|
|