Mirror of the lttng-dev mailing list
 help / color / mirror / Atom feed
From: "Moessbauer, Felix via lttng-dev" <lttng-dev@lists.lttng.org>
To: Simon Marchi <simark@simark.ca>,
	"lttng-dev@lists.lttng.org" <lttng-dev@lists.lttng.org>
Subject: Re: libbabeltrace2: question about thread safety
Date: Fri, 6 Nov 2026 08:57:21 +0000	[thread overview]
Message-ID: <e78314ce6644c53ec7dda1e1761e37e58a4c7011.camel@siemens.com> (raw)
In-Reply-To: <4b159ade-97af-4008-be23-c81be291f948@simark.ca>

On Thu, 2026-11-05 at 14:47 -0500, Simon Marchi wrote:
> On 10/23/26 4:11 AM, MOESSBAUER, Felix via lttng-dev wrote:
> > Hi,
> > 
> > I just noticed that the reference counting in libbabeltrace2 is not
> > atomic - and by that not thread safe. As I can't know where reference
> > counting on global objects (like the plugin or component instances) is
> > done internally, I'm assuming I can't execute two (independent) graphs
> > in parallel. Some quick tests with tsan seem to confirm my assumption.
> > 
> > Is there any (documented) way to run two graphs in parallel? Or shall
> > the whole library just be used behind a global mutex?
> 
> I think the idea was that running two graphs simultaneously in two
> threads would not be a problem, because they don't share anything.  But
> you are right that plugins and component classes are actually shared.
> The action of adding a component to a graph touches the component class'
> refcount, and so does destroying the graph (and there is the "freeze"
> status too, if the lib is built in dev mode).

Hi, thanks for the clarification. This behavior should at least be
documented.

> 
> I think it would make sense for libbabeltrace2 to have some
> synchronization in the plugin / component class area to allow for two
> threads to build, run and destroy graphs without requiring any locking
> on the user side.  But that won't be trivial, and it's not on the
> roadmap as we speak.

Without looking into it more deeply, I guess just making the ref
counting atomic would be sufficient. That should be a rather small
change with a minimal performance impact on modern platforms.

> 
> In the mean time, you could try having a global lock but only for the
> graph building and destruction phases?  Or have a single thread
> responsible for building and destroying graphs.  I'd be curious to know
> if this is enough or if there are other concurrent accesses we haven't
> spotted.

As I was unsure what exactly is shared, I just moved the graph
processing to individual processes (the processing is done as part of
an HTTP MCP server, so I expect multiple calls to arrive in parallel).

PS: While this solves the race conditions on the refcounting, it does
not help to speedup the graph processing, as this still happens
sequentially. Ideally that could be parallelized as well, especially as
we know the graph layout upfront.

Felix

> 
> Simon

      parent reply	other threads:[~2026-11-06  8:57 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-23  8:11 MOESSBAUER, Felix via lttng-dev
2026-11-05 19:48 ` Simon Marchi via lttng-dev
     [not found] ` <4b159ade-97af-4008-be23-c81be291f948@simark.ca>
2026-11-06  8:57   ` Moessbauer, Felix via lttng-dev [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=e78314ce6644c53ec7dda1e1761e37e58a4c7011.camel@siemens.com \
    --to=lttng-dev@lists.lttng.org \
    --cc=felix.moessbauer@siemens.com \
    --cc=simark@simark.ca \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox