https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100352

--- Comment #4 from Tom de Vries <vries at gcc dot gnu.org> ---
Going through the lock lifetime using backtraces:
...
(gdb) watch ((pthread_mutex_t *) 0x6059d0)->__data.__lock 
Hardware watchpoint 2: ((pthread_mutex_t *) 0x6059d0)->__data.__lock
...

I. Locked from _gfortran_st_open:
...
(gdb) c
Continuing.
Hardware watchpoint 2: ((pthread_mutex_t *) 0x6059d0)->__data.__lock

Old value = 0
New value = 1
0x00007ffff6eb6896 in __lll_lock_elision (futex=0x6059d0,
adapt_count=<optimized out>, 
    private=0) at ../sysdeps/unix/sysv/linux/x86/elision-lock.c:106
106       return LLL_LOCK ((*futex), private);
(gdb) bt
#0  0x00007ffff6eb6896 in __lll_lock_elision (futex=0x6059d0,
adapt_count=<optimized out>, 
    private=0) at ../sysdeps/unix/sysv/linux/x86/elision-lock.c:106
#1  0x00007ffff7b64aaf in __gthread_mutex_lock (__mutex=0x6059d0)
    at ../libgcc/gthr-default.h:749
#2  0x00007ffff7b64e47 in insert_unit (n=10)
    at /home/vries/gcc_versions/devel/src/libgfortran/io/unit.c:244
#3  0x00007ffff7b65128 in get_gfc_unit (n=10, do_create=1)
    at /home/vries/gcc_versions/devel/src/libgfortran/io/unit.c:356
#4  0x00007ffff7b652d8 in _gfortrani_find_or_create_unit (n=10)
    at /home/vries/gcc_versions/devel/src/libgfortran/io/unit.c:421
#5  0x00007ffff7b58941 in _gfortran_st_open (opp=0x7fffffffd630)
    at /home/vries/gcc_versions/devel/src/libgfortran/io/open.c:889
#6  0x00000000004007f1 in MAIN__ ()
#7  0x00000000004008b7 in main ()
...

II. Unlocked from _gfortran_st_open:
...
(gdb) c
Continuing.
[New Thread 0x7ffff66bf700 (LWP 19890)]

Thread 1 "async_io_1.exe" hit Hardware watchpoint 2: ((pthread_mutex_t *)
0x6059d0)->__data.__lock

Old value = 1
New value = 0
0x00007ffff6eb690c in __lll_unlock_elision (lock=0x6059d0, private=0)
    at ../sysdeps/unix/sysv/linux/x86/elision-unlock.c:31
31          lll_unlock ((*lock), private);
(gdb) bt
#0  0x00007ffff6eb690c in __lll_unlock_elision (lock=0x6059d0, private=0)
    at ../sysdeps/unix/sysv/linux/x86/elision-unlock.c:31
#1  0x00007ffff7b64b03 in __gthread_mutex_unlock (__mutex=0x6059d0)
    at ../libgcc/gthr-default.h:779
#2  0x00007ffff7b65e5c in _gfortrani_unlock_unit (u=0x6058f0)
    at /home/vries/gcc_versions/devel/src/libgfortran/io/unit.c:772
#3  0x00007ffff7b58980 in _gfortran_st_open (opp=0x7fffffffd630)
    at /home/vries/gcc_versions/devel/src/libgfortran/io/open.c:894
#4  0x00000000004007f1 in MAIN__ ()
#5  0x00000000004008b7 in main ()
...

III. Locked from _gfortran_st_write:
...
(gdb) c
Continuing.

Thread 1 "async_io_1.exe" hit Hardware watchpoint 2: ((pthread_mutex_t *)
0x6059d0)->__data.__lock

Old value = 0
New value = 1
__lll_trylock_elision (futex=futex@entry=0x6059d0,
adapt_count=adapt_count@entry=0x6059e6)
    at ../sysdeps/unix/sysv/linux/x86/elision-trylock.c:75
75      }
(gdb) bt
#0  __lll_trylock_elision (futex=futex@entry=0x6059d0, 
    adapt_count=adapt_count@entry=0x6059e6)
    at ../sysdeps/unix/sysv/linux/x86/elision-trylock.c:75
