Commit Graph

3 Commits (f729cfc33f258781c5fd85a3d8773bf6149d12db)

Author SHA1 Message Date
Nat Goodspeed ccc55255c5 MAINT-5232: Make LLPounceable noncopyable.
Changing the queue-of-callables implementation to boost::signals2::signal,
which is noncopyable, means that LLPounceable itself should be noncopyable.
2015-05-29 16:37:15 -04:00
Nat Goodspeed a9650ba222 MAINT-5232: Per Vir review, use Boost.Signals2 for LLPounceable.
Vir points out that "queue of callables" is pretty much exactly what a signal
does.
Add unit tests to verify chronological order, also queue reset when fired.
2015-05-29 15:10:54 -04:00
Nat Goodspeed df3da84624 MAINT-5232: Add LLPounceable template for delayed registrations.
LLMuteList, an LLSingleton, overrides its getInstance() method to intercept
control every time a consumer wants LLMuteList. This "polling" is to notice
when gMessageSystem becomes non-NULL, and register a couple callbacks on it.
Unfortunately there are a couple ways to request the LLMuteList instance
without specifically calling the subclass getInstance(), which would bypass
that logic. Moreover, the polling feels a bit dubious to start with.
LLPounceable<T*> presents an idiom in which you can callWhenReady(callable) on
the LLPounceable instance. If the T* is already non-NULL, it calls the
callable immediately; otherwise it enqueues it for when the T* is set
non-NULL. (This lets you "pounce" on the T* as soon as it becomes available,
hence the name.) So if gMessageSystem were an LLPounceable<LLMessageSystem*>,
LLMuteList's constructor could simply call gMessageSystem.callWhenReady() and
relax: the callbacks would be registered either on LLMuteList construction or
LLMessageSystem initialization, whichever comes later.
LLPounceable comes with its very own set of unit tests. However, as of this
commit it is not yet used in actual viewer code.
2015-05-22 22:05:16 -04:00