From: Nicholas Nethercote Date: Wed, 6 Dec 2006 06:32:37 +0000 (+0000) Subject: Add a regression test, courtesy of Bart Van Assche. X-Git-Tag: svn/VALGRIND_3_3_0~506 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=59cdea4c78b01f45399b82f4438ec6d8e85ddba2;p=thirdparty%2Fvalgrind.git Add a regression test, courtesy of Bart Van Assche. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@6379 --- diff --git a/none/tests/Makefile.am b/none/tests/Makefile.am index 8e914e6291..1e71bd0870 100644 --- a/none/tests/Makefile.am +++ b/none/tests/Makefile.am @@ -95,6 +95,8 @@ EXTRA_DIST = $(noinst_SCRIPTS) \ pth_rwlock.stderr.exp pth_rwlock.vgtest \ pth_stackalign.stderr.exp \ pth_stackalign.stdout.exp pth_stackalign.vgtest \ + pth_detached.stderr.exp \ + pth_detached.stdout.exp pth_detached.vgtest \ rcrl.stderr.exp rcrl.stdout.exp rcrl.vgtest \ readline1.stderr.exp readline1.stdout.exp \ readline1.vgtest \ @@ -146,6 +148,7 @@ check_PROGRAMS = \ pth_atfork1 pth_blockedsig pth_cancel1 pth_cancel2 pth_cvsimple \ pth_empty pth_exit pth_exit2 pth_mutexspeed pth_once pth_rwlock \ pth_stackalign \ + pth_detached \ rcrl readline1 res_search resolv \ rlimit_nofile selfrun sem semlimit sha1_test \ shortpush shorts stackgrowth sigstackgrowth susphello \ @@ -175,6 +178,7 @@ pth_mutexspeed_LDADD = -lpthread pth_once_LDADD = -lpthread pth_rwlock_LDADD = -lpthread pth_stackalign_LDADD = -lpthread +pth_detached_LDADD = -lpthread if VGP_PPC32_AIX5 res_search_LDADD = -lpthread else diff --git a/none/tests/pth_detached.c b/none/tests/pth_detached.c new file mode 100644 index 0000000000..237cef454c --- /dev/null +++ b/none/tests/pth_detached.c @@ -0,0 +1,68 @@ +/* Test whether detached threads are handled properly. + Contributed by Bart Van Assche (bart.vanassche@gmail.com). +*/ + +#include +#include +#include +#include +#include + +static int s_finished_count; + +static void* thread_func1(void* arg) +{ + write(STDOUT_FILENO, ".", 1); + s_finished_count++; + return 0; +} + +static void* thread_func2(void* arg) +{ + pthread_detach(pthread_self()); + write(STDOUT_FILENO, "*", 1); + s_finished_count++; + return 0; +} + +int main(int argc, char** argv) +{ + const int count1 = argc > 1 ? atoi(argv[1]) : 100; + const int count2 = argc > 2 ? atoi(argv[2]) : 100; + int i; + int detachstate; + pthread_attr_t attr; + + pthread_attr_init(&attr); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + assert(pthread_attr_getdetachstate(&attr, &detachstate) == 0); + assert(detachstate == PTHREAD_CREATE_DETACHED); + pthread_attr_setstacksize(&attr, 16384); + // Create count1 detached threads by setting the "detached" property via + // thread attributes. + for (i = 0; i < count1; i++) + { + pthread_t thread; + pthread_create(&thread, &attr, thread_func1, 0); + } + // Create count2 detached threads by letting the threads detach themselves. + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); + assert(pthread_attr_getdetachstate(&attr, &detachstate) == 0); + assert(detachstate == PTHREAD_CREATE_JOINABLE); + for (i = 0; i < count2; i++) + { + pthread_t thread; + pthread_create(&thread, &attr, thread_func2, 0); + } + pthread_attr_destroy(&attr); + + // Wait until all detached threads have written their output to stdout. + while (s_finished_count < count1 + count2) + { + struct timespec delay = { 0, 1 * 1000 * 1000 }; + nanosleep(&delay, 0); + } + + printf("\n"); + return 0; +} diff --git a/none/tests/pth_detached.stderr.exp b/none/tests/pth_detached.stderr.exp new file mode 100644 index 0000000000..139597f9cb --- /dev/null +++ b/none/tests/pth_detached.stderr.exp @@ -0,0 +1,2 @@ + + diff --git a/none/tests/pth_detached.stdout.exp b/none/tests/pth_detached.stdout.exp new file mode 100644 index 0000000000..8dae8ec843 --- /dev/null +++ b/none/tests/pth_detached.stdout.exp @@ -0,0 +1 @@ +....................................................................................................**************************************************************************************************** diff --git a/none/tests/pth_detached.vgtest b/none/tests/pth_detached.vgtest new file mode 100644 index 0000000000..eba5b8741d --- /dev/null +++ b/none/tests/pth_detached.vgtest @@ -0,0 +1 @@ +prog: pth_detached