3using namespace LibXR::USB;
8 ASSERT(endpoint_num >= 2);
14 for (uint32_t i = 0; i <
SlotCount(); ++i)
16 auto& slot_container = (*this)[i];
17 auto state = slot_container.slot.state.load(std::memory_order_acquire);
18 if (state == SlotState::READY)
21 ep_num != slot_container.slot.data->GetNumber())
26 if (slot_container.slot.data->AvailableDirection() == direction ||
34 return ErrorCode::NOT_FOUND;
39 for (uint32_t i = 0; i <
SlotCount(); ++i)
41 auto& slot = (*this)[i];
42 auto state = slot.slot.state.load(std::memory_order_acquire);
43 if (state == SlotState::RECYCLE)
45 if (slot.slot.data == ep_info)
47 slot.slot.state.store(SlotState::READY, std::memory_order_release);
52 if (state == SlotState::FREE)
58 return ErrorCode::NOT_FOUND;
71 for (uint32_t i = 0; i <
SlotCount(); ++i)
73 auto& slot_container = (*this)[i];
74 auto state = slot_container.slot.state.load(std::memory_order_acquire);
75 if (state == SlotState::READY &&
77 slot_container.slot.data->GetDirection()) == ep_addr &&
78 slot_container.slot.data->GetDirection() == direction)
80 ans = slot_container.slot.data;
83 if (state == SlotState::FREE)
89 return ErrorCode::NOT_FOUND;
无锁无序槽池 / Lock-free, unordered slot pool
ErrorCode Get(Data &data)
从池中取出一个元素 / Retrieve an element from the pool
uint32_t SlotCount() const
USB端点基类 / USB Endpoint base class.
EPNumber
端点号 / Endpoint number
@ EP_AUTO
自动分配端点号 / Auto allocate
Direction
端点方向 Endpoint direction
@ BOTH
双向(可配置成IN/OUT) / Both (can be configured as IN/OUT)
@ OUT
输出方向 / OUT direction
static constexpr uint8_t EPNumberToAddr(EPNumber ep, Direction dir)
端点号转换为端点地址 / Convert endpoint number to endpoint address
ErrorCode FindEndpoint(uint8_t ep_addr, Endpoint *&ans)
查找端点/ Lookup endpoint
EndpointPool(size_t endpoint_num)
构造函数 / Constructor
Endpoint * GetEndpoint0In()
获取端点0的IN对象 / Get Endpoint 0's IN object
void SetEndpoint0(Endpoint *ep0_in, Endpoint *ep0_out)
设置端点0的IN/OUT对象 / Set Endpoint 0 IN/OUT objects
Endpoint * ep0_in_
端点0 IN对象 / Endpoint 0 IN pointer
ErrorCode Get(Endpoint *&ep_info, Endpoint::Direction direction, Endpoint::EPNumber ep_num=Endpoint::EPNumber::EP_AUTO)
分配端点 / Allocate endpoint
Endpoint * ep0_out_
端点0 OUT对象 / Endpoint 0 OUT pointer
Endpoint * GetEndpoint0Out()
获取端点0的OUT对象 / Get Endpoint 0's OUT object
ErrorCode Release(Endpoint *ep_info)
回收端点 / Release endpoint