1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 01:17:34 +00:00

Kernel: Avoid some copies during USBInterface enumeration/creation

This commit is contained in:
Hendiadyoin1 2023-09-15 21:27:46 +02:00 committed by Andrew Kaster
parent b857c6b92f
commit c230a0d96f
2 changed files with 6 additions and 5 deletions

View file

@ -29,6 +29,7 @@ ErrorOr<void> USBConfiguration::enumerate_interfaces()
u8* interface_descriptors_base = descriptor_hierarchy_buffer.data() + sizeof(USBConfigurationDescriptor); u8* interface_descriptors_base = descriptor_hierarchy_buffer.data() + sizeof(USBConfigurationDescriptor);
USBInterfaceDescriptor* interface_descriptor = reinterpret_cast<USBInterfaceDescriptor*>(interface_descriptors_base); USBInterfaceDescriptor* interface_descriptor = reinterpret_cast<USBInterfaceDescriptor*>(interface_descriptors_base);
Vector<USBEndpointDescriptor> endpoint_descriptors; Vector<USBEndpointDescriptor> endpoint_descriptors;
TRY(m_interfaces.try_ensure_capacity(m_descriptor.number_of_interfaces));
for (auto interface = 0u; interface < m_descriptor.number_of_interfaces; interface++) { for (auto interface = 0u; interface < m_descriptor.number_of_interfaces; interface++) {
endpoint_descriptors.ensure_capacity(interface_descriptor->number_of_endpoints); endpoint_descriptors.ensure_capacity(interface_descriptor->number_of_endpoints);
@ -64,11 +65,11 @@ ErrorOr<void> USBConfiguration::enumerate_interfaces()
dbgln("Endpoint Poll Interval (in frames): {}", endpoint_descriptor.poll_interval_in_frames); dbgln("Endpoint Poll Interval (in frames): {}", endpoint_descriptor.poll_interval_in_frames);
} }
endpoint_descriptors.append(endpoint_descriptor); endpoint_descriptors.unchecked_append(endpoint_descriptor);
} }
USBInterface device_interface(*this, *interface_descriptor, endpoint_descriptors); USBInterface device_interface(*this, *interface_descriptor, move(endpoint_descriptors));
m_interfaces.append(device_interface); m_interfaces.unchecked_append(move(device_interface));
interface_descriptor += interface_descriptor->number_of_endpoints * sizeof(USBEndpointDescriptor); interface_descriptor += interface_descriptor->number_of_endpoints * sizeof(USBEndpointDescriptor);
} }

View file

@ -16,10 +16,10 @@ class USBConfiguration;
class USBInterface final { class USBInterface final {
public: public:
USBInterface() = delete; USBInterface() = delete;
USBInterface(USBConfiguration const& configuration, USBInterfaceDescriptor const descriptor, Vector<USBEndpointDescriptor> const& endpoint_descriptors) USBInterface(USBConfiguration const& configuration, USBInterfaceDescriptor const descriptor, Vector<USBEndpointDescriptor> endpoint_descriptors)
: m_configuration(configuration) : m_configuration(configuration)
, m_descriptor(descriptor) , m_descriptor(descriptor)
, m_endpoint_descriptors(endpoint_descriptors) , m_endpoint_descriptors(move(endpoint_descriptors))
{ {
m_endpoint_descriptors.ensure_capacity(descriptor.number_of_endpoints); m_endpoint_descriptors.ensure_capacity(descriptor.number_of_endpoints);
} }