destroythread.c 1.59 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"

/*
 * osDestroyThread(OSThread *t)
 *
 * If the thread is NULL or the running thread, remove the running thread
 * from the active list and jump to the dispatcher. Otherwise, remove
 * the thread from the queue it is on (if it is on one) as well as the
 * active list.
 */

void
osDestroyThread(OSThread *t)
{
	register u32	   saveMask;
	register OSThread *pred, *succ;

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

	if (t == (OSThread *)NULL)
		t = __osRunningThread;
	else if (t->state != OS_STATE_STOPPED)
                 __osDequeueThread(t->queue, t);

	if (__osActiveQueue == t) {
		__osActiveQueue = __osActiveQueue->tlnext;
	} else {
		pred = __osActiveQueue;
		while (pred->priority != -1) {
			succ = pred->tlnext;
			if (succ == t) {		     /* found it */
				pred->tlnext = t->tlnext;    /* remove it */
				break;
			}
			pred = succ;
		}
	}
	if (t == __osRunningThread)
		__osDispatchThread();

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