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