/* * Copyright (c) 2002, Intel Corporation. All rights reserved. * Created by: rolla.n.selbak REMOVE-THIS AT intel DOT com * This file is licensed under the GPL license. For the full content * of this license, see the COPYING file at the top level of this * source tree. * Test if the attributes specified by 'attr' are modified later, the thread's * attributes shall not be affected. * The attribute that will be tested is the detached state. * * * Steps: * 1. Set a pthread_attr_t object to be PTHREAD_CREATE_JOINABLE. * 2. Create a new thread using pthread_create() and passing this attribute * object. * 3. Change the attribute object to be in a detached state rather than * joinable. * 4. Doing this should not effect the fact that the thread that was created * is joinable, and so calling the functions pthread_detach() should not fail. */ #include #include #include #include #include "posixtest.h" # define TIMEOUT 10 /* Timeout value of 10 seconds. */ # define INTHREAD 0 /* Control going to or is already for Thread */ # define INMAIN 1 /* Control going to or is already for Main */ int sem1; /* Manual semaphore */ void *a_thread_func() { /* Indicate to main() that the thread was created. */ sem1=INTHREAD; /* Wait for main to detach change the attribute object and try and detach this thread. * Wait for a timeout value of 10 seconds before timing out if the thread was not able * to be detached. */ sleep(TIMEOUT); printf("Test FAILED: Did not detach the thread, main still waiting for it to end execution.\n"); pthread_exit((void*)PTS_FAIL); return NULL; } int main() { pthread_t new_th; pthread_attr_t new_attr; int ret; /* Initializing */ sem1 = INMAIN; if(pthread_attr_init(&new_attr) != 0) { perror("Error intializing attribute object\n"); return PTS_UNRESOLVED; } /* Make the new attribute object joinable */ if(pthread_attr_setdetachstate(&new_attr, PTHREAD_CREATE_JOINABLE) != 0) { perror("Error setting the detached state of the attribute\n"); return PTS_UNRESOLVED; } /* Create a new thread and pass it the attribute object that will * make it joinable. */ if(pthread_create(&new_th, &new_attr, a_thread_func, NULL) != 0) { perror("Error creating thread\n"); return PTS_UNRESOLVED; } while(sem1==INMAIN) sleep(1); /* Now change the attribute object to be in a detached state */ if(pthread_attr_setdetachstate(&new_attr, PTHREAD_CREATE_DETACHED) != 0) { perror("Error setting the detached state of the attribute\n"); return PTS_UNRESOLVED; } /* The new thread should still be able to be detached. */ if((ret=pthread_detach(new_th)) == EINVAL) { printf("Test FAILED: pthread_detach failed on joinable thread. Return value is %d\n", ret); return PTS_FAIL; } printf("Test PASSED\n"); return PTS_PASS; }