Skip to content
Snippets Groups Projects
Forked from Alchemy Viewer / Alchemy Viewer
Source project has a limited visibility.
  • Nat Goodspeed's avatar
    955b9676
    SL-16024: Add ThreadSafeSchedule, a timestamped LLThreadSafeQueue. · 955b9676
    Nat Goodspeed authored
    ThreadSafeSchedule orders its items by timestamp, which can be passed either
    implicitly or explicitly. The timestamp specifies earliest delivery time: an
    item cannot be popped until that time.
    
    Add initial tests.
    
    Tweak the LLThreadSafeQueue base class to support ThreadSafeSchedule:
    introduce virtual canPop() method to report whether the current head item is
    available to pop. The base class unconditionally says yes, ThreadSafeSchedule
    says it depends on whether its timestamp is still in the future.
    
    This replaces the protected pop_() overload accepting a predicate. Rather than
    explicitly passing a predicate through a couple levels of function call, use
    canPop() at the level it matters. Runtime behavior that varies depending on
    an object's leaf class is what virtual functions were invented for.
    
    Give pop_() a three-state enum return so pop() can distinguish between "closed
    and empty" (throws exception) versus "closed, not yet drained because we're
    not yet ready to pop the head item" (waits).
    
    Also break out protected tryPopUntil_() method, the body logic of
    tryPopUntil(). The public method locks the data structure, the protected
    method requires that its caller has already done so.
    
    Add chrono.h with a more full-featured LL::time_point_cast() function than the
    one found in <chrono>, which only converts between time_point durations, not
    between time_points based on different clocks.
    955b9676
    History
    SL-16024: Add ThreadSafeSchedule, a timestamped LLThreadSafeQueue.
    Nat Goodspeed authored
    ThreadSafeSchedule orders its items by timestamp, which can be passed either
    implicitly or explicitly. The timestamp specifies earliest delivery time: an
    item cannot be popped until that time.
    
    Add initial tests.
    
    Tweak the LLThreadSafeQueue base class to support ThreadSafeSchedule:
    introduce virtual canPop() method to report whether the current head item is
    available to pop. The base class unconditionally says yes, ThreadSafeSchedule
    says it depends on whether its timestamp is still in the future.
    
    This replaces the protected pop_() overload accepting a predicate. Rather than
    explicitly passing a predicate through a couple levels of function call, use
    canPop() at the level it matters. Runtime behavior that varies depending on
    an object's leaf class is what virtual functions were invented for.
    
    Give pop_() a three-state enum return so pop() can distinguish between "closed
    and empty" (throws exception) versus "closed, not yet drained because we're
    not yet ready to pop the head item" (waits).
    
    Also break out protected tryPopUntil_() method, the body logic of
    tryPopUntil(). The public method locks the data structure, the protected
    method requires that its caller has already done so.
    
    Add chrono.h with a more full-featured LL::time_point_cast() function than the
    one found in <chrono>, which only converts between time_point durations, not
    between time_points based on different clocks.
Code owners
Assign users and groups as approvers for specific file changes. Learn more.