The Pedigree Project 0.1
Classes | Public Types | Public Member Functions | Static Public Member Functions | Private Member Functions | Static Private Member Functions | Private Attributes | List of all members
UsbHcd::CallbackDeliveryQueue Class Reference

#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 Recordcreate (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

RecordfindLocked (const Key &key)
 
void finishRecord (Record *record)
 
void runRecord (Record *record)
 
 NOT_COPYABLE_OR_ASSIGNABLE (CallbackDeliveryQueue)
 

Static Private Member Functions

static MutexcallbackContextLock ()
 
static ActiveCallback *& callbackContexts ()
 
static bool inCallbackContext ()
 
static void * currentRunner ()
 

Private Attributes

Mutex m_Lock
 
List< Record * > m_Records
 
Atomic< size_t > m_NextGeneration
 

Detailed Description

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.

Member Typedef Documentation

◆ AfterDelivery

using UsbHcd::CallbackDeliveryQueue::AfterDelivery = void (*)(void*)

Definition at line 46 of file CallbackDelivery.h.

◆ Callback

using UsbHcd::CallbackDeliveryQueue::Callback = void (*)(uintptr_t, ssize_t)

Definition at line 45 of file CallbackDelivery.h.

◆ OnDestroy

using UsbHcd::CallbackDeliveryQueue::OnDestroy = void (*)(void*)

Definition at line 47 of file CallbackDelivery.h.

Constructor & Destructor Documentation

◆ CallbackDeliveryQueue()

UsbHcd::CallbackDeliveryQueue::CallbackDeliveryQueue ( )
inline

Definition at line 125 of file CallbackDelivery.h.

◆ ~CallbackDeliveryQueue()

UsbHcd::CallbackDeliveryQueue::~CallbackDeliveryQueue ( )
inline

Definition at line 127 of file CallbackDelivery.h.

Member Function Documentation

◆ activeCount()

size_t UsbHcd::CallbackDeliveryQueue::activeCount ( )
inline

Definition at line 307 of file CallbackDelivery.h.

◆ callbackContextLock()

static Mutex & UsbHcd::CallbackDeliveryQueue::callbackContextLock ( )
inlinestaticprivate

Definition at line 349 of file CallbackDelivery.h.

◆ callbackContexts()

static ActiveCallback *& UsbHcd::CallbackDeliveryQueue::callbackContexts ( )
inlinestaticprivate

Definition at line 354 of file CallbackDelivery.h.

◆ cancelSubscription()

bool UsbHcd::CallbackDeliveryQueue::cancelSubscription ( uintptr_t  transaction,
size_t  subscription 
)
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:

◆ contains()

bool UsbHcd::CallbackDeliveryQueue::contains ( const Key key)
inline

Definition at line 302 of file CallbackDelivery.h.

◆ create()

MUST_USE_RESULT Record * UsbHcd::CallbackDeliveryQueue::create ( const Key key,
Callback  callback,
uintptr_t  parameter,
ssize_t  result,
AfterDelivery  afterDelivery = nullptr,
void *  afterDeliveryContext = nullptr,
OnDestroy  onDestroy = nullptr,
void *  destroyContext = nullptr 
)
inline

Definition at line 131 of file CallbackDelivery.h.

◆ currentRunner()

static void * UsbHcd::CallbackDeliveryQueue::currentRunner ( )
inlinestaticprivate

Definition at line 369 of file CallbackDelivery.h.

◆ deliver()

void UsbHcd::CallbackDeliveryQueue::deliver ( Record record)
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:

◆ drain()

bool UsbHcd::CallbackDeliveryQueue::drain ( const Key key)
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:

◆ drainAll()

size_t UsbHcd::CallbackDeliveryQueue::drainAll ( )
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.

◆ empty()

bool UsbHcd::CallbackDeliveryQueue::empty ( )
inline

Definition at line 312 of file CallbackDelivery.h.

◆ findLocked()

Record * UsbHcd::CallbackDeliveryQueue::findLocked ( const Key key)
inlineprivate

Definition at line 375 of file CallbackDelivery.h.

◆ finishRecord()

void UsbHcd::CallbackDeliveryQueue::finishRecord ( Record record)
inlineprivate

Definition at line 383 of file CallbackDelivery.h.

◆ inCallbackContext()

static bool UsbHcd::CallbackDeliveryQueue::inCallbackContext ( )
inlinestaticprivate

Definition at line 359 of file CallbackDelivery.h.

◆ isInCallbackContext()

static bool UsbHcd::CallbackDeliveryQueue::isInCallbackContext ( )
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:

◆ nextGeneration()

size_t UsbHcd::CallbackDeliveryQueue::nextGeneration ( )
inline

Definition at line 139 of file CallbackDelivery.h.

◆ publish()

void UsbHcd::CallbackDeliveryQueue::publish ( List< Record * > &  records)
inline

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:

◆ runRecord()

void UsbHcd::CallbackDeliveryQueue::runRecord ( Record record)
inlineprivate

Definition at line 401 of file CallbackDelivery.h.

Member Data Documentation

◆ m_Lock

Mutex UsbHcd::CallbackDeliveryQueue::m_Lock
private

Definition at line 413 of file CallbackDelivery.h.

◆ m_NextGeneration

Atomic<size_t> UsbHcd::CallbackDeliveryQueue::m_NextGeneration
private

Definition at line 415 of file CallbackDelivery.h.

◆ m_Records

List<Record*> UsbHcd::CallbackDeliveryQueue::m_Records
private

Definition at line 414 of file CallbackDelivery.h.


The documentation for this class was generated from the following file: