mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 04:17:35 +00:00
Kernel: Fix race conditions processing async device requests
This commit is contained in:
parent
8177f2474b
commit
5ccc3637e3
4 changed files with 23 additions and 41 deletions
|
@ -82,20 +82,15 @@ String Device::absolute_path(const FileDescription&) const
|
|||
|
||||
void Device::process_next_queued_request(Badge<AsyncDeviceRequest>, const AsyncDeviceRequest& completed_request)
|
||||
{
|
||||
AsyncDeviceRequest* next_request = nullptr;
|
||||
|
||||
{
|
||||
ScopedSpinLock lock(m_requests_lock);
|
||||
VERIFY(!m_requests.is_empty());
|
||||
VERIFY(m_requests.first().ptr() == &completed_request);
|
||||
m_requests.remove(m_requests.begin());
|
||||
if (!m_requests.is_empty())
|
||||
next_request = m_requests.first().ptr();
|
||||
ScopedSpinLock lock(m_requests_lock);
|
||||
VERIFY(!m_requests.is_empty());
|
||||
VERIFY(m_requests.first().ptr() == &completed_request);
|
||||
m_requests.remove(m_requests.begin());
|
||||
if (!m_requests.is_empty()) {
|
||||
auto* next_request = m_requests.first().ptr();
|
||||
next_request->do_start(move(lock));
|
||||
}
|
||||
|
||||
if (next_request)
|
||||
next_request->start();
|
||||
|
||||
evaluate_block_conditions();
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue