+#if CONFIG_EMBEDDED
+static void
+thread_throttle(
+ thread_t thread,
+ integer_t task_priority)
+{
+ if ((!(thread->sched_flags & TH_SFLAG_THROTTLED)
+ || (thread->sched_flags & TH_SFLAG_PENDING_THROTTLE_PROMOTION))
+ && (task_priority <= MAXPRI_THROTTLE)) {
+
+ /* Kill a promotion if it was in flight */
+ thread->sched_flags &= ~TH_SFLAG_PENDING_THROTTLE_PROMOTION;
+
+ if (!(thread->sched_flags & TH_SFLAG_THROTTLED)) {
+ /*
+ * Set the pending bit so that we can switch runqueues
+ * (potentially) at a later time safely
+ */
+ thread->sched_flags |= TH_SFLAG_PENDING_THROTTLE_DEMOTION;
+ }
+ }
+ else if (((thread->sched_flags & TH_SFLAG_THROTTLED)
+ || (thread->sched_flags & TH_SFLAG_PENDING_THROTTLE_DEMOTION))
+ && (task_priority > MAXPRI_THROTTLE)) {
+
+ /* Kill a demotion if it was in flight */
+ thread->sched_flags &= ~TH_SFLAG_PENDING_THROTTLE_DEMOTION;
+
+ if (thread->sched_flags & TH_SFLAG_THROTTLED) {
+ thread->sched_flags |= TH_SFLAG_PENDING_THROTTLE_PROMOTION;
+ }
+ }
+}
+#endif
+