Skip to content
Snippets Groups Projects
  • Nat Goodspeed's avatar
    95a218fc
    DRTVWR-476: Eliminate static LLEventPump factory maps. · 95a218fc
    Nat Goodspeed authored
    Having a map from std::string to a factory function returning LLEventPump* is
    a cool idea, especially since you could statically populate such a map with
    string literals and little lambdas.
    
    Unfortunately, static initialization of any data is a bad idea when control
    can reach consuming code before that module's static data are constructed.
    
    Since LLEventPumps is already an LLSingleton, it's simple enough to make its
    map non-static and initialize it in the constructor.
    
    But another recent static factory-function map was introduced in
    llleaplistener.cpp to support the LLLeapListener::newpump() operation. That
    involves no LLSingletons.
    
    Introduce LLEventPumps::make(name, tweak, type) to instantiate an LLEventPump
    subclass of the specified type with specified (name, tweak) parameters.
    Instances returned by make() are owned by LLEventPumps, as with obtain().
    Introduce LLEventPumps::BadType exception for when the type string isn't
    recognized.
    
    LLEventPumps::obtain() can then simply call make() when the specified instance
    name doesn't already exist. The configuration data used internally by obtain()
    becomes { string instance name, string subclass name }. Although this too is
    currently initialized in the LLEventPumps constructor, migrating it to a
    configuration file would now be far more straightforward than before.
    
    LLLeapListener::newpump(), too, can call LLEventPumps::make() with the
    caller-specified type string. This eliminates that static factory map.
    newpump() must catch BadType and report the error back to its invoker.
    
    Given that the LLEventPump subclass instances returned by make() are owned by
    LLEventPumps rather than LLLeapListener, there is no further need for the
    LLLeapListener::mEventPumps ptr_map, which was used only to manage lifetime.
    Also remove LLLeapListener's "killpump" operation since LLEventPumps provides
    no corresponding functionality.
    95a218fc
    History
    DRTVWR-476: Eliminate static LLEventPump factory maps.
    Nat Goodspeed authored
    Having a map from std::string to a factory function returning LLEventPump* is
    a cool idea, especially since you could statically populate such a map with
    string literals and little lambdas.
    
    Unfortunately, static initialization of any data is a bad idea when control
    can reach consuming code before that module's static data are constructed.
    
    Since LLEventPumps is already an LLSingleton, it's simple enough to make its
    map non-static and initialize it in the constructor.
    
    But another recent static factory-function map was introduced in
    llleaplistener.cpp to support the LLLeapListener::newpump() operation. That
    involves no LLSingletons.
    
    Introduce LLEventPumps::make(name, tweak, type) to instantiate an LLEventPump
    subclass of the specified type with specified (name, tweak) parameters.
    Instances returned by make() are owned by LLEventPumps, as with obtain().
    Introduce LLEventPumps::BadType exception for when the type string isn't
    recognized.
    
    LLEventPumps::obtain() can then simply call make() when the specified instance
    name doesn't already exist. The configuration data used internally by obtain()
    becomes { string instance name, string subclass name }. Although this too is
    currently initialized in the LLEventPumps constructor, migrating it to a
    configuration file would now be far more straightforward than before.
    
    LLLeapListener::newpump(), too, can call LLEventPumps::make() with the
    caller-specified type string. This eliminates that static factory map.
    newpump() must catch BadType and report the error back to its invoker.
    
    Given that the LLEventPump subclass instances returned by make() are owned by
    LLEventPumps rather than LLLeapListener, there is no further need for the
    LLLeapListener::mEventPumps ptr_map, which was used only to manage lifetime.
    Also remove LLLeapListener's "killpump" operation since LLEventPumps provides
    no corresponding functionality.
Code owners
Assign users and groups as approvers for specific file changes. Learn more.