Index: pth_detached.stdout.exp =================================================================== --- pth_detached.stdout.exp (revision 0) +++ pth_detached.stdout.exp (revision 0) @@ -0,0 +1 @@ +....................................................................................................**************************************************************************************************** Index: Makefile.am =================================================================== --- Makefile.am (revision 6372) +++ Makefile.am (working copy) @@ -95,6 +95,8 @@ 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 @@ 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_once_LDADD = -lpthread pth_rwlock_LDADD = -lpthread pth_stackalign_LDADD = -lpthread +pth_detached_LDADD = -lpthread if VGP_PPC32_AIX5 res_search_LDADD = -lpthread else Index: pth_detached.vgtest =================================================================== --- pth_detached.vgtest (revision 0) +++ pth_detached.vgtest (revision 0) @@ -0,0 +1 @@ +prog: pth_detached Index: pth_detached.c =================================================================== --- pth_detached.c (revision 0) +++ pth_detached.c (revision 0) @@ -0,0 +1,56 @@ +/* Test whether detached threads are handled properly. + Contributed by Bart Van Assche (bart.vanassche@gmail.com). +*/ + +#include +#include +#include +#include +#include + +static void* thread_func1(void* arg) +{ + write(STDOUT_FILENO, ".", 1); + return 0; +} + +static void* thread_func2(void* arg) +{ + pthread_detach(pthread_self()); + write(STDOUT_FILENO, "*", 1); + 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); + sleep(1); + printf("\n"); + return 0; +} Index: pth_detached.stderr.exp ===================================================================