[*] Win32 Shell Opener: do the main operation outside of the lock
[*] Linux IO / AuAsync: always use AU_CO_ROUTINE_SUS_NEVER or bool(false). Fixed dropped IO callbacks. [*] Linux: Added POLLHUP to the blocking read poll. We shouldn't need this. Sockets and pipes set their read side on relevant events. For instance, async connect results in a writable signal, dropped sockets will become signaled under a select, etc. IPC works. Net works. Just gonna add this to the read trigger just in case.
This commit is contained in:
parent
7a0593adeb
commit
a2322470b8
@ -746,12 +746,12 @@ namespace std
|
||||
void set_exception(exception_ptr const &) noexcept
|
||||
{ }
|
||||
|
||||
AU_CO_ROUTINE_SUS_ALWAYS initial_suspend() noexcept
|
||||
AU_CO_ROUTINE_SUS_NEVER initial_suspend() noexcept
|
||||
{
|
||||
return {};
|
||||
}
|
||||
|
||||
AU_CO_ROUTINE_SUS_ALWAYS final_suspend() noexcept
|
||||
AU_CO_ROUTINE_SUS_NEVER final_suspend() noexcept
|
||||
{
|
||||
return {};
|
||||
}
|
||||
@ -775,12 +775,12 @@ namespace std
|
||||
void set_exception(exception_ptr const &) noexcept
|
||||
{ }
|
||||
|
||||
AU_CO_ROUTINE_SUS_ALWAYS initial_suspend() noexcept
|
||||
AU_CO_ROUTINE_SUS_NEVER initial_suspend() noexcept
|
||||
{
|
||||
return {};
|
||||
}
|
||||
|
||||
AU_CO_ROUTINE_SUS_ALWAYS final_suspend() noexcept
|
||||
AU_CO_ROUTINE_SUS_NEVER final_suspend() noexcept
|
||||
{
|
||||
return {};
|
||||
}
|
||||
@ -804,12 +804,12 @@ struct AuVoidTask
|
||||
return {};
|
||||
}
|
||||
|
||||
AU_CO_ROUTINE_SUS_ALWAYS initial_suspend()
|
||||
AU_CO_ROUTINE_SUS_NEVER initial_suspend()
|
||||
{
|
||||
return {};
|
||||
}
|
||||
|
||||
AU_CO_ROUTINE_SUS_ALWAYS final_suspend() noexcept
|
||||
AU_CO_ROUTINE_SUS_NEVER final_suspend() noexcept
|
||||
{
|
||||
return {};
|
||||
}
|
||||
|
@ -515,7 +515,7 @@ namespace Aurora::IO::UNIX
|
||||
submit.aio_reqprio = 0;
|
||||
submit.aio_fildes = context->GetOrCreateFdPollForBlockingRead(fd);
|
||||
submit.aio_offset = 0;
|
||||
submit.aio_buf = POLLIN;
|
||||
submit.aio_buf = POLLIN | POLLHUP;
|
||||
submit.aio_nbytes = 0;
|
||||
|
||||
if (submit.aio_fildes == -1)
|
||||
|
@ -1,5 +1,5 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
Copyright (C) 2021 Jamie Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: AuOpen.Win32.cpp
|
||||
Date: 2021-6-12
|
||||
@ -28,8 +28,10 @@ namespace Aurora::Processes
|
||||
{
|
||||
try
|
||||
{
|
||||
for (const auto &[uri, type] : gOpenItems)
|
||||
while (gOpenItems.size())
|
||||
{
|
||||
auto &[uri, type] = gOpenItems[0];
|
||||
|
||||
bool bDirExists {};
|
||||
bool bFileExists {};
|
||||
|
||||
@ -75,21 +77,29 @@ namespace Aurora::Processes
|
||||
}
|
||||
}
|
||||
|
||||
auto u16OpenURI = Locale::ConvertFromUTF8(uri);
|
||||
auto pOpenType = bDirExists ? L"explore" : L"open";
|
||||
|
||||
gCondMutex->Unlock();
|
||||
pShellExecuteW(nullptr,
|
||||
bDirExists ? L"explore" : L"open",
|
||||
Locale::ConvertFromUTF8(uri).c_str(),
|
||||
pOpenType,
|
||||
u16OpenURI.c_str(),
|
||||
nullptr,
|
||||
nullptr,
|
||||
SW_SHOWNORMAL);
|
||||
gCondMutex->Lock();
|
||||
|
||||
// Move all N-1 elements for each N, vs clearing later (requires lock?), vs making a copy of the work (requires another alloc?).
|
||||
// We can just do ShellExecuteW outside of the lock, and access a locally owned U16-translated string container, without bothering the write side mutex or mutable work container.
|
||||
// A work queue buffer could solve this, but eh.
|
||||
gOpenItems.erase(gOpenItems.begin());
|
||||
}
|
||||
|
||||
gOpenItems.clear();
|
||||
gCondVariable->WaitForSignal();
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
Debug::PrintError();
|
||||
AuLogWarn("An error occurred while dispatching a ShellExecute runner frame");
|
||||
SysPushErrorCatch("An error occurred while dispatching a ShellExecute runner frame");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user