NetBSD Problem Report #45131

From www@NetBSD.org  Sun Jul 10 09:27:42 2011
Return-Path: <www@NetBSD.org>
Received: from mail.netbsd.org (mail.netbsd.org [204.152.190.11])
	by www.NetBSD.org (Postfix) with ESMTP id 3ECD963C12E
	for <gnats-bugs@gnats.NetBSD.org>; Sun, 10 Jul 2011 09:27:42 +0000 (UTC)
Message-Id: <20110710092741.8B74D63B8E2@www.NetBSD.org>
Date: Sun, 10 Jul 2011 09:27:41 +0000 (UTC)
From: o.vd.linden@quicknet.nl
Reply-To: o.vd.linden@quicknet.nl
To: gnats-bugs@NetBSD.org
Subject: csup hangs while trying to exit
X-Send-Pr-Version: www-1.0

>Number:         45131
>Category:       pkg
>Synopsis:       csup hangs while trying to exit
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    imil
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Sun Jul 10 09:30:00 +0000 2011
>Closed-Date:    
>Last-Modified:  Mon Apr 09 18:20:02 +0000 2012
>Originator:     Onno van der Linden
>Release:        5.99.53 i386
>Organization:
>Environment:
NetBSD sheep 5.99.53 NetBSD 5.99.53 (SHEEP) #0: Thu Jun 16 21:15:01 MEST 2011  onno@sheep:/usr/src/sys/arch/i386/compile/SHEEP i386
>Description:
csup hangs after calling pthread_join() in killer_stop() when it is trying to cancel the killer thread  before exiting.

>How-To-Repeat:
csup to an available cvsup server 
>Fix:
Adding a pthread_testcancel() call works for me. Additional check
for error == ECANCELED and calling pthread_testcancel() if true
is another way of fixing it

*** proto.c.orig        Sun Jul 10 11:13:59 2011
--- proto.c     Sun Jul 10 11:15:01 2011
***************
*** 968,973 ****
--- 968,974 ----
        k = arg;
  again:
        error = sigwait(&k->sigset, &sig);
