mirror of https://github.com/RPCS3/rpcs3.git
sys_usbd tidy ups
Tidy up fake transfer iterator handling. erase invalidates all iterators including the current iterator (i.e. 'it'), given precedence ordering this was UB prior to C++17. Splitting out to use return iterator from erase seems cleaner. Also added some additional info to usb debug message to potentially help with #8666, and used the atomic (dev_counter) less often
This commit is contained in:
parent
7109fe9889
commit
eb5ae94c24
|
@ -253,23 +253,26 @@ void usb_handler_thread::operator()()
|
||||||
|
|
||||||
u64 timestamp = get_system_time() - Emu.GetPauseTime();
|
u64 timestamp = get_system_time() - Emu.GetPauseTime();
|
||||||
|
|
||||||
for (auto it = fake_transfers.begin(); it != fake_transfers.end(); it++)
|
for (auto it = fake_transfers.begin(); it != fake_transfers.end();)
|
||||||
{
|
{
|
||||||
auto transfer = *it;
|
auto transfer = *it;
|
||||||
|
|
||||||
ASSERT(transfer->busy && transfer->fake);
|
ASSERT(transfer->busy && transfer->fake);
|
||||||
|
|
||||||
if (transfer->expected_time > timestamp)
|
if (transfer->expected_time > timestamp)
|
||||||
|
{
|
||||||
|
++it;
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
transfer->result = transfer->expected_result;
|
transfer->result = transfer->expected_result;
|
||||||
transfer->count = transfer->expected_count;
|
transfer->count = transfer->expected_count;
|
||||||
transfer->fake = false;
|
transfer->fake = false;
|
||||||
transfer->busy = false;
|
transfer->busy = false;
|
||||||
|
|
||||||
fake_transfers.erase(it--);
|
|
||||||
|
|
||||||
send_message(SYS_USBD_TRANSFER_COMPLETE, transfer->transfer_id);
|
send_message(SYS_USBD_TRANSFER_COMPLETE, transfer->transfer_id);
|
||||||
|
it = fake_transfers.erase(it); // if we've processed this, then we erase this entry (replacing the iterator with the new reference)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -387,14 +390,13 @@ void usb_handler_thread::check_devices_vs_ldds()
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
sys_usbd.success("Ldd device matchup for <%s>", ldd.name);
|
|
||||||
|
|
||||||
dev->read_descriptors();
|
dev->read_descriptors();
|
||||||
|
dev->assigned_number = dev_counter++; // assign current dev_counter, and atomically increment
|
||||||
|
|
||||||
dev->assigned_number = dev_counter;
|
sys_usbd.success("Ldd device matchup for <%s>, assigned as handled_device=0x%x", ldd.name, dev->assigned_number);
|
||||||
handled_devices.emplace(dev_counter, std::pair(UsbInternalDevice{0x00, dev_counter, 0x02, 0x40}, dev));
|
|
||||||
send_message(SYS_USBD_ATTACH, dev_counter);
|
handled_devices.emplace(dev->assigned_number, std::pair(UsbInternalDevice{0x00, narrow<u8>(dev->assigned_number), 0x02, 0x40}, dev));
|
||||||
dev_counter++;
|
send_message(SYS_USBD_ATTACH, dev->assigned_number);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue