From owner-freebsd-hackers@FreeBSD.ORG Mon Jul 12 00:04:52 2010 Return-Path: Delivered-To: hackers@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id B6987106564A for ; Mon, 12 Jul 2010 00:04:52 +0000 (UTC) (envelope-from yanegomi@gmail.com) Received: from mail-iw0-f182.google.com (mail-iw0-f182.google.com [209.85.214.182]) by mx1.freebsd.org (Postfix) with ESMTP id 407068FC12 for ; Mon, 12 Jul 2010 00:04:52 +0000 (UTC) Received: by iwn35 with SMTP id 35so5078863iwn.13 for ; Sun, 11 Jul 2010 17:04:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:received:in-reply-to :references:date:message-id:subject:from:to:cc:content-type :content-transfer-encoding; bh=gkT1adOMPBp7M0iu54tw44nPrJPrDtOKU38h47mFWd8=; b=BIBSRjDxmrGrCj6HpEiX+DhyHD/pTGBsey+1CvrNsHrEbyAF1zz8MZauFSPXW96tWz Thi4IqVI1oOFWVEXT/8US/120vHTSOprvd/lZHnrv+8N6QASEShybBaZalDydNQlgjGI HVeqOD58SDwV1U2ZDzfachz96yr5QxObdxpUc= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type:content-transfer-encoding; b=elR05M5ACnSe3KC2Rd4f+ur06mB/7eVHZQ+zsIi+2222eJ0QW7U5Yrp3eRN3ssn5c1 epdubHRhURJZg0RSkOQCSvBdysCbxrUY6FD75QRf2RGQzJCumePOSju9yHFsu1Bda1yD KhbAGQPx+mg2alomfJdvVZ1cTLCt7jVOKWDPc= MIME-Version: 1.0 Received: by 10.231.155.131 with SMTP id s3mr13171897ibw.2.1278893091565; Sun, 11 Jul 2010 17:04:51 -0700 (PDT) Received: by 10.231.182.74 with HTTP; Sun, 11 Jul 2010 17:04:51 -0700 (PDT) In-Reply-To: References: <20100711210843.GQ2408@deviant.kiev.zoral.com.ua> <20100711214016.GR2408@deviant.kiev.zoral.com.ua> <20100711191727.61c812cb@kan.dnsalias.net> Date: Sun, 11 Jul 2010 17:04:51 -0700 Message-ID: From: Garrett Cooper To: Alexander Kabaev Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Cc: Kostik Belousov , hackers@freebsd.org Subject: Re: *sigpause hanging on 8.x+ X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 12 Jul 2010 00:04:52 -0000 On Sun, Jul 11, 2010 at 4:19 PM, Garrett Cooper wrote: > 2010/7/11 Alexander Kabaev : >> On Sun, 11 Jul 2010 15:59:05 -0700 >> Garrett Cooper wrote: >> >>> > + =A0 =A0 =A0 if (!_SIG_VALID(how)) >>> > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 return (-EINVAL); >> >> -EINVAL? Smells too much of Linux, try returning EINVAL instead. > > Wow, I'm batting 1,000 today. Please completely ignore my previous > claim about sigprocmask(2) -- I'm screwing up my function calls. So after writing more correct tests, everything's fine with sig{add,del}set, as expected: $ cat ~/test_sigaddset.c #include #include #include #include #define TEST_SIGADDSET_POS(signo) do { \ printf("signo =3D %d : ", signo); \ sigemptyset(&set); \ errno =3D 0; \ rc =3D sigaddset(&set, signo); \ if (rc !=3D 0) { \ printf("result not sane (%d !=3D 0, errno: %d)\n",\ rc, errno); \ } else \ printf("result sane\n"); \ } while (0) #define TEST_SIGADDSET_NEG(signo) do { \ printf("signo =3D %d : ", signo); \ sigemptyset(&set); \ errno =3D 0; \ rc =3D sigaddset(&set, signo); \ if (rc !=3D -1 || errno !=3D EINVAL) { \ printf("result not sane (%d !=3D -1, " \ "errno: %d !=3D EINVAL)\n", \ rc, errno); \ } else \ printf("result sane\n"); \ } while (0) #define TEST_SIGDELSET_POS(signo) do { \ printf("signo =3D %d : ", signo); \ sigemptyset(&set); \ errno =3D 0; \ rc =3D sigdelset(&set, signo); \ if (rc !=3D 0) { \ printf("result not sane (%d !=3D 0, errno: %d)\n",\ rc, errno); \ } else \ printf("result sane\n"); \ } while (0) #define TEST_SIGDELSET_NEG(signo) do { \ printf("signo =3D %d : ", signo); \ sigemptyset(&set); \ errno =3D 0; \ rc =3D sigdelset(&set, signo); \ if (rc !=3D -1 || errno !=3D EINVAL) { \ printf("result not sane (%d !=3D -1, " \ "errno: %d !=3D EINVAL)\n", \ rc, errno); \ } else \ printf("result sane\n"); \ } while (0) int main(void) { sigset_t set; int rc; TEST_SIGADDSET_NEG(-1); TEST_SIGADDSET_NEG(0); TEST_SIGADDSET_POS(SIGHUP); /* The system quietly disallows SIGKILL or SIGSTOP to be blocked. */ TEST_SIGADDSET_POS(SIGKILL); TEST_SIGADDSET_POS(SIGSTOP); TEST_SIGADDSET_POS(SIGRTMIN-1); TEST_SIGADDSET_POS(SIGRTMIN); TEST_SIGADDSET_POS(SIGRTMIN+1); TEST_SIGADDSET_POS(SIGRTMAX); TEST_SIGDELSET_NEG(-1); TEST_SIGDELSET_NEG(0); TEST_SIGDELSET_POS(SIGHUP); /* The system quietly disallows SIGKILL or SIGSTOP to be blocked. */ TEST_SIGDELSET_POS(SIGKILL); TEST_SIGDELSET_POS(SIGSTOP); TEST_SIGDELSET_POS(SIGRTMIN-1); TEST_SIGDELSET_POS(SIGRTMIN); TEST_SIGDELSET_POS(SIGRTMIN+1); TEST_SIGDELSET_POS(SIGRTMAX); return (0); } $ ~/test_sigadddelset signo =3D -1 : result sane signo =3D 0 : result sane signo =3D 1 : result sane signo =3D 9 : result sane signo =3D 17 : result sane signo =3D 64 : result sane signo =3D 65 : result sane signo =3D 66 : result sane signo =3D 126 : result sane signo =3D -1 : result sane signo =3D 0 : result sane signo =3D 1 : result sane signo =3D 9 : result sane signo =3D 17 : result sane signo =3D 64 : result sane signo =3D 65 : result sane signo =3D 66 : result sane signo =3D 126 : result sane POSIX spec actually says: The range SIGRTMIN through SIGRTMAX inclusive shall include at least {RTSIG_MAX} signal numbers. POSIX is vague on how many numbers RTSIG_MAX is (it's implementation defined and retrievable via sysconf). Thanks, -Garrett