Home | History | Annotate | Download | only in pthread_detach
      1 /*
      2  * Copyright (c) 2002, Intel Corporation. All rights reserved.
      3  * Created by:  rolla.n.selbak REMOVE-THIS AT intel DOT com
      4  * This file is licensed under the GPL license.  For the full content
      5  * of this license, see the COPYING file at the top level of this
      6  * source tree.
      7 
      8  * Test that pthread_detach()
      9  *
     10  * Upon failure, it shall return an error number:
     11  * -[EINVAL] The implemenation has detected that the value specified by
     12  * 'thread' does not refer to a joinable thread.
     13  * -[ESRCH] No thread could be found corresponding to that thread
     14 
     15  * It shall not return an error code of [EINTR]
     16  *
     17  * STEPS:
     18  * 1.Create a detached state thread
     19  * 2.Detach that thread
     20  * 3.Check the return value and make sure it is EINVAL
     21  *
     22  */
     23 
     24 #include <pthread.h>
     25 #include <stdio.h>
     26 #include <errno.h>
     27 #include <unistd.h>
     28 #include "posixtest.h"
     29 
     30 /* Thread function */
     31 void *a_thread_func()
     32 {
     33 
     34 	pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
     35 
     36 	/* If the thread wasn't canceled in 10 seconds, time out */
     37 	sleep(10);
     38 
     39 	perror("Thread couldn't be canceled (at cleanup time), timing out\n");
     40 	pthread_exit(0);
     41 	return NULL;
     42 }
     43 
     44 int main(void)
     45 {
     46 	pthread_attr_t new_attr;
     47 	pthread_t new_th;
     48 	int ret;
     49 
     50 	/* Initialize attribute */
     51 	if (pthread_attr_init(&new_attr) != 0) {
     52 		perror("Cannot initialize attribute object\n");
     53 		return PTS_UNRESOLVED;
     54 	}
     55 
     56 	/* Set the attribute object to be detached */
     57 	if (pthread_attr_setdetachstate(&new_attr, PTHREAD_CREATE_DETACHED) !=
     58 	    0) {
     59 		perror("Error in pthread_attr_setdetachstate()\n");
     60 		return PTS_UNRESOLVED;
     61 	}
     62 
     63 	/* Create the thread */
     64 	if (pthread_create(&new_th, &new_attr, a_thread_func, NULL) != 0) {
     65 		perror("Error creating thread\n");
     66 		return PTS_UNRESOLVED;
     67 	}
     68 
     69 	/* Detach the thread. */
     70 	ret = pthread_detach(new_th);
     71 
     72 	/* Cleanup and cancel the thread */
     73 	pthread_cancel(new_th);
     74 
     75 	/* Check return value of pthread_detach() */
     76 	if (ret != EINVAL) {
     77 		if (ret == ESRCH) {
     78 			perror("Error detaching thread\n");
     79 			return PTS_UNRESOLVED;
     80 		}
     81 
     82 		printf("Test FAILED: Incorrect return code\n");
     83 		return PTS_FAIL;
     84 
     85 	}
     86 
     87 	printf("Test PASSED\n");
     88 	return PTS_PASS;
     89 }
     90