|  | /* Test that pthread_create diagnoses invalid scheduling parameters. | 
|  | Copyright (C) 2014-2016 Free Software Foundation, Inc. | 
|  | This file is part of the GNU C Library. | 
|  |  | 
|  | The GNU C Library is free software; you can redistribute it and/or | 
|  | modify it under the terms of the GNU Lesser General Public | 
|  | License as published by the Free Software Foundation; either | 
|  | version 2.1 of the License, or (at your option) any later version. | 
|  |  | 
|  | The GNU C Library is distributed in the hope that it will be useful, | 
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
|  | Lesser General Public License for more details. | 
|  |  | 
|  | You should have received a copy of the GNU Lesser General Public | 
|  | License along with the GNU C Library; if not, see | 
|  | <http://www.gnu.org/licenses/>.  */ | 
|  |  | 
|  | #include <assert.h> | 
|  | #include <errno.h> | 
|  | #include <pthread.h> | 
|  | #include <stdio.h> | 
|  | #include <stdlib.h> | 
|  | #include <string.h> | 
|  |  | 
|  |  | 
|  | static void * | 
|  | thread_function (void *arg) | 
|  | { | 
|  | abort (); | 
|  | } | 
|  |  | 
|  |  | 
|  | static int | 
|  | do_test (void) | 
|  | { | 
|  | #if !defined SCHED_FIFO || !defined SCHED_OTHER | 
|  | puts ("SCHED_FIFO or SCHED_OTHER not available at compile time"); | 
|  | return 0; /* 77 */ | 
|  | #else | 
|  |  | 
|  | int err; | 
|  |  | 
|  | #define TRY(func, arglist)                              \ | 
|  | if ((err = func arglist) != 0)                        \ | 
|  | {                                                   \ | 
|  | printf ("%s: %s\n", #func, strerror (err));       \ | 
|  | return 2;                                         \ | 
|  | } | 
|  |  | 
|  | int fifo_max = sched_get_priority_max (SCHED_FIFO); | 
|  | if (fifo_max == -1) | 
|  | { | 
|  | assert (errno == ENOTSUP || errno == ENOSYS); | 
|  | puts ("SCHED_FIFO not supported, cannot test"); | 
|  | return 0; /* 77 */ | 
|  | } | 
|  |  | 
|  | int other_max = sched_get_priority_max (SCHED_OTHER); | 
|  | if (other_max == -1) | 
|  | { | 
|  | assert (errno == ENOTSUP || errno == ENOSYS); | 
|  | puts ("SCHED_OTHER not supported, cannot test"); | 
|  | return 0; /* 77 */ | 
|  | } | 
|  |  | 
|  | assert (fifo_max > other_max); | 
|  |  | 
|  | pthread_attr_t attr; | 
|  | TRY (pthread_attr_init, (&attr)); | 
|  | TRY (pthread_attr_setinheritsched, (&attr, PTHREAD_EXPLICIT_SCHED)); | 
|  | TRY (pthread_attr_setschedpolicy, (&attr, SCHED_FIFO)); | 
|  |  | 
|  | /* This value is chosen so as to be valid for SCHED_FIFO but invalid for | 
|  | SCHED_OTHER.  */ | 
|  | struct sched_param param = { .sched_priority = other_max + 1 }; | 
|  | TRY (pthread_attr_setschedparam, (&attr, ¶m)); | 
|  |  | 
|  | TRY (pthread_attr_setschedpolicy, (&attr, SCHED_OTHER)); | 
|  |  | 
|  | /* Now ATTR has a sched_param that is invalid for its policy.  */ | 
|  | pthread_t th; | 
|  | err = pthread_create (&th, &attr, &thread_function, NULL); | 
|  | if (err != EINVAL) | 
|  | { | 
|  | printf ("pthread_create returned %d (%s), expected %d (EINVAL: %s)\n", | 
|  | err, strerror (err), EINVAL, strerror (EINVAL)); | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | return 0; | 
|  | #endif | 
|  | } | 
|  |  | 
|  |  | 
|  | #define TEST_FUNCTION do_test () | 
|  | #include "../test-skeleton.c" |