stopthread.c 1.31 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"

/*
 * osStopThread
 *
 * Suspend the given thread by dequeueing it from its current queue.
 * If the given thread is NULL, suspend the current thread.
 */
void
osStopThread(OSThread *t)
{
	register u32 saveMask;
	register u16 state;

	/* Disable interrupts */
	saveMask = __osDisableInt();

	state = (u16)((t == (OSThread *) NULL) ? OS_STATE_RUNNING : t->state);
	switch (state) {
	case OS_STATE_RUNNING:
		__osRunningThread->state = OS_STATE_STOPPED;
		__osEnqueueAndYield((OSThread **)NULL);
		break;
	case OS_STATE_RUNNABLE:
	case OS_STATE_WAITING:
		t->state = OS_STATE_STOPPED;
		__osDequeueThread(t->queue, t);
		break;
	}

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