X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/d7e50217d7adf6e52786a38bcaa4cd698cb9a79e..ccc36f2f2d89f9115c479db4439aa5c88de5b44a:/osfmk/kern/thread_policy.c diff --git a/osfmk/kern/thread_policy.c b/osfmk/kern/thread_policy.c index cf5cb1f2e..2d7e2765c 100644 --- a/osfmk/kern/thread_policy.c +++ b/osfmk/kern/thread_policy.c @@ -3,22 +3,19 @@ * * @APPLE_LICENSE_HEADER_START@ * - * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved. + * The contents of this file constitute Original Code as defined in and + * are subject to the Apple Public Source License Version 1.1 (the + * "License"). You may not use this file except in compliance with the + * License. Please obtain a copy of the License at + * http://www.apple.com/publicsource and read it before using this file. * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * This Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. + * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the + * License for the specific language governing rights and limitations + * under the License. * * @APPLE_LICENSE_HEADER_END@ */ @@ -31,6 +28,7 @@ * Created. */ +#include #include static void @@ -77,13 +75,24 @@ thread_policy_set( thread_lock(thread); if (!(thread->sched_mode & TH_MODE_FAILSAFE)) { + integer_t oldmode = (thread->sched_mode & TH_MODE_TIMESHARE); + thread->sched_mode &= ~TH_MODE_REALTIME; - if (timeshare) + if (timeshare && !oldmode) { thread->sched_mode |= TH_MODE_TIMESHARE; + + if (thread->state & TH_RUN) + pset_share_incr(thread->processor_set); + } else + if (!timeshare && oldmode) { thread->sched_mode &= ~TH_MODE_TIMESHARE; + if (thread->state & TH_RUN) + pset_share_decr(thread->processor_set); + } + thread_recompute_priority(thread); } else { @@ -111,7 +120,8 @@ thread_policy_set( } info = (thread_time_constraint_policy_t)policy_info; - if ( info->computation > max_rt_quantum || + if ( info->constraint < info->computation || + info->computation > max_rt_quantum || info->computation < min_rt_quantum ) { result = KERN_INVALID_ARGUMENT; break; @@ -126,7 +136,12 @@ thread_policy_set( thread->realtime.preemptible = info->preemptible; if (!(thread->sched_mode & TH_MODE_FAILSAFE)) { - thread->sched_mode &= ~TH_MODE_TIMESHARE; + if (thread->sched_mode & TH_MODE_TIMESHARE) { + thread->sched_mode &= ~TH_MODE_TIMESHARE; + + if (thread->state & TH_RUN) + pset_share_decr(thread->processor_set); + } thread->sched_mode |= TH_MODE_REALTIME; thread_recompute_priority(thread); } @@ -182,7 +197,7 @@ thread_recompute_priority( integer_t priority; if (thread->sched_mode & TH_MODE_REALTIME) - priority = BASEPRI_REALTIME; + priority = BASEPRI_RTQUEUES; else { if (thread->importance > MAXPRI) priority = MAXPRI;