*
* @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@
*/
* Created.
*/
+#include <kern/processor.h>
#include <kern/thread.h>
static void
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 {
}
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;
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);
}
integer_t priority;
if (thread->sched_mode & TH_MODE_REALTIME)
- priority = BASEPRI_REALTIME;
+ priority = BASEPRI_RTQUEUES;
else {
if (thread->importance > MAXPRI)
priority = MAXPRI;