/*   
 * 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 that pthread_attr_destroy()
 *  shall destory a thread attributes object.  An implementation may cause
 *  pthread_attr_destroy() to set 'attr' to an implementation-defined invalid
 *  value.  
 * 
 * Steps:
 * 1.  Initialize a pthread_attr_t object using pthread_attr_init()
 * 2.  Destroy that initialized attribute using pthread_attr_destroy()
 * 3.  Using pthread_attr_create(), pass to it the destroyed attribute. It
 *     should return the error EINVAL, the value specified by 'attr' is
 *     is invalid.      
 * 
 */

#include <pthread.h>
#include <stdio.h>
#include <errno.h>
#include "posixtest.h"


void *a_thread_func()
{
	
	pthread_exit(0);
	return NULL;
}

int main()
{
	pthread_t new_th;
	pthread_attr_t new_attr;
	int ret;

	/* Initialize attribute */
	if(pthread_attr_init(&new_attr) != 0)
	{
		perror("Cannot initialize attribute object\n");
		return PTS_UNRESOLVED;
	}

	/* Destroy attribute */
	if(pthread_attr_destroy(&new_attr) != 0)
	{
		perror("Cannot destroy the attribute object\n");
		return PTS_UNRESOLVED;
	}

	/* Creating a thread, passing to it the destroyed attribute, should
	 * result in an error value of EINVAL (invalid 'attr' value). */
       ret=pthread_create(&new_th, &new_attr, a_thread_func, NULL);

       if(ret==EINVAL)
       {
	       printf("Test PASSED\n");
	       return PTS_PASS;
       }
       else if((ret != 0) && ((ret == EPERM) || (ret == EAGAIN)))
       {
	       perror("Error created a new thread\n");
	       return PTS_UNRESOLVED;
       }
       else if(ret==0)
       {
	       printf("Test PASSED: NOTE*: Though returned 0 when creating a thread with a destroyed attribute, this behavior is compliant with garbage-in-garbage-out. \n");
	       return PTS_PASS;
       } else
       {
	       printf("Test FAILED: (1) Incorrect return code from pthread_create(); %d not EINVAL  or  (2) Error in pthread_create()'s behavior in returning error codes \n", ret);
	       return PTS_FAIL;
       }
	
}


