| /* Copyright (C) 2006 Free Software Foundation, Inc. |
| This file is part of the GNU C Library. |
| Contributed by Jakub Jelinek <jakub@redhat.com>, 2006. |
| |
| 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, write to the Free |
| Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA |
| 02111-1307 USA. */ |
| |
| #include <errno.h> |
| #include <pthread.h> |
| #include <sched.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| #include <unistd.h> |
| #include <sys/syscall.h> |
| |
| /* This test is Linux specific. */ |
| #define CHECK_TPP_PRIORITY(normal, boosted) \ |
| do \ |
| { \ |
| pid_t tid = syscall (__NR_gettid); \ |
| \ |
| struct sched_param cep_sp; \ |
| int cep_policy; \ |
| if (pthread_getschedparam (pthread_self (), &cep_policy, \ |
| &cep_sp) != 0) \ |
| { \ |
| puts ("getschedparam failed"); \ |
| ret = 1; \ |
| } \ |
| else if (cep_sp.sched_priority != (normal)) \ |
| { \ |
| printf ("unexpected priority %d != %d\n", \ |
| cep_sp.sched_priority, (normal)); \ |
| } \ |
| if (syscall (__NR_sched_getparam, tid, &cep_sp) == 0 \ |
| && cep_sp.sched_priority != (boosted)) \ |
| { \ |
| printf ("unexpected boosted priority %d != %d\n", \ |
| cep_sp.sched_priority, (boosted)); \ |
| ret = 1; \ |
| } \ |
| } \ |
| while (0) |
| |
| int fifo_min, fifo_max; |
| |
| void |
| init_tpp_test (void) |
| { |
| fifo_min = sched_get_priority_min (SCHED_FIFO); |
| if (fifo_min < 0) |
| { |
| printf ("couldn't get min priority for SCHED_FIFO: %m\n"); |
| exit (1); |
| } |
| |
| fifo_max = sched_get_priority_max (SCHED_FIFO); |
| if (fifo_max < 0) |
| { |
| printf ("couldn't get max priority for SCHED_FIFO: %m\n"); |
| exit (1); |
| } |
| |
| if (fifo_min > 4 || fifo_max < 10) |
| { |
| printf ("%d..%d SCHED_FIFO priority interval not suitable for this test\n", |
| fifo_min, fifo_max); |
| exit (0); |
| } |
| |
| struct sched_param sp; |
| memset (&sp, 0, sizeof (sp)); |
| sp.sched_priority = 4; |
| int e = pthread_setschedparam (pthread_self (), SCHED_FIFO, &sp); |
| if (e != 0) |
| { |
| errno = e; |
| printf ("cannot set scheduling params: %m\n"); |
| exit (0); |
| } |
| } |