| - 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 |