NVServices: Correct delayed responses.

This commit is contained in:
Fernando Sahmkow 2019-07-04 10:19:25 -04:00 committed by FernandoS27
parent 8c91d5c166
commit 0fc98958a3

View File

@ -46,32 +46,27 @@ void NVDRV::Ioctl(Kernel::HLERequestContext& ctx) {
u32 result = nvdrv->Ioctl(fd, command, ctx.ReadBuffer(), output, ctrl); u32 result = nvdrv->Ioctl(fd, command, ctx.ReadBuffer(), output, ctrl);
if (!ctrl.must_delay) { if (ctrl.must_delay) {
IPC::ResponseBuilder rb{ctx, 3}; ctrl.fresh_call = false;
rb.Push(RESULT_SUCCESS); ctx.SleepClientThread(
rb.Push(result); "NVServices::DelayedResponse", ctrl.timeout,
[=](Kernel::SharedPtr<Kernel::Thread> thread, Kernel::HLERequestContext& ctx,
Kernel::ThreadWakeupReason reason) {
IoctlCtrl ctrl2{ctrl};
std::vector<u8> output2 = output;
u32 result = nvdrv->Ioctl(fd, command, ctx.ReadBuffer(), output2, ctrl2);
ctx.WriteBuffer(output2);
IPC::ResponseBuilder rb{ctx, 3};
rb.Push(RESULT_SUCCESS);
rb.Push(result);
},
nvdrv->GetEventWriteable(ctrl.event_id));
} else {
ctx.WriteBuffer(output); ctx.WriteBuffer(output);
return;
} }
ctrl.fresh_call = false; IPC::ResponseBuilder rb{ctx, 3};
ctx.SleepClientThread( rb.Push(RESULT_SUCCESS);
"NVServices::DelayedResponse", ctrl.timeout, rb.Push(result);
[this, ctrl = ctrl](Kernel::SharedPtr<Kernel::Thread> thread,
Kernel::HLERequestContext& ctx, Kernel::ThreadWakeupReason reason) {
IPC::RequestParser rp{ctx};
u32 fd = rp.Pop<u32>();
u32 command = rp.Pop<u32>();
std::vector<u8> output(ctx.GetWriteBufferSize());
IoctlCtrl ctrl2{ctrl};
u32 result = nvdrv->Ioctl(fd, command, ctx.ReadBuffer(), output, ctrl2);
IPC::ResponseBuilder rb{ctx, 3};
rb.Push(RESULT_SUCCESS);
rb.Push(result);
ctx.WriteBuffer(output);
},
nvdrv->GetEventWriteable(ctrl.event_id));
} }
void NVDRV::Close(Kernel::HLERequestContext& ctx) { void NVDRV::Close(Kernel::HLERequestContext& ctx) {