summaryrefslogtreecommitdiffstats
path: root/lib/libpthread/thread/thr_getschedparam.c
diff options
context:
space:
mode:
authordeischen <deischen@FreeBSD.org>2003-04-18 05:04:16 +0000
committerdeischen <deischen@FreeBSD.org>2003-04-18 05:04:16 +0000
commit5d56aa9cb2bdbe0a18bafbdbb6eb8cf6a46beb79 (patch)
tree46bc1e113ddc7c1ed88e4fa724039df8664c963a /lib/libpthread/thread/thr_getschedparam.c
parente68f624d876da04bfb6860b450593c77d80368bd (diff)
downloadFreeBSD-src-5d56aa9cb2bdbe0a18bafbdbb6eb8cf6a46beb79.zip
FreeBSD-src-5d56aa9cb2bdbe0a18bafbdbb6eb8cf6a46beb79.tar.gz
Revamp libpthread so that it has a chance of working in an SMP
environment. This includes support for multiple KSEs and KSEGs. The ability to create more than 1 KSE via pthread_setconcurrency() is in the works as well as support for PTHREAD_SCOPE_SYSTEM threads. Those should come shortly. There are still some known issues which davidxu and I are working on, but it'll make it easier for us by committing what we have. This library now passes all of the ACE tests that libc_r passes with the exception of one. It also seems to work OK with KDE including konqueror, kwrite, etc. I haven't been able to get mozilla to run due to lack of java plugin, so I'd be interested to see how it works with that. Reviewed by: davidxu
Diffstat (limited to 'lib/libpthread/thread/thr_getschedparam.c')
-rw-r--r--lib/libpthread/thread/thr_getschedparam.c28
1 files changed, 21 insertions, 7 deletions
diff --git a/lib/libpthread/thread/thr_getschedparam.c b/lib/libpthread/thread/thr_getschedparam.c
index 7f1503c..d00e498 100644
--- a/lib/libpthread/thread/thr_getschedparam.c
+++ b/lib/libpthread/thread/thr_getschedparam.c
@@ -41,19 +41,33 @@ int
_pthread_getschedparam(pthread_t pthread, int *policy,
struct sched_param *param)
{
+ struct pthread *curthread = _get_curthread();
int ret;
if ((param == NULL) || (policy == NULL))
/* Return an invalid argument error: */
ret = EINVAL;
-
- /* Find the thread in the list of active threads: */
- else if ((ret = _find_thread(pthread)) == 0) {
- /* Return the threads base priority and scheduling policy: */
+ else if (pthread == curthread) {
+ /*
+ * Avoid searching the thread list when it is the current
+ * thread.
+ */
+ THR_SCHED_LOCK(curthread, curthread);
param->sched_priority =
- PTHREAD_BASE_PRIORITY(pthread->base_priority);
+ THR_BASE_PRIORITY(pthread->base_priority);
*policy = pthread->attr.sched_policy;
+ THR_SCHED_UNLOCK(curthread, curthread);
+ ret = 0;
}
-
- return(ret);
+ /* Find the thread in the list of active threads. */
+ else if ((ret = _thr_ref_add(curthread, pthread, /*include dead*/0))
+ == 0) {
+ THR_SCHED_LOCK(curthread, pthread);
+ param->sched_priority =
+ THR_BASE_PRIORITY(pthread->base_priority);
+ *policy = pthread->attr.sched_policy;
+ THR_SCHED_UNLOCK(curthread, pthread);
+ _thr_ref_delete(curthread, pthread);
+ }
+ return (ret);
}
OpenPOWER on IntegriCloud