(root)/
glibc-2.38/
nptl/
pthread_setschedparam.c
       1  /* Copyright (C) 2002-2023 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 <sched.h>
      20  #include <string.h>
      21  #include "pthreadP.h"
      22  #include <lowlevellock.h>
      23  
      24  
      25  int
      26  __pthread_setschedparam (pthread_t threadid, int policy,
      27  			 const struct sched_param *param)
      28  {
      29    struct pthread *pd = (struct pthread *) threadid;
      30  
      31    /* Make sure the descriptor is valid.  */
      32    if (INVALID_TD_P (pd))
      33      /* Not a valid thread handle.  */
      34      return ESRCH;
      35  
      36    int result = 0;
      37  
      38    /* See CREATE THREAD NOTES in nptl/pthread_create.c.  */
      39    lll_lock (pd->lock, LLL_PRIVATE);
      40  
      41    struct sched_param p;
      42    const struct sched_param *orig_param = param;
      43  
      44    /* If the thread should have higher priority because of some
      45       PTHREAD_PRIO_PROTECT mutexes it holds, adjust the priority.  */
      46    if (__builtin_expect (pd->tpp != NULL, 0)
      47        && pd->tpp->priomax > param->sched_priority)
      48      {
      49        p = *param;
      50        p.sched_priority = pd->tpp->priomax;
      51        param = &p;
      52      }
      53  
      54    /* Try to set the scheduler information.  */
      55    if (__builtin_expect (__sched_setscheduler (pd->tid, policy,
      56  					      param) == -1, 0))
      57      result = errno;
      58    else
      59      {
      60        /* We succeeded changing the kernel information.  Reflect this
      61  	 change in the thread descriptor.  */
      62        pd->schedpolicy = policy;
      63        memcpy (&pd->schedparam, orig_param, sizeof (struct sched_param));
      64        pd->flags |= ATTR_FLAG_SCHED_SET | ATTR_FLAG_POLICY_SET;
      65      }
      66  
      67    lll_unlock (pd->lock, LLL_PRIVATE);
      68  
      69    return result;
      70  }
      71  strong_alias (__pthread_setschedparam, pthread_setschedparam)