@@ -30,11 +30,18 @@ __pthread_setschedprio (pthread_t threadid, int prio)
struct pthread *pd = (struct pthread *) threadid;
/* Make sure the descriptor is valid. */
- if (INVALID_TD_P (pd))
- /* Not a valid thread handle. */
- return ESRCH;
+ sigset_t oldmask;
+ __libc_signal_block_all (&oldmask);
+ lll_lock (pd->tidlock, LLL_PRIVATE);
int result = 0;
+
+ if (pd->tid == 0)
+ {
+ result = ESRCH;
+ goto out;
+ }
+
struct sched_param param;
param.sched_priority = prio;
@@ -60,6 +67,10 @@ __pthread_setschedprio (pthread_t threadid, int prio)
lll_unlock (pd->lock, LLL_PRIVATE);
+out:
+ lll_unlock (pd->tidlock, LLL_PRIVATE);
+ __libc_signal_restore_set (&oldmask);
+
return result;
}
versioned_symbol (libc, __pthread_setschedprio, pthread_setschedprio,