blob: 86e3231a84d306657c0ce5bbb1b8b8a44ed7ddf0 [file] [log] [blame]
- works on stock 2.4 kernels, but the scheduler loop must poll
- works on RH9 2.4.20-18.9 kernel, but doesn't seem quite as stable
as 2.5/2.6
for pending signals rather than relying on the kernel delivering them
to the right place.
- most tested on 2.6.0-test1 and up
- running job-control programs (ie, bash) under Valgrind won't work
properly without a kernel patch (as of 2.6.0-test2-mm2). This is because
threads in a thread group don't follow the thread group leader's changes
in process group ID, and they can't change it for themselves.
- SA_NOCLDWAIT doesn't work properly if the program is actually blocked
in wait4() when SIGCHLD arrives; the wait4() will return details for
the exiting child. In other circumstances children should be quietly reaped.
[ This may be fixable when running under RH2.4 and 2.6, since we can
set NOCLDWAIT in the kernel's state without risk of losing our child
threads. ]
- 2.4 has somewhat disfunctional thread/signal interactions, so many test
do not work as well under 2.4. In general, it should be no worse than
the old signal code. I don't intend spending a lot of time fixing this
because 2.6 is nearly ready for widespread use.
TODO:
- support application use of clone(). Interesting question is which
options do we support? Do we need to implement futex as well, or can
we just use the kernel's implementation?
========================================
Testing
I've been testing with the Posix test suite:
http://sourceforge.net/projects/posixtest/, version 1.2.0.
----------------------------------------
Expected failures:
conformance/interfaces/sigwaitinfo/6-1.test
pthread_kill() calls the tkill syscall, which causes a code of
SI_TKILL rather than the SI_USER which this test expects.
conformance/interfaces/sigrelse/3-*.test
glibc bug in sigrelse(), which fails without Valgrind too.
conformance/interfaces/pthread_barrier_*/*
Valgrind's libpthreads doesn't implement pthread_barrier_*.
(There are some passes, but I don't know why.)
conformance/interfaces/pthread_cond_timedwait/2-3
This test is just completely broken. It does expose a problem
in Valgrind's mutex implementation - it is too dependent on
the client code not doing stupid stuff. This test makes
Valgrind have an assertion failure.
conformance/interfaces/pthread_condattr_getpshared/*
pthread_condattr_getpshared not implemented
conformance/interfaces/pthread_condattr_setpshared/*
pthread_condattr_setpshared not implemented
conformance/interfaces/pthread_key_create/speculative/5-1
Valgrind should cope with key overload
conformance/interfaces/pthread_mutex_timedlock/*
not implemented
conformance/interfaces/pthread_rwlock_rdlock/2-1:
relies on pthread_setschedparam
conformance/interfaces/pthread_rwlock_timedrdlock/*
valgrind's libpthread.so: UNIMPLEMENTED FUNCTION: pthread_rwlock_timedrdlock
conformance/interfaces/pthread_rwlockattr_getpshared/*
pthread_rwlockattr_getpshared not implemented
conformance/interfaces/pthread_rwlockattr_setpshared/*
pthread_rwlockattr_setpshared not implemented
conformance/interfaces/sched_rr_get_interval/*
syscall 161 (sched_rr_get_interval) not implemented
conformance/interfaces/sigaction/21-1
Subtle problem: if app specifies SA_NOCLDWAIT on their SIGCHLD
signal handler, Valgrind will attempt to catch the SIGCHLD and
wait4() on all the children before returning to the app.
However, if the app was running a wait4() at the time the
SIGCHLD arrives, it will get the child's status. Quite what
the app is doing running wait4() when it explicitly asked for
it to be useless, I'm not sure...
conformance/interfaces/sigaction/17-{3,6,8,12}
(2.4) These fail under 2.4 because they deal with SIGSEGV, SIGBUS
and SIGILL. These signals can only be delivered if there's a
thread immediately ready to handle them, but cannot be left
pending indefinitely. These tests hang forever because the
signal is discarded rather than delivered.
conformance/interfaces/sigqueue/{1,4,8}-1
(2.4) Signals that we route manually do not have queued data
associated with them - they are routed with tkill. Also
pending signals are only kept in a mask, not in a queue, so
there can only be one at a time.
----------------------------------------
Still to investigate:
conformance/interfaces/pthread_detach/4-1
+conformance/interfaces/pthread_rwlock_rdlock/4-1: execution: FAILED: Output:
+main: attempt write lock
+main: acquired write lock
+sig_thread: attemp read lock
+main: fire SIGUSR1 to sig_thread
+SIGUSR1 was not caught by sig_thread
+conformance/interfaces/pthread_rwlock_unlock/4-1: execution: FAILED: Output:
+Test FAILED: Incorrect error code, expected 0 or EINVAL, got 1
+conformance/interfaces/pthread_rwlock_wrlock/2-1: execution: FAILED: Output:
+main: attempt write lock
+sig_thread: attempt write lock
+main: fire SIGUSR1 to sig_thread
+The signal handler did not get called.
+conformance/interfaces/pthread_rwlock_wrlock/3-1: execution: FAILED: Output:
+
+sched status:
+
+Thread 1: status = WaitCV, associated_mx = 0x40115910, associated_cv = 0x401158E0
+==11243== at 0x40102962: pthread_cond_wait (vg_libpthread.c:1093)
+==11243== by 0x40104976: __pthread_rwlock_wrlock (vg_libpthread.c:2619)
+==11243== by 0x8048588: main (3-1.c:53)
+==11243== by 0x4013DA46: __libc_start_main (in /lib/libc-2.3.2.so)
+
+==11243== Warning: pthread scheduler exited due to deadlock
+
+valgrind: vg_main.c:1619 (vgPlain_main): Assertion `vgPlain_threads[vgPlain_last_run_tid].status == VgTs_Runnable' failed.
+
+sched status:
+
+Thread 1: status = WaitCV, associated_mx = 0x40115910, associated_cv = 0x401158E0
+==11243== at 0x40102962: pthread_cond_wait (vg_libpthread.c:1093)
+==11243== by 0x40104976: __pthread_rwlock_wrlock (vg_libpthread.c:2619)
+==11243== by 0x8048588: main (3-1.c:53)
+==11243== by 0x4013DA46: __libc_start_main (in /lib/libc-2.3.2.so)
+conformance/interfaces/sem_close/1-1.test:
/home/jeremy/bk/valgrind/syscalls/coregrind/.in_place/libpthread.so.0:
version `GLIBC_2.1.1' not found (required by
conformance/interfaces/sem_close/1-1.test)
+conformance/interfaces/sem_timedwait/6-1: execution: FAILED: Output:
+TEST FAILED
+conformance/interfaces/sem_timedwait/6-2: execution: FAILED: Output:
+TEST FAILED
+conformance/interfaces/sem_timedwait/9-1: execution: FAILED: Output:
+In handler
+TEST FAILED: errno != EINTR
conformance/interfaces/sigaction/10-1:
Used to work. Mysterious. Works everywhere except in the test harness...
+conformance/interfaces/sigpause/1-2: execution: FAILED: Output:
+
+valgrind: vg_mylibc.c:1324 (vgPlain_read_millisecond_timer): Assertion `rdtsc_now > rdtsc_cal_end_raw' failed.
+
+sched status:
+
+Thread 1: status = Sleeping, associated_mx = 0x0, associated_cv = 0x0
+==19929== at 0x401D6765: __GI___libc_nanosleep (in /lib/libc-2.3.2.so)
+==19929== by 0x80485C1: main (1-2.c:65)
+==19929== by 0x4013DA46: __libc_start_main (in /lib/libc-2.3.2.so)
+==19929== by 0x8048494: ??? (start.S:81)
+
+Thread 2: status = WaitSys, associated_mx = 0x0, associated_cv = 0x0
+==19929== at 0x40150796: __libc_sigsuspend (in /lib/libc-2.3.2.so)
+==19929== by 0x401509B3: __GI___sigpause (in /lib/libc-2.3.2.so)
+==19929== by 0x804857C: a_thread_func (1-2.c:48)
+==19929== by 0x40102099: thread_wrapper (vg_libpthread.c:667)
----------------------------------------
Fixes:
conformance/interfaces/pthread_detach/4-2
This fails under NPTL, but passes under Valgrind