Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 11 Jul 2010 17:04:51 -0700
From:      Garrett Cooper <yanegomi@gmail.com>
To:        Alexander Kabaev <kabaev@gmail.com>
Cc:        Kostik Belousov <kostikbel@gmail.com>, hackers@freebsd.org
Subject:   Re: *sigpause hanging on 8.x+
Message-ID:  <AANLkTinWFUMqtIXxjO57SprlLuGXtSx-NosiZO2__ih_@mail.gmail.com>
In-Reply-To: <AANLkTim5NnLeL5zqCuOqCD42KDGoQOBrCDC63mf5TBKw@mail.gmail.com>
References:  <AANLkTikfxu3BjQE4nnNJ-VeNSDy9vhfXEhY1XQ4jWtY4@mail.gmail.com> <20100711210843.GQ2408@deviant.kiev.zoral.com.ua> <AANLkTimjk7oJKlB7YCrZimMsTQtvKIxipZtfBfpIdSz3@mail.gmail.com> <20100711214016.GR2408@deviant.kiev.zoral.com.ua> <AANLkTik79TZiA0CLubDgVpp8hY4M_C9LnQIIOKmMQ1In@mail.gmail.com> <AANLkTin8xa-wgdB9QsPszN1pdqLJR7V6DNkQCEbjsPEH@mail.gmail.com> <20100711191727.61c812cb@kan.dnsalias.net> <AANLkTim5NnLeL5zqCuOqCD42KDGoQOBrCDC63mf5TBKw@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sun, Jul 11, 2010 at 4:19 PM, Garrett Cooper <yanegomi@gmail.com> wrote:
> 2010/7/11 Alexander Kabaev <kabaev@gmail.com>:
>> On Sun, 11 Jul 2010 15:59:05 -0700
>> Garrett Cooper <yanegomi@gmail.com> 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 <errno.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>

#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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?AANLkTinWFUMqtIXxjO57SprlLuGXtSx-NosiZO2__ih_>