Skip to content
Snippets Groups Projects
  • Nat Goodspeed's avatar
    2ee22ed2
    MAINT-5976: Fix bug in LLCoros::set_consuming() mechanism. · 2ee22ed2
    Nat Goodspeed authored
    The original implementation of set_consuming() involved a bool* pointing to a
    local bool in VoidListener::operator()()'s stack frame. postAndSuspend() would
    set that bool (through the pointer) as soon as it returned from suspension.
    
    The trouble with that is that LLEventMailDrop potentially calls its new
    listener (fulfilling the future) immediately in the listen_impl() override --
    in other words, way up at the top of postAndSuspend(), well before the code
    that sets the relevant bool.
    
    Instead, make the adapter formerly known as VoidListener bind the coroutine's
    get_consuming() value at adapter construction time (before listening on the
    LLEventPump), so that its operator()() has the coroutine's correct
    get_consuming() value to return. Eliminating the bool* makes the code both
    simpler AND more correct!
    
    This change makes that adapter very specific to coroutine usage. Rename it
    FutureListener and migrate it from lleventcoros.h into the .cpp file. Nobody
    else was using it anyway.
    
    Make corresponding changes to postAndSuspend2() and its WaitForEventOnHelper
    class -- whose name no longer corresponds to the function as it used to.
    Rename that one FutureListener2. The new FutureListener functionality, common
    to both these adapters, makes it useful to derive FutureListener2 from
    FutureListener.
    
    Introduce llmake(), a generic function to deduce template type arguments from
    function parameter types. This allows us to remove the voidlistener() and
    wfeoh() helper functions.
    
    Hiding VoidListener broke one of the lleventcoro_test.cpp tests. But that test
    was sort of a lame recap of an earlier implementation of postAndSuspend(),
    based on LLEventPump events. Recast that test to illustrate how to use a
    coroutine future to suspend a coroutine for something other than an LLEventPump.
    
    But that rubbed my nose in the fact that we MUST wrap future's context
    switching with proper management of the current coroutine. Introduce
    LLCoros::Future<T>, which wraps boost::dcoroutines::future<T>.
    
    Use LLCoros::Future<T> in postAndSuspend() and postAndSuspend2().
    2ee22ed2
    History
    MAINT-5976: Fix bug in LLCoros::set_consuming() mechanism.
    Nat Goodspeed authored
    The original implementation of set_consuming() involved a bool* pointing to a
    local bool in VoidListener::operator()()'s stack frame. postAndSuspend() would
    set that bool (through the pointer) as soon as it returned from suspension.
    
    The trouble with that is that LLEventMailDrop potentially calls its new
    listener (fulfilling the future) immediately in the listen_impl() override --
    in other words, way up at the top of postAndSuspend(), well before the code
    that sets the relevant bool.
    
    Instead, make the adapter formerly known as VoidListener bind the coroutine's
    get_consuming() value at adapter construction time (before listening on the
    LLEventPump), so that its operator()() has the coroutine's correct
    get_consuming() value to return. Eliminating the bool* makes the code both
    simpler AND more correct!
    
    This change makes that adapter very specific to coroutine usage. Rename it
    FutureListener and migrate it from lleventcoros.h into the .cpp file. Nobody
    else was using it anyway.
    
    Make corresponding changes to postAndSuspend2() and its WaitForEventOnHelper
    class -- whose name no longer corresponds to the function as it used to.
    Rename that one FutureListener2. The new FutureListener functionality, common
    to both these adapters, makes it useful to derive FutureListener2 from
    FutureListener.
    
    Introduce llmake(), a generic function to deduce template type arguments from
    function parameter types. This allows us to remove the voidlistener() and
    wfeoh() helper functions.
    
    Hiding VoidListener broke one of the lleventcoro_test.cpp tests. But that test
    was sort of a lame recap of an earlier implementation of postAndSuspend(),
    based on LLEventPump events. Recast that test to illustrate how to use a
    coroutine future to suspend a coroutine for something other than an LLEventPump.
    
    But that rubbed my nose in the fact that we MUST wrap future's context
    switching with proper management of the current coroutine. Introduce
    LLCoros::Future<T>, which wraps boost::dcoroutines::future<T>.
    
    Use LLCoros::Future<T> in postAndSuspend() and postAndSuspend2().
Code owners
Assign users and groups as approvers for specific file changes. Learn more.