1 /* Copyright (C) 2002-2022 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3 
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the License, or (at your option) any later version.
8 
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
13 
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library; if not, see
16    <https://www.gnu.org/licenses/>.  */
17 
18 #include <errno.h>
19 #include <string.h>
20 #include "pthreadP.h"
21 #include <lowlevellock.h>
22 
23 
24 int
__pthread_getschedparam(pthread_t threadid,int * policy,struct sched_param * param)25 __pthread_getschedparam (pthread_t threadid, int *policy,
26 			 struct sched_param *param)
27 {
28   struct pthread *pd = (struct pthread *) threadid;
29 
30   /* Make sure the descriptor is valid.  */
31   if (INVALID_TD_P (pd))
32     /* Not a valid thread handle.  */
33     return ESRCH;
34 
35   int result = 0;
36 
37   /* See CREATE THREAD NOTES in nptl/pthread_create.c.  */
38   lll_lock (pd->lock, LLL_PRIVATE);
39 
40   /* The library is responsible for maintaining the values at all
41      times.  If the user uses an interface other than
42      pthread_setschedparam to modify the scheduler setting it is not
43      the library's problem.  In case the descriptor's values have
44      not yet been retrieved do it now.  */
45   if ((pd->flags & ATTR_FLAG_SCHED_SET) == 0)
46     {
47       if (__sched_getparam (pd->tid, &pd->schedparam) != 0)
48 	result = 1;
49       else
50 	pd->flags |= ATTR_FLAG_SCHED_SET;
51     }
52 
53   if ((pd->flags & ATTR_FLAG_POLICY_SET) == 0)
54     {
55       pd->schedpolicy = __sched_getscheduler (pd->tid);
56       if (pd->schedpolicy == -1)
57 	result = 1;
58       else
59 	pd->flags |= ATTR_FLAG_POLICY_SET;
60     }
61 
62   if (result == 0)
63     {
64       *policy = pd->schedpolicy;
65       memcpy (param, &pd->schedparam, sizeof (struct sched_param));
66     }
67 
68   lll_unlock (pd->lock, LLL_PRIVATE);
69 
70   return result;
71 }
72 libc_hidden_def (__pthread_getschedparam)
73 strong_alias (__pthread_getschedparam, pthread_getschedparam)
74