(root)/
glibc-2.38/
nptl/
pthread_setschedprio.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 <sched.h>
      22  #include "pthreadP.h"
      23  #include <lowlevellock.h>
      24  #include <shlib-compat.h>
      25  
      26  int
      27  __pthread_setschedprio (pthread_t threadid, int prio)
      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    struct sched_param param;
      38    param.sched_priority = prio;
      39  
      40    /* See CREATE THREAD NOTES in nptl/pthread_create.c.  */
      41    lll_lock (pd->lock, LLL_PRIVATE);
      42  
      43    /* If the thread should have higher priority because of some
      44       PTHREAD_PRIO_PROTECT mutexes it holds, adjust the priority.  */
      45    if (__builtin_expect (pd->tpp != NULL, 0) && pd->tpp->priomax > prio)
      46      param.sched_priority = pd->tpp->priomax;
      47  
      48    /* Try to set the scheduler information.  */
      49    if (__glibc_unlikely (__sched_setparam (pd->tid, &param) == -1))
      50      result = errno;
      51    else
      52      {
      53        /* We succeeded changing the kernel information.  Reflect this
      54  	 change in the thread descriptor.  */
      55        param.sched_priority = prio;
      56        memcpy (&pd->schedparam, &param, sizeof (struct sched_param));
      57        pd->flags |= ATTR_FLAG_SCHED_SET;
      58      }
      59  
      60    lll_unlock (pd->lock, LLL_PRIVATE);
      61  
      62    return result;
      63  }
      64  versioned_symbol (libc, __pthread_setschedprio, pthread_setschedprio,
      65  		  GLIBC_2_34);
      66  
      67  #if OTHER_SHLIB_COMPAT (libpthread, GLIBC_2_3_4, GLIBC_2_34)
      68  compat_symbol (libpthread, __pthread_setschedprio, pthread_setschedprio,
      69  	       GLIBC_2_3_4);
      70  #endif