From owner-freebsd-hackers@freebsd.org Fri Aug 24 14:53:58 2018 Return-Path: Delivered-To: freebsd-hackers@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 1B990108C085 for ; Fri, 24 Aug 2018 14:53:58 +0000 (UTC) (envelope-from 6yearold@gmail.com) Received: from mail-pg1-x530.google.com (mail-pg1-x530.google.com [IPv6:2607:f8b0:4864:20::530]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client CN "smtp.gmail.com", Issuer "Google Internet Authority G3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 9405F894F4 for ; Fri, 24 Aug 2018 14:53:56 +0000 (UTC) (envelope-from 6yearold@gmail.com) Received: by mail-pg1-x530.google.com with SMTP id z25-v6so4412642pgu.7 for ; Fri, 24 Aug 2018 07:53:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:from:date:message-id:subject:to; bh=L1hkVHz5eDKQfe0x2eOjCKPtY6zTTF60dk/fVrSxVdg=; b=oRwXWglcZX+klMSoCZFjfF8KkkkRIXjh+vpxPJNpDQmKN25FwWEiaUJajHQYqo8aoF kw8hJgvbDzozzmYpe5I/5PzFrRBGc8f7O3gQjdUnfXThg/vswwFxkW7XFGDyLNQRaU9x 2w6R2mAOIRQPVOfSn17XsOtfKoZ5aycFUwvc5UiXiFpZdAdD/9DzZVh3wvHWSoH1PbOm eOsEDURyDvGUu6w4ynOJAJr9fqN8Cs3ZdXetVV27v50C3Ocl3bUqpFJbjXBdIo3YUpMP AJ43mNwNpMOGeTwI6/AsYWEECq2OI5CdLPtN8YJPkC+fKKHcKXwQECjCpJeaduh4NQDL z82w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=L1hkVHz5eDKQfe0x2eOjCKPtY6zTTF60dk/fVrSxVdg=; b=rPn0BV+cG/OupnOCLF17kQIXWrTzySCZHwdaWtywHmEQYJ46dWry+/OsHeLjEdKKSV 4KjB7OwZsKA64JeKU/3FGIlnA/QnHRfFtiP0hdb1ocnp2XHhkk+BMsegHZB5mpFo1tte DxqnLCEEiTQTmKtpeSldwX45etCpWHCltPD3iWCbtU6IyeCcBkgaQQV+6m/RujLAXtO4 rqFAyI+JoDGGFDInaMOTyjETBgPhFiwrooNTYqUEffUrqL1jDcfmkDsomrLzs+Xa+46C ftcZ3Xbde1YPt45Xqr4NG4fw137+F5RIVT6NyUDZjfQryTXmhUuxpihPSIg8+jonjSOn Vmrg== X-Gm-Message-State: APzg51Ai7C98/7P/5nEGTeCMQOWWJmRvG+lT0p6meC74M98HBPgCVnC1 lMWeHgtv+0Y75s5H12ze16XVM/Kkk8CC9HFxLPYxr47+908= X-Google-Smtp-Source: ANB0Vdb2Bh5XuZo5yRsifFB7QvoTWkI707ZEzKiLxGFaCrW1GBu9DlZMbFVf40TW71v5ahzKllKatDMSZDP3Pm5cnqM= X-Received: by 2002:a62:4fd9:: with SMTP id f86-v6mr2394653pfj.110.1535122435431; Fri, 24 Aug 2018 07:53:55 -0700 (PDT) MIME-Version: 1.0 From: Gleb Popov <6yearold@gmail.com> Date: Fri, 24 Aug 2018 17:53:28 +0300 Message-ID: Subject: Strange hang when calling signal() To: freebsd-hackers X-Mailman-Approved-At: Fri, 24 Aug 2018 15:01:13 +0000 Content-Type: text/plain; charset="UTF-8" X-Content-Filtered-By: Mailman/MimeDel 2.1.27 X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.27 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 24 Aug 2018 14:53:58 -0000 I'm debugging a Qt test app that hangs when launching a QProcess. The parent does the following: QProcess p; ... p.start(); p.waitForStarted(-1); // wait indefinitely Under the hood starting the QProcess involves creating a pair of pipes and forking: qt_create_pipe(childStartedPipe); ... pid_t childPid; ::forkfd(FFD_CLOEXEC, &childPid); and waiting for it to be started is just ppoll()'ing on the pipe pollfd pfd = qt_make_pollfd(childStartedPipe[0], POLLIN); if (qt_poll_msecs(&pfd, 1, msecs) == 0) { ... On the child side the code looks like ::signal(SIGPIPE, SIG_DFL); ... qt_safe_close(childStartedPipe[0]); ... qt_safe_execv(argv[0], argv); So, the problem is that after forking the parent process hangs on polling and child process hangs inside signal call; Here is the backtrace: #0 _umtx_op_err () at /usr/src/lib/libthr/arch/amd64/amd64/_umtx_op_err.S:37 #1 0x0000000802bd9571 in __thr_rwlock_rdlock (rwlock=0x802bf3200, flags=, tsp=) at /usr/src/lib/libthr/thread/thr_umtx.c:307 #2 0x0000000802be24c0 in _thr_rwlock_rdlock (flags=0, tsp=0x0, rwlock=) at /usr/src/lib/libthr/thread/thr_umtx.h:232 #3 _thr_rtld_rlock_acquire (lock=0x802bf3200) at /usr/src/lib/libthr/thread/thr_rtld.c:125 #4 0x000000080024e63b in rlock_acquire (lock=0x80025f0a0 , lockstate=0x7fffffffc678) at /usr/src/libexec/rtld-elf/rtld_lock.c:208 #5 0x00000008002472dd in _rtld_bind (obj=0x80027b000, reloff=4416) at /usr/src/libexec/rtld-elf/rtld.c:788 #6 0x000000080024404d in _rtld_bind_start () at /usr/src/libexec/rtld-elf/amd64/rtld_start.S:121 #7 0x0000000803d31a76 in QProcessPrivate::execChild (this=0x81a9716c0, workingDir=0x0, argv=0x81fde5760, envp=0x0) at io/qprocess_unix.cpp:537 Any idea what causes signal() to not return? I haven't extracted a minimal repro yet, wanted to ask for any clues first. The code in question is here: https://github.com/qt/qtbase/blob/5.11/src/corelib/io/qprocess_unix.cpp Relevant functions are QProcessPrivate::startProcess(), QProcessPrivate::execChild(), QProcessPrivate::waitForStarted(). Thanks in advance.