pthread_mutexattr_setprioceiling.c 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. /* Change priority ceiling setting in pthread_mutexattr_t.
  2. Copyright (C) 2006-2019 Free Software Foundation, Inc.
  3. This file is part of the GNU C Library.
  4. Contributed by Jakub Jelinek <jakub@redhat.com>, 2006.
  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. 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. You should have received a copy of the GNU Lesser General Public
  14. License along with the GNU C Library; if not, see
  15. <http://www.gnu.org/licenses/>. */
  16. #include <errno.h>
  17. #include <pthreadP.h>
  18. #include <atomic.h>
  19. int
  20. pthread_mutexattr_setprioceiling (pthread_mutexattr_t *attr, int prioceiling)
  21. {
  22. /* See __init_sched_fifo_prio. */
  23. if (atomic_load_relaxed (&__sched_fifo_min_prio) == -1
  24. || atomic_load_relaxed (&__sched_fifo_max_prio) == -1)
  25. __init_sched_fifo_prio ();
  26. if (__glibc_unlikely (prioceiling
  27. < atomic_load_relaxed (&__sched_fifo_min_prio))
  28. || __glibc_unlikely (prioceiling
  29. > atomic_load_relaxed (&__sched_fifo_max_prio))
  30. || __glibc_unlikely ((prioceiling
  31. & (PTHREAD_MUTEXATTR_PRIO_CEILING_MASK
  32. >> PTHREAD_MUTEXATTR_PRIO_CEILING_SHIFT))
  33. != prioceiling))
  34. return EINVAL;
  35. struct pthread_mutexattr *iattr = (struct pthread_mutexattr *) attr;
  36. iattr->mutexkind = ((iattr->mutexkind & ~PTHREAD_MUTEXATTR_PRIO_CEILING_MASK)
  37. | (prioceiling << PTHREAD_MUTEXATTR_PRIO_CEILING_SHIFT));
  38. return 0;
  39. }