Below is the sample code --
#include <stdio.h>
#include <errno.h>
#include <signal.h>
#include <string.h>
int main()
{
int retval = -1;
sigset_t allsig, oldsig;
printf("sizeof(sigset_t) = %d\n", sizeof(sigset_t));
sigfillset (&allsig);
retval = pthread_sigmask (SIG_SETMASK, &allsig, &oldsig);
printf("SIG_SETMASK = %d\n", SIG_SETMASK);
if (retval < 0)
{
printf("pthread_sigmask(): %s, errno = %d, retval = %d\n",
strerror(errno), errno, retval);
// return -1;
}
retval = pthread_sigmask (SIG_SETMASK, &oldsig, 0);
if (retval != 0)
{
printf("Restore sigmask: %s, errno = %d, retval = %d\n",
strerror(errno), errno, retval);
// return -1;
}
return 0;
}
When I run this code on ADP1, I get following output --
sizeof(sigset_t) = 4
SIG_SETMASK = 2
pthread_sigmask(): Invalid argument, errno = 22, retval = -1
Restore sigmask: Invalid argument, errno = 22, retval = -1
strace shows that rt_sigprocmask() failed with error EINVAL
rt_sigprocmask(SIG_SETMASK, ~[], 0xbec7cbb4, 4) = -1 EINVAL (Invalid
argument)
rt_sigprocmask(SIG_SETMASK, [STKFLT], NULL, 4) = -1 EINVAL (Invalid
argument)
In kernel it fails at 'if (sigsetsize != sizeof(sigset_t))' in
function rt_sigprocmask() in file kernel/signal.c .
Here size of sigset_t is 8 and size of sigsetsize is 4.
I looked at file arch/arm/include/asm/signal.h and found that size of
sigset_t is 8 ((_NSIG_WORDS=2)*(sizeof(unsigned long))).
Further analysis shows that in file libc/bionic/pthread.c last
argument is passed as (_NSIG / 8) and _NSIG(==NSIG) is defined as 32
in libc/kernel/arch-arm/asm/signal.h.
Why does this inconsistency exist? Have I missed something or it is
like this and what do I need to do to get this working. I have tried
this on 2.6.27 and 2.6.29 both. The current output is on 2.6.29.
Please help.
Thanks
Ashutosh
--~--~---------~--~----~------------~-------~--~----~
unsubscribe: [email protected]
website: http://groups.google.com/group/android-kernel
-~----------~----~----~----~------~----~------~--~---