NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: pkg/54192: lang/rust build error



The following reply was made to PR toolchain/54192; it has been noted by GNATS.

From: Kamil Rytarowski <n54%gmx.com@localhost>
To: "gnats-bugs%NetBSD.org@localhost" <gnats-bugs%NetBSD.org@localhost>
Cc: 
Subject: Re: pkg/54192: lang/rust build error
Date: Wed, 16 Oct 2019 16:05:50 +0200

 On 16.10.2019 15:56, Kamil Rytarowski wrote:
 > On 16.10.2019 15:50, Martin Husemann wrote:
 >> Since it was not obvious to me, let me try to explain what happens:
 >>
 >> =C2=A0 - a multithreaded program calls fork()
 >> =C2=A0 - the forked child process only has a single lwp initially, wich=
  has
 >> lid 1
 >>
 >> So in the parent thread _lwp_self() (aka lid) was !=3D 1, and now in th=
 e
 >> child
 >> it has changed. Apparently something in ld.elf_so goes wrong later when
 >> using _lwp_self() =3D=3D 1 with a memory state inherited that was setup=
  for
 >> _lwp_self() !=3D 1.
 >>
 >> Joergs patch makes the single lwp inherit the lid from the forking pare=
 nt
 >> thread (instead of always being 1).
 >>
 >> Martin
 >>
 >
 > This is right behavior of the kernel.
 >
 > The same will happen on FreeBSD (lwpid is always unique globally), on
 > Linux (getpid is always unique) etc.
 >
 > If there is some assumption in NetBSD on copied lid, it's a bug in
 > ld.elf_so.
 
 Proof from FreeBSD:
 
 $ cat test.c
 #include <pthread.h>
 #include <string.h>
 #include <stdio.h>
 #include <unistd.h>
 
 #include <sys/thr.h>
 
 static long
 _lwp_self(void)
 {
 	long Tid;
 	thr_self(&Tid);
 	return Tid;
 }
 
 void *thread_main(void *arg) {
    printf("child %ld\n", _lwp_self());
    if (fork() =3D=3D 0) {
       char buf[20];
       snprintf(buf, sizeof(buf), "child %ld\n", _lwp_self());
       write(1, buf, strlen(buf));
       _exit(0);
    }
    return 0;
 }
 
 int main(void) {
    printf("%ld\n", _lwp_self());
    pthread_t thread;
    pthread_create(&thread, NULL, thread_main, NULL);
    pthread_join(thread, NULL);
 }
 
 $ ./a.out
 100123
 child 100126
 child 100119
 
 I am strongly against changing the correct NetBSD kernel behavior here.
 


Home | Main Index | Thread Index | Old Index