On 04/26/2012 07:31 PM, Eric Wong wrote:
> +static void *
> +thr_cancel_enabled(void *arg)
> +{
> + int *kq = arg;
> + struct kevent kev;
> + struct timespec ts = { 100, 0 };
> +
> + (void)kevent(*kq, NULL, 0, &kev, 1, &ts);
> +
> + die("should never get here due to cancel");
> + return NULL;
> +}
This test hangs on FreeBSD, and fails when I run it under truss or gdb.. see
below for the output. It looks like kevent() returns EINTR when the thread is
cancelled, instead of actually cancelling the thread. I will test on a few
more platforms, but if this is true, the behavior of libkqueue will have to be
changed to match the BSD implementation.
- Mark
$ gdb ./kqtest
GNU gdb 6.1.1 [FreeBSD]
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "amd64-marcel-freebsd"...
(gdb) r
Starting program: /usr/home/mheily/proj/libkqueue/test/kqtest
[New LWP 100562]
[New Thread 801007400 (LWP 100562/kqtest)]
1: test_peer_close_detection()
2: test_kqueue()
3: test_kevent()
4: test_cancel_state_unchanged()
5: test_cancel_enabled()
[New Thread 801007800 (LWP 100575/kqtest)]
thr_cancel_enabled(): should never get here due to cancel: Interrupted system call
Program received signal SIGABRT, Aborted.
[Switching to Thread 801007800 (LWP 100575/kqtest)]
0x0000000800cd0a7c in thr_kill () from /lib/libc.so.7
(gdb) bt
#0 0x0000000800cd0a7c in thr_kill () from /lib/libc.so.7
#1 0x0000000800d6dd3b in abort () from /lib/libc.so.7
#2 0x0000000000401bbe in thr_cancel_enabled (arg=Could not find the frame
base for "thr_cancel_enabled".
) at main.c:147
#3 0x0000000800859274 in pthread_getprio () from /lib/libthr.so.3
#4 0x0000000000000000 in ?? ()
Error accessing memory address 0x7fffffbfe000: Bad address.
(gdb)
$ truss ./kqtest
mmap(0x0,32768,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) = 34366287872
(0x80063f000)
issetugid(0x800640015,0x800634d7e,0x8008507f0,0x8008507c0,0xb297,0x0) = 0 (0x0)
open("/etc/libmap.conf",O_RDONLY,0666) ERR#2 'No such file or directory'
open("/var/run/ld-elf.so.hints",O_RDONLY,057) = 3 (0x3)
read(3,"Ehnt\^A\0\0\0\M^@\0\0\0-\0\0\0\0"...,128) = 128 (0x80)
lseek(3,0x80,SEEK_SET) = 128 (0x80)
read(3,"/lib:/usr/lib:/usr/lib/compat:/u"...,45) = 45 (0x2d)
close(3) = 0 (0x0)
access("/lib/libthr.so.3",0) = 0 (0x0)
open("/lib/libthr.so.3",O_RDONLY,041037540) = 3 (0x3)
fstat(3,{ mode=-r--r--r-- ,inode=2879,size=101688,blksize=101888 }) = 0 (0x0)
pread(0x3,0x800842f40,0x1000,0x0,0x101010101010101,0x8080808080808080) = 4096
(0x1000)
mmap(0x0,2240512,PROT_NONE,MAP_PRIVATE|MAP_ANON|MAP_NOCORE,-1,0x0) =
34368458752 (0x800851000)
mmap(0x800851000,94208,PROT_READ|PROT_EXEC,MAP_PRIVATE|MAP_FIXED|MAP_NOCORE,3,0x0)
= 34368458752 (0x800851000)
mmap(0x800a68000,4096,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_FIXED,3,0x17000) =
34370650112 (0x800a68000)
mmap(0x800a69000,45056,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_FIXED|MAP_ANON,-1,0x0)
= 34370654208 (0x800a69000)
close(3) = 0 (0x0)
access("/lib/librt.so.1",0) ERR#2 'No such file or directory'
access("/usr/lib/librt.so.1",0) = 0 (0x0)
open("/usr/lib/librt.so.1",O_RDONLY,041037540) = 3 (0x3)
fstat(3,{ mode=-r--r--r-- ,inode=2850,size=21744,blksize=22016 }) = 0 (0x0)
pread(0x3,0x800842f40,0x1000,0x0,0x101010101010101,0x8080808080808080) = 4096
(0x1000)
mmap(0x0,2117632,PROT_NONE,MAP_PRIVATE|MAP_ANON|MAP_NOCORE,-1,0x0) =
34370699264 (0x800a74000)
mmap(0x800a74000,20480,PROT_READ|PROT_EXEC,MAP_PRIVATE|MAP_FIXED|MAP_NOCORE,3,0x0)
= 34370699264 (0x800a74000)
mmap(0x800c78000,4096,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_FIXED,3,0x4000) =
34372812800 (0x800c78000)
close(3) = 0 (0x0)
access("/lib/libc.so.7",0) = 0 (0x0)
open("/lib/libc.so.7",O_RDONLY,041037540) = 3 (0x3)
fstat(3,{ mode=-r--r--r-- ,inode=997,size=1315160,blksize=131072 }) = 0 (0x0)
pread(0x3,0x800842f40,0x1000,0x0,0x101010101010101,0x8080808080808080) = 4096
(0x1000)
mmap(0x0,3432448,PROT_NONE,MAP_PRIVATE|MAP_ANON|MAP_NOCORE,-1,0x0) =
34372816896 (0x800c79000)
mmap(0x800c79000,1179648,PROT_READ|PROT_EXEC,MAP_PRIVATE|MAP_FIXED|MAP_NOCORE,3,0x0)
= 34372816896 (0x800c79000)
mmap(0x800f99000,45056,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_FIXED,3,0x120000)
= 34376093696 (0x800f99000)
mmap(0x800fa4000,110592,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_FIXED|MAP_ANON,-1,0x0)
= 34376138752 (0x800fa4000)
close(3) = 0 (0x0)
mmap(0x0,40960,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) = 34366320640
(0x800647000)
munmap(0x80064a000,28672) = 0 (0x0)
mmap(0x0,102400,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) =
34366332928 (0x80064a000)
sysarch(0x81,0x7fffffffd340,0x8006431c8,0x0,0xffffffffff6ab080,0x8080808080808080)
= 0 (0x0)
sigprocmask(SIG_BLOCK,SIGHUP|SIGINT|SIGQUIT|SIGKILL|SIGPIPE|SIGALRM|SIGTERM|SIGURG|SIGSTOP|SIGTSTP|SIGCONT|SIGCHLD|SIGTTIN|SIGTTOU|SIGIO|SIGXCPU|SIGXFSZ|SIGVTALRM|SIGPROF|SIGWINCH|SIGINFO|SIGUSR1|SIGUSR2,0x0)
= 0 (0x0)
sigprocmask(SIG_SETMASK,0x0,0x0) = 0 (0x0)
sigprocmask(SIG_BLOCK,SIGHUP|SIGINT|SIGQUIT|SIGKILL|SIGPIPE|SIGALRM|SIGTERM|SIGURG|SIGSTOP|SIGTSTP|SIGCONT|SIGCHLD|SIGTTIN|SIGTTOU|SIGIO|SIGXCPU|SIGXFSZ|SIGVTALRM|SIGPROF|SIGWINCH|SIGINFO|SIGUSR1|SIGUSR2,0x0)
= 0 (0x0)
sigprocmask(SIG_SETMASK,0x0,0x0) = 0 (0x0)
getpid() = 98690 (0x18182)
__sysctl(0x7fffffffd2b0,0x2,0x800a73200,0x7fffffffd2b8,0x0,0x0) = 0 (0x0)
__sysctl(0x7fffffffd1e0,0x2,0x7fffffffd210,0x7fffffffd278,0x800864b70,0xd) = 0
(0x0)
__sysctl(0x7fffffffd210,0x3,0x800a720e8,0x7fffffffd2b8,0x0,0x0) = 0 (0x0)
readlink("/etc/malloc.conf",0x7fffffffcdb0,1024) ERR#2 'No such file or directory'
issetugid(0x800d75bc1,0x7fffffffcdb0,0xffffffffffffffff,0x0,0x2,0x0) = 0 (0x0)
break(0x800000) = 0 (0x0)
mmap(0x0,4194304,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) =
34376249344 (0x800fbf000)
mmap(0x8013bf000,266240,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) =
34380443648 (0x8013bf000)
munmap(0x800fbf000,266240) = 0 (0x0)
thr_self(0x801007400,0x0,0x0,0x0,0x40,0x7fffffffc8e0) = 0 (0x0)
mmap(0x7fffffbfe000,4096,PROT_NONE,MAP_ANON,-1,0x0) = 140737484152832
(0x7fffffbfe000)
rtprio_thread(0x0,0x18895,0x7fffffffd280,0x1000,0xffffffff,0x0) = 0 (0x0)
sysarch(0x81,0x7fffffffd2a0,0x800a71cc0,0x800a72060,0xffffffff,0x0) = 0 (0x0)
sigaction(32,{ 0x80085e200 SA_SIGINFO ss_t },0x0) = 0 (0x0)
sigprocmask(SIG_UNBLOCK,0x0,0x0) = 0 (0x0)
sigprocmask(SIG_BLOCK,SIGHUP|SIGINT|SIGQUIT|SIGKILL|SIGPIPE|SIGALRM|SIGTERM|SIGURG|SIGSTOP|SIGTSTP|SIGCONT|SIGCHLD|SIGTTIN|SIGTTOU|SIGIO|SIGXCPU|SIGXFSZ|SIGVTALRM|SIGPROF|SIGWINCH|SIGINFO|SIGUSR1|SIGUSR2,0x0)
= 0 (0x0)
sigprocmask(SIG_SETMASK,0x0,0x0) = 0 (0x0)
sigprocmask(SIG_BLOCK,SIGHUP|SIGINT|SIGQUIT|SIGKILL|SIGPIPE|SIGALRM|SIGTERM|SIGURG|SIGSTOP|SIGTSTP|SIGCONT|SIGCHLD|SIGTTIN|SIGTTOU|SIGIO|SIGXCPU|SIGXFSZ|SIGVTALRM|SIGPROF|SIGWINCH|SIGINFO|SIGUSR1|SIGUSR2,0x0)
= 0 (0x0)
sigprocmask(SIG_SETMASK,0x0,0x0) = 0 (0x0)
sigprocmask(SIG_SETMASK,SIGHUP|SIGINT|SIGQUIT|SIGILL|SIGTRAP|SIGABRT|SIGEMT|SIGFPE|SIGKILL|SIGBUS|SIGSEGV|SIGSYS|SIGPIPE|SIGALRM|SIGTERM|SIGURG|SIGSTOP|SIGTSTP|SIGCONT|SIGCHLD|SIGTTIN|SIGTTOU|SIGIO|SIGXCPU|SIGXFSZ|SIGVTALRM|SIGPROF|SIGWINCH|SIGINFO|SIGUSR1|SIGUSR2,0x0)
= 0 (0x0)
sigaction(SIGSEGV,{ 0x80085d630 SA_SIGINFO ss_t },{ SIG_DFL 0x0 ss_t }) = 0 (0x0)
sigprocmask(SIG_SETMASK,0x0,0x0) = 0 (0x0)
sigprocmask(SIG_SETMASK,SIGHUP|SIGINT|SIGQUIT|SIGILL|SIGTRAP|SIGABRT|SIGEMT|SIGFPE|SIGKILL|SIGBUS|SIGSEGV|SIGSYS|SIGPIPE|SIGALRM|SIGTERM|SIGURG|SIGSTOP|SIGTSTP|SIGCONT|SIGCHLD|SIGTTIN|SIGTTOU|SIGIO|SIGXCPU|SIGXFSZ|SIGVTALRM|SIGPROF|SIGWINCH|SIGINFO|SIGUSR1|SIGUSR2,0x0)
= 0 (0x0)
sigaction(SIGABRT,{ 0x80085d630 SA_SIGINFO ss_t },{ SIG_DFL 0x0 ss_t }) = 0 (0x0)
sigprocmask(SIG_SETMASK,0x0,0x0) = 0 (0x0)
sigprocmask(SIG_SETMASK,SIGHUP|SIGINT|SIGQUIT|SIGILL|SIGTRAP|SIGABRT|SIGEMT|SIGFPE|SIGKILL|SIGBUS|SIGSEGV|SIGSYS|SIGPIPE|SIGALRM|SIGTERM|SIGURG|SIGSTOP|SIGTSTP|SIGCONT|SIGCHLD|SIGTTIN|SIGTTOU|SIGIO|SIGXCPU|SIGXFSZ|SIGVTALRM|SIGPROF|SIGWINCH|SIGINFO|SIGUSR1|SIGUSR2,0x0)
= 0 (0x0)
sigaction(SIGINT,{ 0x80085d630 SA_SIGINFO ss_t },{ SIG_DFL 0x0 ss_t }) = 0 (0x0)
sigprocmask(SIG_SETMASK,0x0,0x0) = 0 (0x0)
fstat(1,{ mode=crw--w---- ,inode=123,size=0,blksize=4096 }) = 0 (0x0)
ioctl(1,TIOCGETA,0xffffd450) = 0 (0x0)
1: test_peer_close_detection()
write(1,"1: test_peer_close_detection()\t"...,32) = 32 (0x20)
socketpair(0x1,0x1,0x0,0x7fffffffda00,0x800c1356f,0x7fffffffd89f) = 0 (0x0)
poll({3/POLLIN|POLLHUP},1,0) = 0 (0x0)
close(4) = 0 (0x0)
poll({3/POLLIN|POLLHUP},1,0) = 1 (0x1)
recvfrom(3,0x7fffffffd9ff,1,0x82,NULL,0x0) = 0 (0x0)
2: test_kqueue()
write(1,"2: test_kqueue()\t\n",18) = 18 (0x12)
kqueue(0x0,0x80101a000,0x800faa7a0,0x0,0x800c13561,0x7fffffffd89f) = 4 (0x4)
kevent(4,0x0,0,{},1,{0.000000000 }) = 0 (0x0)
close(4) = 0 (0x0)
3: test_kevent()
write(1,"3: test_kevent()\t\n",18) = 18 (0x12)
kevent(-1,{0x0,0x0,0x0,0,0x0,0x0},1,0x0,0,0x0) ERR#9 'Bad file descriptor'
4: test_cancel_state_unchanged()
write(1,"4: test_cancel_state_unchanged()"...,34) = 34 (0x22)
kqueue(0x0,0x0,0x801007400,0x1,0x800c13571,0x7fffffffd89f) = 4 (0x4)
kevent(4,0x0,0,{},1,{0.000001000 }) = 0 (0x0)
close(4) = 0 (0x0)
5: test_cancel_enabled()
write(1,"5: test_cancel_enabled()\t\n",26) = 26 (0x1a)
kqueue(0x0,0x80101a000,0x800faa7a0,0x0,0x800c13569,0x7fffffffd89f) = 4 (0x4)
_umtx_op(0x7fffffffd8b8,0x3,0x1,0x0,0x0,0x7fffffffd89f) = 0 (0x0)
mprotect(0x0,0,PROT_NONE) = 0 (0x0)
sigprocmask(SIG_BLOCK,SIGHUP|SIGINT|SIGQUIT|SIGILL|SIGTRAP|SIGABRT|SIGEMT|SIGFPE|SIGKILL|SIGBUS|SIGSEGV|SIGSYS|SIGPIPE|SIGALRM|SIGTERM|SIGURG|SIGSTOP|SIGTSTP|SIGCONT|SIGCHLD|SIGTTIN|SIGTTOU|SIGIO|SIGXCPU|SIGXFSZ|SIGVTALRM|SIGPROF|SIGWINCH|SIGINFO|SIGUSR1|SIGUSR2,0x0)
= 0 (0x0)
sigprocmask(SIG_SETMASK,0x0,0x0) = 0 (0x0)
mmap(0x0,4096,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) = 34366435328
(0x800663000)
mmap(0x7fffff9fd000,2101248,PROT_READ|PROT_WRITE|PROT_EXEC,MAP_STACK,-1,0x0) =
140737482051584 (0x7fffff9fd000)
mprotect(0x7fffff9fd000,4096,PROT_NONE) = 0 (0x0)
thr_new(0x7fffffffd900,0x68,0x0,0x0,0x0,0x0) = 0 (0x0)
clock_gettime(13,{1335631537.000000000 }) = 0 (0x0)
thr_kill(0x188dd,0x20,0x1,0x0,0x1,0x0) ERR#4 'Interrupted system call'
SIGNAL 32 (?)
sigreturn(0x7fffffbfdb20,0x7fffffbfdb20,0x801007400,0x1,0x0,0x1) ERR#4
'Interrupted system call'
stat("/usr/share/nls/C/
libc.cat",0x7fffffbfda20) ERR#2 'No such file or directory'
stat("/usr/share/nls/libc/C",0x7fffffbfda20) ERR#2 'No such file or directory'
stat("/usr/local/share/nls/C/
libc.cat",0x7fffffbfda20) ERR#2 'No such file or
directory'
stat("/usr/local/share/nls/libc/C",0x7fffffbfda20) ERR#2 'No such file or
directory'
thr_cancel_enabled(): should never get here due to cancel: Interrupted system call
write(2,"thr_cancel_enabled(): should nev"...,83) = 83 (0x53)
sigprocmask(SIG_SETMASK,SIGHUP|SIGINT|SIGQUIT|SIGILL|SIGTRAP|SIGEMT|SIGFPE|SIGKILL|SIGBUS|SIGSEGV|SIGSYS|SIGPIPE|SIGALRM|SIGTERM|SIGURG|SIGSTOP|SIGTSTP|SIGCONT|SIGCHLD|SIGTTIN|SIGTTOU|SIGIO|SIGXCPU|SIGXFSZ|SIGVTALRM|SIGPROF|SIGWINCH|SIGINFO|SIGUSR1|SIGUSR2,0x0)
= 0 (0x0)
thr_kill(0x188dd,0x6,0x0,0x5,0x7fffff7f7481,0x1) = 0 (0x0)
SIGNAL 6 (SIGABRT)
sigprocmask(SIG_SETMASK,SIGHUP|SIGINT|SIGQUIT|SIGILL|SIGTRAP|SIGABRT|SIGEMT|SIGFPE|SIGBUS|SIGSEGV|SIGSYS|SIGPIPE|SIGALRM|SIGTERM|SIGURG|SIGTSTP|SIGCONT|SIGCHLD|SIGTTIN|SIGTTOU|SIGIO|SIGXCPU|SIGXFSZ|SIGVTALRM|SIGPROF|SIGWINCH|SIGINFO|SIGUSR1|SIGUSR2,0x0)
= 0 (0x0)
***** ERROR: Program received signal 6 *****
write(1,"***** ERROR: Program received si"...,45) = 45 (0x2d)
*** TEST FAILED: (null)
write(1," *** TEST FAILED: (null)\n",25) = 25 (0x19)
process exit, rval = 1