⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 thread.c

📁 深圳市微逻辑电子有限公司 巨果&#8226 Kingmos&reg 系统核心
💻 C
📖 第 1 页 / 共 5 页
字号:


// ********************************************************************
// 声明:static BOOL _DeleteThreadObjectPtr( LPTHREAD lpThread )
// 参数:
//		IN lpThread - THREAD 结构指针
// 返回值:
//		假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//		删除线程对象
// 引用:
//		
// ********************************************************************
#define DEBUG_DELETETHREADOBJECT 0
static BOOL _DeleteThreadObjectPtr( LPTHREAD lpThread )
{
	ASSERT( lpThread->objType == OBJ_THREAD && lpThread->dwState == THREAD_ZOMBIE );

	// 释放线程结构
	_RemoveThread( lpThread );  // 从线程链表移出
	RemoveFromProcess( lpThread );
	lpThread->objType = OBJ_NULL;

		// 释放信号量
	if( lpThread->lpsemExit )
	{
		ASSERT(0);	    
	    lpThread->lpsemExit = NULL;
	}
	if( lpThread->lpdwThreadKernelStack )
		KHeap_Free( lpThread->lpdwThreadKernelStack, PAGE_SIZE );
	FreeThreadStruct( lpThread );

	return TRUE;
}

// ********************************************************************
// 声明:static BOOL _DeleteThreadObject( LPTHREAD lpThread )
// 参数:
//		IN lpThread - THREAD 结构指针
// 返回值:
//		假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//		删除线程对象
// 引用:
//		
// ********************************************************************
#define DEBUG_DELETETHREADOBJECT 0
static BOOL _FreeThreadResourceAndReschedule( void )
{
	LPTHREAD lpThread = lpCurThread;
	ASSERT( lpThread->objType == OBJ_THREAD && lpThread->uiRefCount == 0 );
	//ASSERT( lpThread->uiRefCount == 0 );

	//if( lpThread->dwState == THREAD_ZOMBIE )
	{
		LPPROCESS lpProcess;
		LPDWORD lpdwTLS;

		if( lpThread->hThread )
			SetHandleObjPtr( lpThread->hThread, NULL );  // 将句柄对应的对象指针置为NULL

		lpdwTLS = (LPDWORD)KL_InterlockedExchange( (LPLONG)&lpThread->lpdwTLS, 0 );
		
		KHeap_Free( lpdwTLS,TLS_ALLOC_SIZE );


		//释放线程栈空间
		FreeThreadStack( lpThread->lpOwnerProcess, (void*)lpThread->lpdwThreadStack, lpThread->dwThreadStackSize );
		lpThread->lpdwThreadStack = NULL;
		
		// test
		DEBUGMSG( DEBUG_DELETETHREADOBJECT, ( "D:MainThread CallBack(0x%x).\r\n", lpThread->lpOwnerProcess->lpMainThread->lpCallStack ) );
		//
		
		if( lpThread->lpOwnerProcess->dwThreadCount == 1 )
		{   // 这是进程的最后一个线程,线程数据在 下面的 FreeProcessObject中去释放
			DEBUGMSG( DEBUG_DELETETHREADOBJECT, ( "Free main thread.\r\n" ) );
			lpProcess = lpThread->lpOwnerProcess;
			lpProcess->lpMainThread = NULL;
//			ASSERT( lpProcess );
		}
		else
		{	// 减去引用计数
			KL_InterlockedDecrement( (LPLONG)&lpThread->lpOwnerProcess->dwThreadCount );
			DEBUGMSG( DEBUG_DELETETHREADOBJECT, ( "Free not main thread.\r\n" ) );
			lpProcess = NULL;
		}
	
		if( lpProcess )
		{   // 释放进程对象
			extern void FreeProcessObject( LPPROCESS lpProcess );
			FreeProcessObject( lpProcess );
		}
	}
	if( lpCurThread->lppsemWait )
	{
		KHeap_Free( lpCurThread->lppsemWait, MAX_WAITOBJS_PTR_SIZE );
		lpCurThread->lppsemWait = NULL;//lpsem;
	}

	INTR_OFF();
    lpInitKernelThread->dwSignal |= SIGNAL_CLEAR;//
	lpInitKernelThread->nTickCount=1;//DEF_ROTATE;//254;
	lpCurThread->dwState = THREAD_ZOMBIE;
	//将该线程加入到内核进程
	lpCurThread->lpOwnerProcess = &InitKernelProcess;
	AddToProcess( lpCurThread );

	INTR_ON();

ERROR_LOOP:

	Schedule(); 
    lpCurThread->dwState = THREAD_ZOMBIE;
    ERRORMSG( DEBUG_DELETETHREADOBJECT, ( "error loop.\r\n" ) );

	goto ERROR_LOOP;

	return TRUE;
}

