1a4e64cb8bb97d09b5695151106946a76984b330aGarrett Cooper/*
20dc076565f772bb1953209fb69ea150b494aaa40robbiew * Copyright (c) 2002, Intel Corporation. All rights reserved.
30dc076565f772bb1953209fb69ea150b494aaa40robbiew * Created by:  bing.wei.liu REMOVE-THIS AT intel DOT com
40dc076565f772bb1953209fb69ea150b494aaa40robbiew * This file is licensed under the GPL license.  For the full content
52c28215423293e443469a07ae7011135d058b671Garrett Cooper * of this license, see the COPYING file at the top level of this
60dc076565f772bb1953209fb69ea150b494aaa40robbiew * source tree.
70dc076565f772bb1953209fb69ea150b494aaa40robbiew
80dc076565f772bb1953209fb69ea150b494aaa40robbiew * Test that pthread_mutexattr_getprioceiling()
90dc076565f772bb1953209fb69ea150b494aaa40robbiew *
100dc076565f772bb1953209fb69ea150b494aaa40robbiew * Gets the priority ceiling attribute of a mutexattr object (which was prev. created
110dc076565f772bb1953209fb69ea150b494aaa40robbiew * by the function pthread_mutexattr_init()).
120dc076565f772bb1953209fb69ea150b494aaa40robbiew *
13a4e64cb8bb97d09b5695151106946a76984b330aGarrett Cooper * Steps:
140dc076565f772bb1953209fb69ea150b494aaa40robbiew * 1.  Initialize a pthread_mutexattr_t object with pthread_mutexattr_init()
150dc076565f772bb1953209fb69ea150b494aaa40robbiew * 2.  Call pthread_mutexattr_getprioceiling() to obtain the prioceiling.
162c28215423293e443469a07ae7011135d058b671Garrett Cooper *
170dc076565f772bb1953209fb69ea150b494aaa40robbiew */
180dc076565f772bb1953209fb69ea150b494aaa40robbiew
190dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <pthread.h>
200dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <stdio.h>
210dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <sched.h>
22a4e64cb8bb97d09b5695151106946a76984b330aGarrett Cooper#include <string.h>
230dc076565f772bb1953209fb69ea150b494aaa40robbiew#include "posixtest.h"
240dc076565f772bb1953209fb69ea150b494aaa40robbiew
25354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaostatic void print_pthread_error(const char *fname, int ret)
26a4e64cb8bb97d09b5695151106946a76984b330aGarrett Cooper{
27a4e64cb8bb97d09b5695151106946a76984b330aGarrett Cooper	printf("Unexpected error at %s(): %s\n", fname, strerror(ret));
28a4e64cb8bb97d09b5695151106946a76984b330aGarrett Cooper}
29a4e64cb8bb97d09b5695151106946a76984b330aGarrett Cooper
304ca2bbdcd3003f3c8df4e6129e9c7b2bd1514f87Cyril Hrubisint main(void)
310dc076565f772bb1953209fb69ea150b494aaa40robbiew{
322c28215423293e443469a07ae7011135d058b671Garrett Cooper
332c28215423293e443469a07ae7011135d058b671Garrett Cooper	/* Make sure there is prioceiling capability. */
340dc076565f772bb1953209fb69ea150b494aaa40robbiew	/* #ifndef _POSIX_PRIORITY_SCHEDULING
35354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	   fprintf(stderr,"prioceiling attribute is not available for testing\n");
36354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	   return PTS_UNRESOLVED;
37354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	   #endif */
380dc076565f772bb1953209fb69ea150b494aaa40robbiew
39a4e64cb8bb97d09b5695151106946a76984b330aGarrett Cooper	pthread_mutexattr_t ma;
40a4e64cb8bb97d09b5695151106946a76984b330aGarrett Cooper	int prioceiling, max_prio, min_prio, ret;
41a4e64cb8bb97d09b5695151106946a76984b330aGarrett Cooper
420dc076565f772bb1953209fb69ea150b494aaa40robbiew	/* Initialize a mutex attributes object */
43a4e64cb8bb97d09b5695151106946a76984b330aGarrett Cooper	ret = pthread_mutexattr_init(&ma);
44a4e64cb8bb97d09b5695151106946a76984b330aGarrett Cooper	if (ret != 0) {
45a4e64cb8bb97d09b5695151106946a76984b330aGarrett Cooper		print_pthread_error("pthread_mutexattr_init", ret);
460dc076565f772bb1953209fb69ea150b494aaa40robbiew		return PTS_UNRESOLVED;
470dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
48a4e64cb8bb97d09b5695151106946a76984b330aGarrett Cooper
49a4e64cb8bb97d09b5695151106946a76984b330aGarrett Cooper	ret = pthread_mutexattr_setprotocol(&ma, PTHREAD_PRIO_PROTECT);
50a4e64cb8bb97d09b5695151106946a76984b330aGarrett Cooper	if (ret != 0) {
51a4e64cb8bb97d09b5695151106946a76984b330aGarrett Cooper		print_pthread_error("pthread_mutexattr_protocol", ret);
52a4e64cb8bb97d09b5695151106946a76984b330aGarrett Cooper		return PTS_UNRESOLVED;
53a4e64cb8bb97d09b5695151106946a76984b330aGarrett Cooper	}
54a4e64cb8bb97d09b5695151106946a76984b330aGarrett Cooper
550dc076565f772bb1953209fb69ea150b494aaa40robbiew	/* Get the prioceiling mutex attr. */
56a4e64cb8bb97d09b5695151106946a76984b330aGarrett Cooper	ret = pthread_mutexattr_getprioceiling(&ma, &prioceiling);
57a4e64cb8bb97d09b5695151106946a76984b330aGarrett Cooper	if (ret != 0) {
58a4e64cb8bb97d09b5695151106946a76984b330aGarrett Cooper		print_pthread_error("pthread_mutexattr_getprioceiling", ret);
590dc076565f772bb1953209fb69ea150b494aaa40robbiew		return PTS_UNRESOLVED;
600dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
612c28215423293e443469a07ae7011135d058b671Garrett Cooper
62a4e64cb8bb97d09b5695151106946a76984b330aGarrett Cooper	/* Get the max and min according to SCHED_FIFO */
630dc076565f772bb1953209fb69ea150b494aaa40robbiew	max_prio = sched_get_priority_max(SCHED_FIFO);
640dc076565f772bb1953209fb69ea150b494aaa40robbiew	min_prio = sched_get_priority_min(SCHED_FIFO);
650dc076565f772bb1953209fb69ea150b494aaa40robbiew
66a4e64cb8bb97d09b5695151106946a76984b330aGarrett Cooper	/* Ensure that prioceiling is within legal limits. */
67354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if ((prioceiling < min_prio) || (prioceiling > max_prio)) {
68354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		printf
69354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		    ("Test FAILED: Default prioceiling %d is not compliant with SCHED_FIFO boundary.\n",
70354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		     prioceiling);
710dc076565f772bb1953209fb69ea150b494aaa40robbiew		return PTS_FAIL;
720dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
730dc076565f772bb1953209fb69ea150b494aaa40robbiew
740dc076565f772bb1953209fb69ea150b494aaa40robbiew	printf("Test PASSED: Prioceiling %d\n", prioceiling);
750dc076565f772bb1953209fb69ea150b494aaa40robbiew	return PTS_PASS;
76ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman}
77