Blame nptl/pthread_getschedparam.c

Packit 6c4009
/* Copyright (C) 2002-2018 Free Software Foundation, Inc.
Packit 6c4009
   This file is part of the GNU C Library.
Packit 6c4009
   Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
Packit 6c4009
Packit 6c4009
   The GNU C Library is free software; you can redistribute it and/or
Packit 6c4009
   modify it under the terms of the GNU Lesser General Public
Packit 6c4009
   License as published by the Free Software Foundation; either
Packit 6c4009
   version 2.1 of the License, or (at your option) any later version.
Packit 6c4009
Packit 6c4009
   The GNU C Library is distributed in the hope that it will be useful,
Packit 6c4009
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 6c4009
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 6c4009
   Lesser General Public License for more details.
Packit 6c4009
Packit 6c4009
   You should have received a copy of the GNU Lesser General Public
Packit 6c4009
   License along with the GNU C Library; if not, see
Packit 6c4009
   <http://www.gnu.org/licenses/>.  */
Packit 6c4009
Packit 6c4009
#include <errno.h>
Packit 6c4009
#include <string.h>
Packit 6c4009
#include "pthreadP.h"
Packit 6c4009
#include <lowlevellock.h>
Packit 6c4009
Packit 6c4009
Packit 6c4009
int
Packit 6c4009
__pthread_getschedparam (pthread_t threadid, int *policy,
Packit 6c4009
			 struct sched_param *param)
Packit 6c4009
{
Packit 6c4009
  struct pthread *pd = (struct pthread *) threadid;
Packit 6c4009
Packit 6c4009
  /* Make sure the descriptor is valid.  */
Packit 6c4009
  if (INVALID_TD_P (pd))
Packit 6c4009
    /* Not a valid thread handle.  */
Packit 6c4009
    return ESRCH;
Packit 6c4009
Packit 6c4009
  int result = 0;
Packit 6c4009
Packit 6c4009
  /* See CREATE THREAD NOTES in nptl/pthread_create.c.  */
Packit 6c4009
  lll_lock (pd->lock, LLL_PRIVATE);
Packit 6c4009
Packit 6c4009
  /* The library is responsible for maintaining the values at all
Packit 6c4009
     times.  If the user uses an interface other than
Packit 6c4009
     pthread_setschedparam to modify the scheduler setting it is not
Packit 6c4009
     the library's problem.  In case the descriptor's values have
Packit 6c4009
     not yet been retrieved do it now.  */
Packit 6c4009
  if ((pd->flags & ATTR_FLAG_SCHED_SET) == 0)
Packit 6c4009
    {
Packit 6c4009
      if (__sched_getparam (pd->tid, &pd->schedparam) != 0)
Packit 6c4009
	result = 1;
Packit 6c4009
      else
Packit 6c4009
	pd->flags |= ATTR_FLAG_SCHED_SET;
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  if ((pd->flags & ATTR_FLAG_POLICY_SET) == 0)
Packit 6c4009
    {
Packit 6c4009
      pd->schedpolicy = __sched_getscheduler (pd->tid);
Packit 6c4009
      if (pd->schedpolicy == -1)
Packit 6c4009
	result = 1;
Packit 6c4009
      else
Packit 6c4009
	pd->flags |= ATTR_FLAG_POLICY_SET;
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  if (result == 0)
Packit 6c4009
    {
Packit 6c4009
      *policy = pd->schedpolicy;
Packit 6c4009
      memcpy (param, &pd->schedparam, sizeof (struct sched_param));
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  lll_unlock (pd->lock, LLL_PRIVATE);
Packit 6c4009
Packit 6c4009
  return result;
Packit 6c4009
}
Packit 6c4009
strong_alias (__pthread_getschedparam, pthread_getschedparam)