setthreadpri.c 1.94 KB
/**************************************************************************
 *									  *
 *		 Copyright (C) 1994, Silicon Graphics, Inc.		  *
 *									  *
 *  These coded instructions, statements, and computer programs  contain  *
 *  unpublished  proprietary  information of Silicon Graphics, Inc., and  *
 *  are protected by Federal copyright law.  They  may  not be disclosed  *
 *  to  third  parties  or copied or duplicated in any form, in whole or  *
 *  in part, without the prior written consent of Silicon Graphics, Inc.  *
 *									  *
 **************************************************************************/

#include "osint.h"

/*
 * osSetThreadPri
 *
 * Set the given's thread priority to the given priority.
 * If the given thread is NULL, set the priority of the running thread.
 */
void
osSetThreadPri(OSThread *t, OSPri p)
{
	register u32 saveMask;

#ifdef _DEBUG
	if ((p < OS_PRIORITY_IDLE) || (p > OS_PRIORITY_MAX)) {
	    __osError(ERR_OSSETTHREADPRI, 1, p);
	    return;
	}
#endif

	/*
	 * Lock out interrupts to prevent preemption after
	 * priority is set and during queue manipulation.
	 */
	saveMask = __osDisableInt();

	if (t == (OSThread *)NULL)		/* change own priority */
		t = __osRunningThread;

	/*
	 * If the thread priority is the same as before, do not change
	 * the order in any queue.
	 */
	if (t->priority != p) {
		t->priority = p;
		if ((t != __osRunningThread) &&
		    (t->state != OS_STATE_STOPPED)) {
			/*
			 * Move the thread to its new priority level by
			 *  dequeuing it and enqueuing it again.
			 */
			__osDequeueThread(t->queue, t);
			__osEnqueueThread(t->queue, t);
		}

		/*
		 * If the change make this the highest priority runnable
		 * thread, yield the processor and invoke the dispatcher.
		 */
		if (__osRunningThread->priority < __osRunQueue->priority) {
			__osRunningThread->state = OS_STATE_RUNNABLE;
			__osEnqueueAndYield(&__osRunQueue);
		}
	}

	/* Restore interrupts */
	__osRestoreInt(saveMask);
}