// ********************************************************************
// 声明:DWORD DoSuspendThread( LPTHREAD lpThread )
// 参数:
//		IN  lpThread - THREAD 结构指针
// 返回值:
//		假如成功,返回之前的计数值。假如错误,返回-1
// 功能描述:
//		挂起线程
// 引用:
//		
// ********************************************************************
DWORD DoSuspendThread( LPTHREAD lpThread )
{
	DWORD dwOldV;
	UINT uiSave;

	LockIRQSave( &uiSave );
	if( (dwOldV = lpThread->nSuspendCount) == MAXIMUM_SUSPEND_COUNT )  // 是否达到最大计数
	{
		dwOldV = -1;
		goto _ret;
	}
	if( ++lpThread->nSuspendCount == 1 )  // 是否第一次挂起 ?
	{  // 是
		if( lpThread == lpCurThread )  // 当前线程 ? 
		{  // 是
			lpThread->dwState = THREAD_SUSPENDED;
			UnlockIRQRestore( &uiSave );
			Schedule();
			return dwOldV;
		}
		else if( lpThread->dwState == THREAD_RUNNING )
		{   // 非当前线程,并且当前线程等待运行			
			RemoveFromRunQueue( lpThread );		
			lpThread->dwState = THREAD_SUSPENDED;
		}
	}
_ret:
    UnlockIRQRestore( &uiSave );
    return dwOldV;
}

// ********************************************************************
// 声明:DWORD DoResumeThread( LPTHREAD lpThread )
// 参数:
//		IN  lpThread - THREAD 结构指针  
// 返回值:
//		假如成功,返回之前的计数值。假如错误,返回-1
// 功能描述:
//		与DoSuspendThread对应,该功能重设/恢复线程
// 引用:
//		
// ********************************************************************
DWORD DoResumeThread( LPTHREAD lpThread )
{
	DWORD dwOldV;
	UINT uiSave;

	LockIRQSave( &uiSave );

    if( (dwOldV = lpThread->nSuspendCount) )
		lpThread->nSuspendCount--;
	if( lpThread->dwState == THREAD_SUSPENDED &&
		lpThread->nSuspendCount == 0 )
	{
	    lpThread->dwState = THREAD_RUNNING;
		UnlockIRQRestore( &uiSave );
	    AddToRunQueue( lpThread );
	}
	else
	    UnlockIRQRestore( &uiSave );
	return dwOldV;
}

// ********************************************************************
// 声明:void KillAllOtherThreads( LPPROCESS lpProcess )
// 参数:
//		IN  lpProcess - PROCESS 结构指针
// 返回值:
//		无
// 功能描述:
//		杀死属于该进程的所有线程
// 引用:
//		process.c's ExitProcess
// ********************************************************************
// the code called by mainthread or exitprocess
#define DEBUG_KillAllOtherThreads 1
void KillAllOtherThreads( LPPROCESS lpProcess )
{	
	LPTHREAD lpThread;
	UINT uiSave;

	LockIRQSave( &uiSave );

	lpThread = lpProcess->lpFirstThread;

	while( lpThread )
	{
		if( lpThread->lpCurProcess == lpProcess &&
			( lpThread->flag & FLAG_KILLING ) == 0 &&
			lpThread != lpCurThread )
		{
			lpThread->flag |= FLAG_KILLING;
			UnlockIRQRestore( &uiSave );
			MakeThreadToDie( lpThread, -1 );
			LockIRQSave( &uiSave );
			lpThread = lpProcess->lpFirstThread; // 从第一个重新开始
		}
		else
		{	//注意!!,这里因为是关中断状态,
			//输出调试信息将会需要许多时间,影响到别的设备丢失数据
			//因此,调试完该功能后,应该将该输出关掉!!
			//DEBUGMSG( DEBUG_KillAllOtherThreads, ( "KillAllOtherThreads:dwState=0x%x,lpThread->lpCurProcess=0x%x,lpProcess=0x%x,lpThread->flag=0x%x,lpCurThread=0x%x.\r\n", lpThread->dwState, lpThread->lpCurProcess,lpProcess,lpThread->flag,lpCurThread ) );
			lpThread = lpThread->lpNextThreadInProcess;
		}
	}

	UnlockIRQRestore( &uiSave );
}

