https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113005
--- Comment #19 from Tobias Burnus <burnus at gcc dot gnu.org> ---
(In reply to Xi Ruoyao from comment #18)
> I get warnings like below after building both libgomp and the test program
> with tsan (following PR55561 comment 15):
>
> WARNING: ThreadSanitizer: lock-order-inversion (potential deadlock)
> (pid=867077)
> Cycle in lock order graph: M0 (0x7ffff0061550) => M1 (0x7fffebb270e0) => M0
This actually seems to be fine:
static gfc_unit *
get_gfc_unit (int n, int do_create)
{
...
RDLOCK (&unit_rwlock);
...
RD_TO_WRLOCK (&unit_rwlock);
...
p = insert_unit (n);
...
RWUNLOCK (&unit_rwlock);
}
and
static gfc_unit *
insert_unit (int n)
{
gfc_unit *u = xcalloc (1, sizeof (gfc_unit));
...
LOCK (&u->lock);
...
return u;
}
Namely: The outer lock of get_gfc_unit locks the unit handling to create a new
unit – and the inner one creates one and returns in the locked state.
Then the outer one unlocks the generic unit handling - while the actual unit
remains locked.