Date: prev next · Thread: first prev next last
2013 Archives by date, by thread · List index



On Tue, 2013-05-14 at 11:49 +0200, Stephan Bergmann wrote:
Historically, the SolarMutex was assumed to be a clever solution to the 
problem of turning StarOffice from a single-threaded application to a 
multi-threaded one---lock the SolarMutex around any code that is not yet 
thread-safe, and be done with it.  Or so people thought.

        Hah :-)

The world has long since found out that "single global mutex" is a 
horrible idea for GUI applications (where all GUI frameworks have 
settled on "confine relevant code to run in a single event-loop thread" 
instead).

        Quite; then again - the next big, clever idea was to have highly
granular threading - with thread/re-enterancy hazards at every single
UNO method call :-) The combination of these two brainwaves makes
~everything a nightmare :-)

This leaves us with completely unmaintainable ("where do I need to lock 
SolarMutex?"---"nobody knows for sure") and broken (cf. 
SolarMutexReleaser) code.

        Right. So - here are the rules that I'm sticking to:

        * anything that calls anything that does anything with vcl -
          and anything that depends on / uses it needs to hold the
          SolarMutex

        * If you think you need to use the SolarMutexReleaser you
          probably don't & seek expert help ;-)

          The releaser is designed to fully drop the (recusive)
          SolarMutex to allow another thread to take the toolkit
          lock while we're waiting in the VCL main-loop. The VCL
          main-loop does this itself FWIW.

                => in general if you grab the SolarMutex from another
                   thread, you will block until the (or sadly possibly
                   an inferior) main-loop is idle and then you can do
                   your work.

        * Lock ordering is a nightmare - there is no lock ordering;
          the whole threading situation is built on optimism and a
          lack of rigour:
                Luckily the SolarMutex is (almost always) held, so
                in general, take it first: since that's almost
                certainly a no-op ;-)

        In terms of a sensible future for this, here is my crazy idealistic
plan (some of which overlaps with Kai's appartment work):

        A give up pretending we're a multi-threaded application:
           we are not - we are 1 + epsilon threaded.

        B handle legacy UNO contracts relied on by StarBasic / Java etc.
          around threading by pushing any UNO method on an object that
          is not "on" the main-thread into an idle handler, and proxying
          the return [ for now we could just take the Solar mutex there
          - and call that 'entering the main appartment' ;-]
                + the apartment idea ~could/should do this.

        C audit / retain the very-few pieces of code that are genuinely
          thread-safe and actually useful that way: low-level pieces
          of the UNO core, package2/ ucb/ configmgr2/ etc. seem
          reasonably plausible: though locking clearly brings a per-call
          cost.

        D audit all non-UNO threads (there are not so many - IIRC there
          was one in the gallery). Ensure that they are split into
          non-GUI worker threads and idle callbacks

                NB. our 'idle' story is -utterly- lame we need strong
                priorities, instead of horrible fixed-time time-outs
                cf. the unbelievable VCL re-size/paint timers ;-)

        E remove all locking everywhere else ;-)

        At this point we finally have a reasonably consistent and sensible
threading story :-) Then we can start to add threading where it actually
makes sense :-) [ something we actually need to do ] - and do it without
using any over-complicated, over-granular, and over-general solutions.

        A few places where threading probably makes sense are:

        + the UNO core to meet back-compat guarentees
        + the calc computation core
        + image de-compression / scaling
        + splitting:
                I/O -> unzip -> XML parse + namespage -> fast-parser
                from - interpreting that XML in the core.
        + cores of applications from their rendering / presentation
                [ this is a bigger one - use the Fennec approach to
                  have your zoom/pan/scroll code use rendered tiles of
                  document data produced by the "big uniprocess core" ]
                [ this way you can make pan / scroll ultra smooth even
                  while the core is busy working ].

        That at least would be my vision :-) I'd -love- help starting to get
there. Some parts of it can be worked on today with minimal pain.

        D - for example would be easy and is nicely separable; indeed someone
building a list of all spawned threads, where they are spawned from, and
what they actually do across the code would be -really- nice and useful
to scope the work. Getting a good 'idle' story would probably help
responsiveness and rendering significantly too ... and is nicely
separable as a task :-)

        HTH,

                Michael.

-- 
michael.meeks@suse.com  <><, Pseudo Engineer, itinerant idiot


Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.