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