+       pthread_testcancel();
        assert(!error);
        if (sig == SIGINT || sig == SIGHUP || sig == SIGTERM) {
                if (k->killedby == -1) {


>Release-Note:

>Audit-Trail:

Responsible-Changed-From-To: pkg-manager->imil
Responsible-Changed-By: wiz@NetBSD.org
Responsible-Changed-When: Sun, 10 Jul 2011 17:00:36 +0000
Responsible-Changed-Why:
Over to maintainer.


From: Onno van der Linden <o.vd.linden@quicknet.nl>
To: gnats-bugs@netbsd.org
Cc: 
Subject: Re: pkg/45131
Date: Wed, 13 Jul 2011 22:28:56 +0200

 I don't think the csup code needs pthread_testcancel()
 in killer_stop(). It looks like libpthread/pthread_cancelstub.c
 needs an additional entry for sigwait().

 Onno


==

I made the following diff after Onno's recommendation. 

Hisashi T Fujinaka kindly tested it, and reports that it fixes csup.

It'd be great to get some more eyes on this one.

Thanks,
Alistair

Index: pthread_cancelstub.c
===================================================================
RCS file: /cvsroot/src/lib/libpthread/pthread_cancelstub.c,v
retrieving revision 1.35
diff -u -r1.35 pthread_cancelstub.c
--- pthread_cancelstub.c	22 Apr 2011 14:18:34 -0000	1.35
+++ pthread_cancelstub.c	2 Apr 2012 22:45:57 -0000
@@ -58,6 +58,7 @@
 #include <sys/uio.h>
 #include <sys/wait.h>
 #include <aio.h>
+#include <errno.h>
 #include <fcntl.h>
 #include <mqueue.h>
 #include <poll.h>
@@ -577,6 +578,7 @@
 	pthread_t self;
 	int retval;
 	struct timespec tout, *tp;
+
 	if (timeout) {
 		tout = *timeout;
 		tp = &tout;
@@ -591,6 +593,28 @@
 	return retval;
 }

+int                                                                                                                  
+sigwait(const sigset_t * __restrict set, int * __restrict sig)
+{
+	pthread_t	self;
+	int		saved_errno;
+	int		new_errno;
+	int		retval;
+
+	self = pthread__self();
+	saved_errno = errno;
+	TESTCANCEL(self);
+	retval = ____sigtimedwait50(set, NULL, NULL);
+	TESTCANCEL(self);
+	new_errno = errno;
+	errno = saved_errno;
+	if (retval < 0) {
+		return new_errno;
+	}
+	*sig = retval;
+	return 0;
+}
+
 __strong_alias(_close, close)
 __strong_alias(_fcntl, fcntl)
 __strong_alias(_fdatasync, fdatasync)
@@ -608,6 +632,7 @@
 __strong_alias(_pwrite, pwrite)
 __strong_alias(_read, read)
 __strong_alias(_readv, readv)
+__strong_alias(_sigwait, sigwait)
 __strong_alias(_write, write)
 __strong_alias(_writev, writev)

State-Changed-From-To: open->analyzed
State-Changed-By: agc@NetBSD.org
State-Changed-When: Tue, 03 Apr 2012 04:19:43 +0000
State-Changed-Why:
Onno v d Linden analyzed it, and a diff has been included which implements
sigwait() in libpthreads' cancelstubs


From: "Alistair G. Crooks" <agc@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
Cc: 
Subject: PR/45131 CVS commit: src/lib/libpthread
Date: Wed, 4 Apr 2012 06:29:17 +0000

 Module Name:	src
 Committed By:	agc
 Date:		Wed Apr  4 06:29:17 UTC 2012

 Modified Files:
 	src/lib/libpthread: pthread_cancelstub.c

 Log Message:
 Add a pthread cancel stub for sigwait, following Onno van der Linden's
 analysis in PR 45131.  Kindly tested by Hisashi T Fujinaka (using csup
 as the test case) with a successful outcome.

 OK martin@


 To generate a diff of this commit:
 cvs rdiff -u -r1.35 -r1.36 src/lib/libpthread/pthread_cancelstub.c

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.

State-Changed-From-To: analyzed->feedback
State-Changed-By: agc@NetBSD.org
State-Changed-When: Wed, 04 Apr 2012 16:22:10 +0000
State-Changed-Why:
It's already been reported to work, but let's have some more feedback...


From: Onno van der Linden <o.vd.linden@quicknet.nl>
To: gnats-bugs@NetBSD.org
Cc: 
Subject: Re: pkg/45131 (csup hangs while trying to exit)
Date: Thu, 5 Apr 2012 17:12:03 +0200

 On Wed, Apr 04, 2012 at 04:22:11PM +0000, agc@NetBSD.org wrote:
 > Synopsis: csup hangs while trying to exit
 > 
 > State-Changed-From-To: analyzed->feedback
 > State-Changed-By: agc@NetBSD.org
 > State-Changed-When: Wed, 04 Apr 2012 16:22:10 +0000
 > State-Changed-Why:
 > It's already been reported to work, but let's have some more feedback...

 And here's my confirmation that it works.

 Thanks,

 Onno

From: Robert Elz <kre@munnari.OZ.AU>
To: gnats-bugs@NetBSD.org
Cc: 
Subject: Re: pkg/45131 (csup hangs while trying to exit)
Date: Sat, 07 Apr 2012 08:21:39 +0700

     Date:        Thu,  5 Apr 2012 15:15:04 +0000 (UTC)
     From:        Onno van der Linden <o.vd.linden@quicknet.nl>
     Message-ID:  <20120405151504.35A8263B946@www.NetBSD.org>

   |  On Wed, Apr 04, 2012 at 04:22:11PM +0000, agc@NetBSD.org wrote:
   |  > Synopsis: csup hangs while trying to exit
   |  > 
   |  > It's already been reported to work, but let's have some more feedback...
   |  
   |  And here's my confirmation that it works.

 I believe it is only fixed in NetBSD current, right?   The package still
 either needs a patch, or to be marked NOT_FOR_PLATFORM for NetBSD
 up to (and including) NetBSD 6, right?   I expect that a pullup of the
 fix for NetBSD 6 before it is released might be likely, but there's
 nothing that you can do for NetBSD 5 (the bug can be fixed in some later
 NetBSD 5 release, but nothing is going to change the existing ones).

 I don't even want to think about NetBSD 4 and its somewhat different threading.

 kre

State-Changed-From-To: feedback->open
State-Changed-By: dholland@NetBSD.org
State-Changed-When: Mon, 09 Apr 2012 08:10:24 +0000
State-Changed-Why:
the fix in base works, but we also need a patch in the package like the
original suggestion.


From: "Jeff Rizzo" <riz@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
Cc: 
Subject: PR/45131 CVS commit: [netbsd-6] src/lib/libpthread
Date: Mon, 9 Apr 2012 18:15:28 +0000

 Module Name:	src
 Committed By:	riz
 Date:		Mon Apr  9 18:15:28 UTC 2012

 Modified Files:
 	src/lib/libpthread [netbsd-6]: pthread_cancelstub.c

 Log Message:
 Pull up following revision(s) (requested by agc in ticket #174):
 	lib/libpthread/pthread_cancelstub.c: revision 1.36
 Add a pthread cancel stub for sigwait, following Onno van der Linden's
 analysis in PR 45131.  Kindly tested by Hisashi T Fujinaka (using csup
 as the test case) with a successful outcome.
 OK martin@


 To generate a diff of this commit:
 cvs rdiff -u -r1.35 -r1.35.6.1 src/lib/libpthread/pthread_cancelstub.c

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.

>Unformatted:

NetBSD Home
NetBSD PR Database Search

(Contact us) $NetBSD: query-full-pr,v 1.39 2013/11/01 18:47:49 spz Exp $
$NetBSD: gnats_config.sh,v 1.8 2006/05/07 09:23:38 tsutsui Exp $
Copyright © 1994-2007 The NetBSD Foundation, Inc. ALL RIGHTS RESERVED.