Skip to content
Snippets Groups Projects
  1. Sep 03, 2016
    • Nat Goodspeed's avatar
      MAINT-5232: Break out LLCoros::get_id() into its own header file. · 976f4b62
      Nat Goodspeed authored
      We need LLSingleton machinery to be able to reference get_id() without also
      depending on all the rest of LLCoros -- since LLCoros isa LLSingleton.
      976f4b62
    • Nat Goodspeed's avatar
      MAINT-5232: Add LLCoros::get_id() to identify the running coroutine. · f931f6ef
      Nat Goodspeed authored
      Change the module-static thread_specific_ptr to a function-static
      thread_specific_ptr so it will be initialized on demand -- since LLSingleton
      will need to rely on get_id(). Note that since LLCoros isa LLSingleton, we
      must take great care to avoid circularity.
      
      Introduce a private helper class LLCoros::Current to obtain and bind that
      thread_specific_ptr. Change all existing internal references from the static
      thread_specific_ptr to the new Current helper class.
      f931f6ef
  2. Jan 04, 2016
  3. Dec 18, 2015
    • Nat Goodspeed's avatar
      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
  4. Dec 16, 2015
  5. Nov 10, 2015
  6. Jul 10, 2015
  7. Jul 07, 2015
  8. Jul 02, 2015
    • Nat Goodspeed's avatar
      MAINT-5357: Introduce and populate llcoro:: namespace. · f90023fc
      Nat Goodspeed authored
      To date, the coroutine helper functions in lleventcoro.h have been in the
      global namespace. Migrate them into llcoro namespace, and fix references.
      Specifically, LLVoidListener => llcoro::VoidListener, and voidlistener(),
      postAndWait(), both waitForEventOn(), postAndWait2(), errorException() and
      errorLog() have been moved into llcoro.
      Also migrate new LLCoros::get_self() and Suspending to llcoro:: namespace.
      While at it, I realized that -- having converted several lleventcoro.h
      functions from templates (for arbitrary 'self' parameter type) to ordinary
      functions, having moved them from lleventcoro.h to lleventcoro.cpp, we can now
      migrate their helpers from lleventcoro.h to lleventcoro.cpp as well. This
      eliminates the need for the LLEventDetail namespace; the relevant helpers are
      now in an anonymous namespace in the .cpp file: listenerNameForCoro(),
      storeToLLSDPath(), WaitForEventOnHelper and wfeoh().
      f90023fc
  9. Jul 01, 2015
  10. May 23, 2013
    • Nat Goodspeed's avatar
      MAINT-2724: Make viewer explicitly set coroutine stack size. · 3be79d53
      Nat Goodspeed authored
      Introduce LLCoros::setStackSize(), with a compile-time default value we hope
      we never have to use. Make LLAppViewer call it with the value of the new
      settings variable CoroutineStackSize as soon as we've read settings files.
      (While we're at it, notify interested parties that we've read settings files.)
      Give CoroutineStackSize a default value four times the previous default stack
      size. Make LLCoros::launch() pass the saved stack size to each new coroutine
      instance.
      Re-enable lleventcoro integration test. Use LLSDMap() construct rather than
      LLSD::insert(), which used to return the modified object but is now void.
      3be79d53
  11. Mar 29, 2013
  12. Feb 21, 2013
    • Nat Goodspeed's avatar
      MAINT-2389: Change viewer to Boost package without ucontext.h. · 54e2d2b0
      Nat Goodspeed authored
      In autobuild.xml, specify today's build of the Boost package that includes the
      Boost.Context library, and whose boost::dcoroutines library uses Boost.Context
      exclusively instead of its previous context-switching underpinnings (source of
      the ucontext.h dependency).
      Add BOOST_CONTEXT_LIBRARY to Boost.cmake and Copy3rdPartyLibs.cmake. Link it
      with the viewer and with the lllogin.cpp test executable.
      Track new Boost package convention that our (early, unofficial) Boost.Coroutine
      library is now accessed as boost/dcoroutine/etc.h and boost::dcoroutines::etc.
      Remove #include <boost/coroutine/coroutine.hpp> from
      llviewerprecompiledheaders.h and lllogin.cpp: old rule that Boost.Coroutine
      header must be #included before anything else that might use ucontext.h is
      gone now that we no longer depend on ucontext.h. In fact remove
      -D_XOPEN_SOURCE in 00-Common.cmake because that was inserted specifically to
      work around a known problem with the ucontext.h facilities.
      54e2d2b0
  13. Oct 13, 2010
  14. Sep 21, 2010
  15. Aug 13, 2010
  16. Nov 18, 2009
  17. Jul 01, 2009
  18. Jun 04, 2009
    • Nat Goodspeed's avatar
      DEV-32777: Use a canonical boost::coroutines::coroutine signature, relying on · 820d4a20
      Nat Goodspeed authored
      boost::bind() to pass any other coroutine arguments. This allows us to remove
      the LLCoroBase and LLCoro constructs, directly storing a coroutine object in
      our ptr_map. It also allows us to remove the multiple launch() overloads for
      multiple arguments. Finally, it lets us move most launch() functionality into
      a non-template method.
      820d4a20
  19. Jun 03, 2009
    • Nat Goodspeed's avatar
      DEV-32777: Introduce LLCoros, an LLSingleton registry of named coroutine · 285613b8
      Nat Goodspeed authored
      instances. LLCoros::launch() intends to address three issues:
      - ownership of coroutine instance
      - cleanup of coroutine instance when it terminates
      - central place to twiddle MSVC optimizations to bypass DEV-32777 crash.
      Initially coded on Mac; will address the third bullet on Windows.
      Adapt listenerNameForCoro() to consult LLCoros::getName() if applicable.
      Change LLLogin::Impl::connect() to use LLCoros::launch().
      LLCoros::getName() relies on patch to boost::coroutines::coroutine::self to
      introduce get_id().
      285613b8
Loading