📄 thread.c
字号:
// ********************************************************************
// 声明: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 + -