#1  0x00007ffff6ead297 in __GI___pthread_mutex_trylock (mutex=0x6059d0)
    at ../nptl/pthread_mutex_trylock.c:71
#2  0x00007ffff7b64ad9 in __gthread_mutex_trylock (__mutex=0x6059d0)
    at ../libgcc/gthr-default.h:758
#3  0x00007ffff7b651d2 in get_gfc_unit (n=10, do_create=1)
    at /home/vries/gcc_versions/devel/src/libgfortran/io/unit.c:380
#4  0x00007ffff7b6588c in _gfortrani_get_unit (dtp=0x7fffffffd630, do_create=1)
    at /home/vries/gcc_versions/devel/src/libgfortran/io/unit.c:576
#5  0x00007ffff7b60d6d in data_transfer_init (dtp=0x7fffffffd630, read_flag=0)
    at /home/vries/gcc_versions/devel/src/libgfortran/io/transfer.c:2851
#6  0x00007ffff7b64154 in _gfortran_st_write (dtp=0x7fffffffd630)
    at /home/vries/gcc_versions/devel/src/libgfortran/io/transfer.c:4410
#7  0x000000000040083f in MAIN__ ()
#8  0x00000000004008b7 in main ()
...

IV: Unlocked from _gfortran_st_write_done:
...
(gdb) c
Continuing.

Thread 1 "async_io_1.exe" hit Hardware watchpoint 2: ((pthread_mutex_t *)
0x6059d0)->__data.__lock

Old value = 1
New value = 0
0x00007ffff6eb690c in __lll_unlock_elision (lock=0x6059d0, private=0)
    at ../sysdeps/unix/sysv/linux/x86/elision-unlock.c:31
31          lll_unlock ((*lock), private);
(gdb) bt
#0  0x00007ffff6eb690c in __lll_unlock_elision (lock=0x6059d0, private=0)
    at ../sysdeps/unix/sysv/linux/x86/elision-unlock.c:31
#1  0x00007ffff7b64b03 in __gthread_mutex_unlock (__mutex=0x6059d0)
    at ../libgcc/gthr-default.h:779
#2  0x00007ffff7b65e5c in _gfortrani_unlock_unit (u=0x6058f0)
    at /home/vries/gcc_versions/devel/src/libgfortran/io/unit.c:772
#3  0x00007ffff7b6445e in _gfortran_st_write_done (dtp=0x7fffffffd630)
    at /home/vries/gcc_versions/devel/src/libgfortran/io/transfer.c:4496
#4  0x0000000000400880 in MAIN__ ()
#5  0x00000000004008b7 in main ()
...

V. Unlocked again, from _gfortrani_st_write_done_worker:
...
(gdb) c
Continuing.

Thread 2 "async_io_1.exe" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffff66bf700 (LWP 19890)]
__lll_unlock_elision (lock=0x6059d0, private=0)
    at ../sysdeps/unix/sysv/linux/x86/elision-unlock.c:29
29          _xend();
(gdb) bt
#0  __lll_unlock_elision (lock=0x6059d0, private=0)
    at ../sysdeps/unix/sysv/linux/x86/elision-unlock.c:29
#1  0x00007ffff7b64b03 in __gthread_mutex_unlock (__mutex=0x6059d0)
    at ../libgcc/gthr-default.h:779
#2  0x00007ffff7b65e5c in _gfortrani_unlock_unit (u=0x6058f0)
    at /home/vries/gcc_versions/devel/src/libgfortran/io/unit.c:772
#3  0x00007ffff7b6434e in _gfortrani_st_write_done_worker (dtp=0x608170)
    at /home/vries/gcc_versions/devel/src/libgfortran/io/transfer.c:4466
#4  0x00007ffff7b71a99 in async_io (arg=0x6058f0)
    at /home/vries/gcc_versions/devel/src/libgfortran/io/async.c:120
#5  0x00007ffff6eaa4f9 in start_thread (arg=0x7ffff66bf700) at
pthread_create.c:465
#6  0x00007ffff6be2ecf in clone () at
../sysdeps/unix/sysv/linux/x86_64/clone.S:95

Reply via email to