|
The Pedigree Project 0.1
|
#include <CallbackDelivery.h>
Collaboration diagram for UsbHcd::CallbackDeliveryQueue:Classes | |
| struct | ActiveCallback |
| class | CallbackContext |
| struct | Key |
| class | Record |
Public Types | |
| using | Callback = void(*)(uintptr_t, ssize_t) |
| using | AfterDelivery = void(*)(void *) |
| using | OnDestroy = void(*)(void *) |
Public Member Functions | |
| MUST_USE_RESULT Record * | create (const Key &key, Callback callback, uintptr_t parameter, ssize_t result, AfterDelivery afterDelivery=nullptr, void *afterDeliveryContext=nullptr, OnDestroy onDestroy=nullptr, void *destroyContext=nullptr) |
| size_t | nextGeneration () |
| void | publish (List< Record * > &records) |
| void | deliver (Record *record) |
| bool | drain (const Key &key) |
| bool | cancelSubscription (uintptr_t transaction, size_t subscription) |
| size_t | drainAll () |
| bool | contains (const Key &key) |
| size_t | activeCount () |
| bool | empty () |
Static Public Member Functions | |
| static bool | isInCallbackContext () |
Private Member Functions | |
| Record * | findLocked (const Key &key) |
| void | finishRecord (Record *record) |
| void | runRecord (Record *record) |
| NOT_COPYABLE_OR_ASSIGNABLE (CallbackDeliveryQueue) | |
Static Private Member Functions | |
| static Mutex & | callbackContextLock () |
| static ActiveCallback *& | callbackContexts () |
| static bool | inCallbackContext () |
| static void * | currentRunner () |
Private Attributes | |
| Mutex | m_Lock |
| List< Record * > | m_Records |
| Atomic< size_t > | m_NextGeneration |
Publishes captured callbacks before an HCD releases its completion lock.
One-shot cancellation can steal a pending callback and run it inline. Recurring-subscription cancellation instead suppresses pending samples and only waits for samples which are already running outside callback context.
Definition at line 29 of file CallbackDelivery.h.
| using UsbHcd::CallbackDeliveryQueue::AfterDelivery = void (*)(void*) |
Definition at line 46 of file CallbackDelivery.h.
| using UsbHcd::CallbackDeliveryQueue::Callback = void (*)(uintptr_t, ssize_t) |
Definition at line 45 of file CallbackDelivery.h.
| using UsbHcd::CallbackDeliveryQueue::OnDestroy = void (*)(void*) |
Definition at line 47 of file CallbackDelivery.h.
|
inline |
Definition at line 125 of file CallbackDelivery.h.
|
inline |
Definition at line 127 of file CallbackDelivery.h.
|
inline |
Definition at line 307 of file CallbackDelivery.h.
|
inlinestaticprivate |
Definition at line 349 of file CallbackDelivery.h.
|
inlinestaticprivate |
Definition at line 354 of file CallbackDelivery.h.
|
inline |
Cancels every sample captured for one recurring subscription.
Pending samples are suppressed rather than invoked during object destruction. Running samples are drained only outside USB callback context, avoiding reciprocal callback cancellation cycles. False retains ownership for an external retry after the caller's callback returns.
Definition at line 221 of file CallbackDelivery.h.
References UsbHcd::CallbackDeliveryQueue::Record::m_State.
Referenced by Xhci::cancelInterruptInAndDrain(), Ehci::cancelInterruptInAndDrain(), and Uhci::cancelInterruptInAndDrain().
Here is the caller graph for this function:
|
inline |
Definition at line 302 of file CallbackDelivery.h.
|
inline |
Definition at line 131 of file CallbackDelivery.h.
|
inlinestaticprivate |
Definition at line 369 of file CallbackDelivery.h.
|
inline |
Delivers one batch-owned record and drops the batch reference.
Definition at line 156 of file CallbackDelivery.h.
References UsbHcd::CallbackDeliveryQueue::Record::m_State.
Referenced by Ehci::cancelAsyncAndDrain(), Ohci::cancelAsyncAndDrain(), Uhci::cancelAsyncAndDrain(), Ohci::irq(), and Uhci::irq().
Here is the caller graph for this function:
|
inline |
Drains the exact transaction generation.
Pending records are stolen and delivered inline. A callback draining itself is already inside the required ownership boundary and returns immediately. Only another thread's running callback requires a wait.
Definition at line 184 of file CallbackDelivery.h.
References UsbHcd::CallbackDeliveryQueue::Record::m_State.
Referenced by Ehci::cancelAsyncAndDrain(), Ohci::cancelAsyncAndDrain(), Uhci::cancelAsyncAndDrain(), and drainAll().
Here is the caller graph for this function:
|
inline |
Drains every callback after all producers have been quiesced.
A callback may drain another pending record, so the queue is searched again after every delivery. A record running on this thread is already inside the required lifetime boundary and is skipped.
Definition at line 276 of file CallbackDelivery.h.
References drain(), and UsbHcd::CallbackDeliveryQueue::Record::m_State.
|
inline |
Definition at line 312 of file CallbackDelivery.h.
Definition at line 375 of file CallbackDelivery.h.
|
inlineprivate |
Definition at line 383 of file CallbackDelivery.h.
|
inlinestaticprivate |
Definition at line 359 of file CallbackDelivery.h.
|
inlinestatic |
True while this execution context is delivering any USB HCD callback.
Definition at line 317 of file CallbackDelivery.h.
Referenced by Ehci::inInterruptCallbackContext(), Ohci::inInterruptCallbackContext(), Uhci::inInterruptCallbackContext(), and Xhci::inInterruptCallbackContext().
Here is the caller graph for this function:
|
inline |
Definition at line 139 of file CallbackDelivery.h.
Publishes every record while the caller still owns its HCD lock.
Definition at line 147 of file CallbackDelivery.h.
References List< T, nodePoolSize >::begin(), and List< T, nodePoolSize >::end().
Referenced by Ehci::cancelAsyncAndDrain(), Ohci::cancelAsyncAndDrain(), Uhci::cancelAsyncAndDrain(), Ohci::irq(), and Uhci::irq().
Here is the caller graph for this function:
|
inlineprivate |
Definition at line 401 of file CallbackDelivery.h.
|
private |
Definition at line 413 of file CallbackDelivery.h.
|
private |
Definition at line 415 of file CallbackDelivery.h.
Definition at line 414 of file CallbackDelivery.h.