blob: 275647465894a8b21deb3fd9a002d68a926af1c6 [file] [log] [blame]
/*
* 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;
}
}