Skip to content
Snippets Groups Projects
Forked from Alchemy Viewer / Alchemy Viewer
Source project has a limited visibility.
  • Nat Goodspeed's avatar
    af4fbc1f
    DRTVWR-564: WIP: Add LazyEventAPI and tests. Tests don't yet pass. · af4fbc1f
    Nat Goodspeed authored
    LazyEventAPI is a registrar that implicitly instantiates some particular
    LLEventAPI subclass on demand: that is, when LLEventPumps::obtain() tries to
    find an LLEventPump by the registered name.
    
    This leverages the new LLEventPumps::registerPumpFactory() machinery. Fix
    registerPumpFactory() to adapt the passed PumpFactory to accept TypeFactory
    parameters (two of which it ignores). Supplement it with
    unregisterPumpFactory() to support LazyEventAPI instances with lifespans
    shorter than the process -- which may be mostly test programs, but still a
    hole worth closing. Similarly, add unregisterTypeFactory().
    
    A LazyEventAPI subclass takes over responsibility for specifying the
    LLEventAPI's name, desc, field, plus whatever add() calls will be needed to
    register the LLEventAPI's operations. This is so we can (later) enhance
    LLLeapListener to consult LazyEventAPI instances for not-yet-instantiated
    LLEventAPI metadata, as well as enumerating existing LLEventAPI instances.
    
    The trickiest part of this is capturing calls to the various
    LLEventDispatcher::add() overloads in such a way that, when the LLEventAPI
    subclass is eventually instantiated, we can replay them in the new instance.
    
    LLEventAPI acquires a new protected constructor specifically for use by a
    subclass registered by a companion LazyEventAPI. It accepts a const reference
    to LazyEventAPIParams, intended to be opaque to the LLEventAPI subclass; the
    subclass must declare a constructor that accepts and forwards the parameter
    block to the new LLEventAPI constructor. The implementation delegates to the
    existing LLEventAPI constructor, plus it runs deferred add() calls.
    
    LLDispatchListener now derives from LLEventStream instead of containing it as
    a data member. The reason is that if LLEventPumps::obtain() implicitly
    instantiates it, LLEventPumps's destructor will try to destroy it by deleting
    the LLEventPump*. If the LLEventPump returned by the factory function is a
    data member of an outer class, that won't work so well. But if
    LLDispatchListener (and by implication, LLEventAPI and any subclass) is
    derived from LLEventPump, then the virtual destructor will Do The Right Thing.
    
    Change LLDispatchListener to *not* allow tweaking the LLEventPump name. Since
    the overwhelming use case for LLDispatchListener is LLEventAPI, accepting but
    silently renaming an LLEventAPI subclass would ensure nobody could reach it.
    
    Change LLEventDispatcher's use of std::enable_if to control the set of add()
    overloads available for the intended use cases. Apparently this formulation is
    just as functional at the method declaration point, while avoiding the need to
    restate the whole enable_if expression at the method definition point.
    
    Add lazyeventapi_test.cpp to exercise.
    af4fbc1f
    History
    DRTVWR-564: WIP: Add LazyEventAPI and tests. Tests don't yet pass.
    Nat Goodspeed authored
    LazyEventAPI is a registrar that implicitly instantiates some particular
    LLEventAPI subclass on demand: that is, when LLEventPumps::obtain() tries to
    find an LLEventPump by the registered name.
    
    This leverages the new LLEventPumps::registerPumpFactory() machinery. Fix
    registerPumpFactory() to adapt the passed PumpFactory to accept TypeFactory
    parameters (two of which it ignores). Supplement it with
    unregisterPumpFactory() to support LazyEventAPI instances with lifespans
    shorter than the process -- which may be mostly test programs, but still a
    hole worth closing. Similarly, add unregisterTypeFactory().
    
    A LazyEventAPI subclass takes over responsibility for specifying the
    LLEventAPI's name, desc, field, plus whatever add() calls will be needed to
    register the LLEventAPI's operations. This is so we can (later) enhance
    LLLeapListener to consult LazyEventAPI instances for not-yet-instantiated
    LLEventAPI metadata, as well as enumerating existing LLEventAPI instances.
    
    The trickiest part of this is capturing calls to the various
    LLEventDispatcher::add() overloads in such a way that, when the LLEventAPI
    subclass is eventually instantiated, we can replay them in the new instance.
    
    LLEventAPI acquires a new protected constructor specifically for use by a
    subclass registered by a companion LazyEventAPI. It accepts a const reference
    to LazyEventAPIParams, intended to be opaque to the LLEventAPI subclass; the
    subclass must declare a constructor that accepts and forwards the parameter
    block to the new LLEventAPI constructor. The implementation delegates to the
    existing LLEventAPI constructor, plus it runs deferred add() calls.
    
    LLDispatchListener now derives from LLEventStream instead of containing it as
    a data member. The reason is that if LLEventPumps::obtain() implicitly
    instantiates it, LLEventPumps's destructor will try to destroy it by deleting
    the LLEventPump*. If the LLEventPump returned by the factory function is a
    data member of an outer class, that won't work so well. But if
    LLDispatchListener (and by implication, LLEventAPI and any subclass) is
    derived from LLEventPump, then the virtual destructor will Do The Right Thing.
    
    Change LLDispatchListener to *not* allow tweaking the LLEventPump name. Since
    the overwhelming use case for LLDispatchListener is LLEventAPI, accepting but
    silently renaming an LLEventAPI subclass would ensure nobody could reach it.
    
    Change LLEventDispatcher's use of std::enable_if to control the set of add()
    overloads available for the intended use cases. Apparently this formulation is
    just as functional at the method declaration point, while avoiding the need to
    restate the whole enable_if expression at the method definition point.
    
    Add lazyeventapi_test.cpp to exercise.
Code owners
Assign users and groups as approvers for specific file changes. Learn more.