// ********************************************************************
// 声明:void HandleSignal( void )
// 参数:
//		无
// 返回值:
//		无
// 功能描述:
//		处理信号
// 引用:
//		
// ********************************************************************
#define DEBUG_HANDLESIGNAL 0
void HandleSignal( void )
{
	LPTHREAD lpThread;
	UINT uiSave;

	DEBUGMSG( DEBUG_HANDLESIGNAL, ( "HandleSignal++:dwSignal(0x%x),dwBlocked(0x%x).\r\n", lpCurThread->dwSignal, lpCurThread->dwBlocked ) );

	LockIRQSave( &uiSave );

	if( lpCurThread->dwSignal & SIGNAL_CLEAR )
	{	// 有无用的线程对象需要清除
		lpCurThread->dwBlocked |= SIGNAL_CLEAR;  // disable SIGNAL_CHILD
		lpCurThread->dwSignal &= ~SIGNAL_CLEAR;

		// 查找有信号的线程并处理信号
		lpThread = InitKernelProcess.lpFirstThread;
		while( lpThread )
		{
			if( lpThread->dwState == THREAD_ZOMBIE )
			{
				UnlockIRQRestore( &uiSave );

				DEBUGMSG( DEBUG_HANDLESIGNAL, ( "Thread(%x) Zombie.\r\n", lpThread ) );
				
				_DeleteThreadObjectPtr( lpThread );
				LockIRQSave( &uiSave );
				//重新开始
				lpThread = InitKernelProcess.lpFirstThread;
				continue;
			}
			//下一个
			lpThread = lpThread->lpNextThreadInProcess;
		}
		lpCurThread->dwBlocked &= ~SIGNAL_CLEAR;  // enable SIGNAL_CHILD
	}
	else if( lpCurThread->dwSignal & SIGNAL_EXIT )
	{
		lpCurThread->dwBlocked |= SIGNAL_EXIT;  // disable SIGNAL_CHILD
		lpCurThread->dwSignal &= ~SIGNAL_EXIT;
		UnlockIRQRestore( &uiSave );
		KL_ExitThread(-1);
		return;
	}	
	else
	{
		WARNMSG( DEBUG_HANDLESIGNAL, ( "HandleSignal: SIGNAL_CHILD masked!.\r\n" ) );
	}

	UnlockIRQRestore( &uiSave );

	DEBUGMSG( DEBUG_HANDLESIGNAL, ( "HandleSignal--.\r\n" ) );
}

// ********************************************************************
// 声明:static LPTHREAD AllocThreadStruct( VOID )
// 参数:
//	无
// 返回值:
//		假如成功,返回线程结构指针;否则,返回NULL
// 功能描述:
//		分配线程结构
// 引用:
//		
// ********************************************************************

static LPTHREAD AllocThreadStruct( VOID )
{
	LPTHREAD lpThread;
	lpThread = (LPTHREAD)KHeap_Alloc( THREAD_STRUCT_SIZE ); // 分配线程结构
	if( lpThread )
	{
		memset( lpThread, 0, THREAD_STRUCT_SIZE );
	}
	return lpThread;
}

// ********************************************************************
// 声明:static LPTHREAD AllocThreadStruct( VOID )
// 参数:
//	无
// 返回值:
//		假如成功,返回线程结构指针;否则,返回NULL
// 功能描述:
//		分配线程结构
// 引用:
//		
// ********************************************************************
static VOID FreeThreadStruct( LPTHREAD lpThread )
{
	KHeap_Free( lpThread, THREAD_STRUCT_SIZE );
}

// ********************************************************************
// 声明:LPTHREAD FASTCALL _CreateThread(
//								LPPROCESS lpProcess,
//								LPSECURITY_ATTRIBUTES lpThreadAttributes,   // pointer to thread security attributes
//								DWORD dwStackSize,                      // initial thread stack size, in bytes
//								DWORD dwPreservStackSize,
//								LPTHREAD_START_ROUTINE lpStartAddress, // pointer to thread function
//								LPVOID lpParameter,                // argument for new thread
//								DWORD dwCreationFlags,         // creation flags
//								LPDWORD lpThreadId         // pointer to returned thread identifier
//								)

// 参数:
//		IN lpProcess - PROCESS 结构指针
//		IN lpThreadAttributes - 安全属性
//		IN dwStackSize - 该线程的需要的运行栈大小
//		IN dwPreservStackSize - 在已分配的栈空间里需要保留给系统用的大小, dwPreservStackSize < dwStackSize
//		IN lpStartAddress - 线程启动函数入口
//		IN lpParameter - 传递给线程的参数
//		IN dwCreationFlags - 创建标志
//		OUT lpThreadId - 用于接受线程ID的指针

// 返回值:
//		假如成功,返回线程结构指针;否则,返回NULL
// 功能描述:
//		创建线程
// 引用:
//		
// ********************************************************************

#define DEBUG_CREATETHREAD 0
LPTHREAD FASTCALL _CreateThread(
								LPPROCESS lpProcess,
								LPSECURITY_ATTRIBUTES lpThreadAttributes,   // pointer to thread security attributes
								DWORD dwStackSize,                      // initial thread stack size, in bytes
								DWORD dwPreservStackSize,
								LPTHREAD_START_ROUTINE lpStartAddress, // pointer to thread function
								LPVOID lpParameter,                // argument for new thread
								DWORD dwCreationFlags,         // creation flags
								LPDWORD lpThreadId         // pointer to returned thread identifier
								)
{
	DWORD dwThreadID;
	LPTHREAD lpThread = NULL;
	HANDLE hThread = NULL;

    if( lpProcess )
    {
#ifdef VIRTUAL_MEM
		if( dwStackSize == 0 )
			dwStackSize = 64 * 1024;  //必须用64k, 因为主线程的stack在64k-128k
#else
	#ifdef EML_WIN32
		if( dwStackSize == 0 )  //在Window下模拟
			dwStackSize = 128 * 1024;
	#else
		if( dwStackSize == 0 )
			dwStackSize = 16 * 1024;
	#endif

#endif
		dwThreadID = 0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -