/* 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"