X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fregression%2Fpthread-robust-detach.c;h=ec772da4b56491015c9ff8433db6213286921eb2;hb=735f0ce7e431c588840f6fb832b12f6b64d7b378;hp=dbf75a278c160a229222d3bfd93265e9750bd975;hpb=629dbf8282882b7c512fd317d18b19044ca628ea;p=libc-test diff --git a/src/regression/pthread-robust-detach.c b/src/regression/pthread-robust-detach.c index dbf75a2..ec772da 100644 --- a/src/regression/pthread-robust-detach.c +++ b/src/regression/pthread-robust-detach.c @@ -3,12 +3,15 @@ #include #include #include +#include #include "test.h" -#define TX(r,f,x) ( ((r)=(f))==x || (t_error(#f" failed: got %d \"%s\" want %d \"%s\"\n", r, strerror(r), x, strerror(x)), 0) ) +#define TX(r,f,x) ( ((r)=(f))==x || \ + (t_error(#f" failed: (pshared==%d) got %d \"%s\" want %d \"%s\"\n", pshared, r, strerror(r), x, strerror(x)), 0) ) #define T(r,f) TX(r,f,0) static pthread_barrier_t barrier2; +static int pshared; static void *start_lock(void *arg) { @@ -17,21 +20,41 @@ static void *start_lock(void *arg) return 0; } -int main(void) +static void f() { pthread_t td; int r; pthread_mutexattr_t mtx_a; pthread_mutex_t mtx; + struct timespec ts; T(r, pthread_barrier_init(&barrier2, 0, 2)); T(r, pthread_mutexattr_init(&mtx_a)); T(r, pthread_mutexattr_setrobust(&mtx_a, PTHREAD_MUTEX_ROBUST)); - T(r, pthread_mutexattr_setpshared(&mtx_a, PTHREAD_PROCESS_SHARED)); + if (pshared) + T(r, pthread_mutexattr_setpshared(&mtx_a, PTHREAD_PROCESS_SHARED)); T(r, pthread_mutex_init(&mtx, &mtx_a)); T(r, pthread_create(&td, 0, start_lock, &mtx)); T(r, pthread_detach(td)); pthread_barrier_wait(&barrier2); - TX(r, pthread_mutex_trylock(&mtx), EOWNERDEAD); + pthread_barrier_destroy(&barrier2); + + // enough time to ensure that the detached thread is dead + clock_gettime(CLOCK_REALTIME, &ts); + ts.tv_nsec += 100*1000*1000; + if (ts.tv_nsec >= 1000*1000*1000) { + ts.tv_sec++; + ts.tv_nsec -= 1000*1000*1000; + } + + TX(r, pthread_mutex_timedlock(&mtx, &ts), EOWNERDEAD); +} + +int main(void) +{ + // test non-pshared and pshared robust mutexes as well + f(); + pshared = 1; + f(); return t_status; }