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

📄 jwl-gtf_convar.c

📁 基于arm核的RTOS
💻 C
📖 第 1 页 / 共 2 页
字号:
* 描述:取消挂起的进程											*
* 参数: 	ConVarID										*
*		ConVar											*
*		TaskID											*
*		Task											*
* 返回: 参看JWL-GTF.h											*
*********************************************************************************************************/
jwl_gtf_s8 jwl_gtf_CancelAllConWait(jwl_gtf_ConVar *ConVar,jwl_gtf_u8 ConVarID)
{
	jwl_gtf_TasCB  *tmpTaskCB,*oldTaskCB,*Task;
	jwl_gtf_ConVar *tmpConVar;
	jwl_gtf_TaskMutex *tmpMutex;
	if(ConVar==jwl_gtf_NULL)
	{
		if(tmpConVar=jwl_gtf_FindConVar(ConVarID)==jwl_gtf_NULL)
			return jwl_gtf_NoConVarID;
	}
	else
		tmpConVar=ConVar;
	if(tmpConVar->jwl_gtf_Status!=jwl_gtf_ConVarUsed)
		return jwl_gtf_ConVarNotUsed;
	if(tmpConVar->jwl_gtf_ConVarLink==jwl_gtf_NULL)
		return jwl_gtf_ConVarNotTask;						/*条件变量中没有挂起的线程*/
	tmpMutex=tmpConVar->jwl_gtf_Mutex;
	tmpTaskCB=tmpConVar->jwl_gtf_ConVarLink;
	Task=jwl_gtf_get_idle();
	do
	{
		if(Task->jwl_gtf_TaskPro>tmpTaskCB->jwl_gtf_TaskPro)
			Task=tmpTask;
		oldTaskCB=tmpTaskCB:
		tmpTaskCB=tmpTaskCB->jwl_gtf_EvenLink->Next;
		oldTaskCB->jwl_gtf_EvenLink={jwl_gtf_NULL,jwl_gtf_NULL};
		oldTaskCB->jwl_gtf_TaskStatus=jwl_gtf_Ready;
		oldTaskCB->jwl_gtf_RetCode=jwl_gtf_HupUpTaskCancel;
		if(oldTaskCB->jwl_gtf_WaitTLink!={jwl_gtf_NULL,jwl_gtf_NULL})				/*断开超时链表*/
		{
			if(oldTaskCB->jwl_gtf_WaitTLink->Pre==oldTaskCB)				/*在头部*/
			{
				if(oldTaskCB->jwl_gtf_WaitTLink->Next==jwl_gtf_NULL)
					jwl_gtf_ConVarTOut=jwl_gtf_NULL;
				else
				{
					jwl_gtf_ConVarTOut=jwl_gtf_ConVarTOut->jwl_gtf_WaitTLink->Next;
					jwl_gtf_ConVarTOut->jwl_gtf_WaitTLink->Pre=jwl_gtf_ConVarTOut;
				}
			}
			else if(oldTaskCB->jwl_gtf_WaitTLink->Next==jwl_gtf_NULL)			/*尾部*/
				oldTaskCB->jwl_gtf_WaitTLink->Pre->jwl_gtf_WaitTLink->Next=jwl_gtf_NULL;
			else										/*其他*/
			{
				oldTaskCB->jwl_gtf_WaitTLink->Pre->jwl_gtf_WaitTLink->Next=\
					oldTaskCB->jwl_gtf_WaitTLink->Next;
				oldTaskCB->jwl_gtf_WaitTLink->Next->jwl_gtf_WaitTLink->Pre=\
					oldTaskCB->jwl_gtf_WaitTLink->Pre;				
			}
			oldTaskCB->jwl_gtf_WaitTLink={jwl_gtf_NULL,jwl_gtf_NULL};
			oldTaskCB->jwl_gtf_TimeOut=0;		
		}
		oldTaskCB->jwl_gtf_ConVar=jwl_gtf_NULL;	
	}while(tmpTaskCB!=jwl_gtf_NULL);
	if(TaskCB->jwl_gtf_TaskPro<jwl_gtf_TaskRun->jwl_gtf_TaskPro)
	{
		tmpExchOCB=tmpTaskCB;
		jwl_gtf_Switch
	}
	return jwl_gtf_Noerror;
}

/********************************************************************************************************
*                                        jwl_gtf_ConVarSignal						*
* 描述:接锁条件变量											*
* 参数: 	ConVarID										*
*		ConVar											*
* 返回: 参看JWL-GTF.h											*
*********************************************************************************************************/
jwl_gtf_s8 jwl_gtf_ConVarSignal(jwl_gtf_TaskCB *ConVar,jwl_gtf_u8 ConVarID)
{
	jwl_gtf_ConVar *tmpConVar;
	jwl_gtf_TaskCB *tmpTaskCB;
	jwl_gtf_TaskMutex *tmpMutex;
	if(ConVar==jwl_gtf_NULL)
	{
		if(tmpConVar=jwl_gtf_FindConVar(ConVarID)==jwl_gtf_NULL)
			return jwl_gtf_NoConVarID;
	}
	else
		tmpConVar=ConVar;
	if(tmpConVar->jwl_gtf_TaskStatus!=jwl_gtf_ConVarUsed)
		return jwl_gtf_ConVarNotUsed;
	if(tmpConVar->jwl_gtf_ConVarLink==jwl_gtf_NULL)
		return jwl_gtf_ConVarNotTask;
	tmpTaskCB=tmpConVar->jwl_gtf_ConVarLink;
	tmpMutex=tmpConVar->jwl_gtf_Mutex;
	if(tmpConvar->jwl_gtf_ConVarLink->jwl_gtf_EvenLink->Next==jwl_gtf_NULL)		/*只有一个挂起*/
	{
		tmpConVar->jwl_gtf_conVarLink=jwl_gtf_NULL;
		tmpConVar->jwl_gtf_Mutex=jwl_gtf_NULL;
	}
	else
	{
		tmpConVar->jwl_gtf_ConVarLink=tmpConVar->jwl_gtf_ConVarLink->jwl_gtf_EvenLink->Next;
		tmpConVar->jwl_gtf_ConVarLink->jwl_gtf_EvenLink->Pre=tmpConVar->jwl_gtf_ConVarLink;	
	}
	tmpTaskCB->jwl_gtf_EvenLink={jwl_gtf_NULL,jwl_gtf_NULL};
	tmpTaskCB->jwl_gtf_TaskStatus=jwl_gtf_Ready;
	if(tmpTaskCB->jwl_gtf_WaitTLink!={jwl_gtf_NULL,jwl_gtf_NULL})				/*断开超时链表*/
	{
		if(tmpTaskCB->jwl_gtf_WaitTLink->Pre==tmpTaskCB)				/*在头部*/
		{
			if(tmpTaskCB->jwl_gtf_WaitTLink->Next==jwl_gtf_NULL)
				jwl_gtf_ConVarTOut=jwl_gtf_NULL;
			else
			{
				jwl_gtf_ConVarTOut=jwl_gtf_ConVarTOut->jwl_gtf_WaitTLink->Next;
				jwl_gtf_ConVarTOut->jwl_gtf_WaitTLink->Pre=jwl_gtf_ConVarTOut;
			}
		}
		else if(tmpTaskCB->jwl_gtf_WaitTLink->Next==jwl_gtf_NULL)			/*尾部*/
			tmpTaskCB->jwl_gtf_WaitTLink->Pre->jwl_gtf_WaitTLink->Next=jwl_gtf_NULL;
		else										/*其他*/
		{
			tmpTaskCB->jwl_gtf_WaitTLink->Pre->jwl_gtf_WaitTLink->Next=\
				tmpTaskCB->jwl_gtf_WaitTLink->Next;
			tmpTaskCB->jwl_gtf_WaitTLink->Next->jwl_gtf_WaitTLink->Pre=\
				tmpTaskCB->jwl_gtf_WaitTLink->Pre;				
		}
		tmpTaskCB->jwl_gtf_WaitTLink={jwl_gtf_NULL,jwl_gtf_NULL};
		tmpTaskCB->jwl_gtf_TimeOut=0;
	}	
	if(tmpMutex!=jwl_gtf_NULL)
		jwl_gtf_MutexLock(0,tmpConVar->jwl_gtf_Mutex,0);
	else
	{
		if(oldTaskCB->jwl_gtf_TaskPro<jwl_gtf_TaskRun->jwl_gtf_TaskPro)
		{
			tmpExchOCB=tmpTaskCB;
			jwl_gtf_Switch
		}
	}
	return Noerror;
}

/********************************************************************************************************
*                                        jwl_gtf_SignalConSpec						*
* 描述:解锁指定的条件变量										*
* 参数: 	ConVarID										*
*		ConVar											*
*		TaskCB											*
*		TaskID											*
* 返回: 参看JWL-GTF.h											*
*********************************************************************************************************/
jwl_gtf_s8 jwl_gtf_ConVarSignal(jwl_gtf_TaskCB *ConVar,jwl_gtf_u8 ConVarID,jwl_gtf_TaskCB *TaskCB,\
	jwl_gtf_u8 TaskID)
{
	jwl_gtf_ConVar *tmpConVar;
	jwl_gtf_TaskCB *tmpTaskCB;
	jwl_gtf_TaskMutex *tmpMutex;
	if(ConVar==jwl_gtf_NULL)
	{
		if(tmpConVar=jwl_gtf_FindConVar(ConVarID)==jwl_gtf_NULL)
			return jwl_gtf_NoConVarID;
	}
	else
		tmpConVar=ConVar;
	if(tmpConVar->jwl_gtf_TaskStatus!=jwl_gtf_ConVarUsed)
		return jwl_gtf_ConVarNotUsed;
	if(TaskCB==jwl_gtf_NULL)
	{
		if(tmpTaskCB=jwl_gtf_FindTaskByID(TaskID)==jwl_gtf_NULL)
			return	jwl_gtf_NoTaskID;
	}
	else
		tmpTaskCB=TaskCB;
	if(tmpTask->jwl_gtf_ConVar!=tmpConVar)
	{
		if(tmpConVar->jwl_gtf_ConVarLink==jwl_gtf_NULL)
			return jwl_gtf_ConVarNotTask;
		tmpTaskCB=tmpConVar->jwl_gtf_ConVarLink;
		tmpMutex=tmpConVar->jwl_gtf_Mutex;
		if(tmpConvar->jwl_gtf_ConVarLink->jwl_gtf_EvenLink->Next==jwl_gtf_NULL)		/*只有一个挂起*/
		{
			tmpConVar->jwl_gtf_conVarLink=jwl_gtf_NULL;
			tmpConVar->jwl_gtf_Mutex=jwl_gtf_NULL;
		}
		else
		{
			tmpConVar->jwl_gtf_ConVarLink=tmpConVar->jwl_gtf_ConVarLink->jwl_gtf_EvenLink->Next;
			tmpConVar->jwl_gtf_ConVarLink->jwl_gtf_EvenLink->Pre=tmpConVar->jwl_gtf_ConVarLink;	
		}
		tmpTaskCB->jwl_gtf_EvenLink={jwl_gtf_NULL,jwl_gtf_NULL};
		tmpTaskCB->jwl_gtf_TaskStatus=jwl_gtf_Ready;
		if(tmpTaskCB->jwl_gtf_WaitTLink!={jwl_gtf_NULL,jwl_gtf_NULL})				/*断开超时链表*/
		{
			if(tmpTaskCB->jwl_gtf_WaitTLink->Pre==tmpTaskCB)				/*在头部*/
			{
				if(tmpTaskCB->jwl_gtf_WaitTLink->Next==jwl_gtf_NULL)
					jwl_gtf_ConVarTOut=jwl_gtf_NULL;
				else
				{
					jwl_gtf_ConVarTOut=jwl_gtf_ConVarTOut->jwl_gtf_WaitTLink->Next;
					jwl_gtf_ConVarTOut->jwl_gtf_WaitTLink->Pre=jwl_gtf_ConVarTOut;
				}
			}
			else if(tmpTaskCB->jwl_gtf_WaitTLink->Next==jwl_gtf_NULL)			/*尾部*/
				tmpTaskCB->jwl_gtf_WaitTLink->Pre->jwl_gtf_WaitTLink->Next=jwl_gtf_NULL;
			else										/*其他*/
			{
				tmpTaskCB->jwl_gtf_WaitTLink->Pre->jwl_gtf_WaitTLink->Next=\
					tmpTaskCB->jwl_gtf_WaitTLink->Next;
				tmpTaskCB->jwl_gtf_WaitTLink->Next->jwl_gtf_WaitTLink->Pre=\
					tmpTaskCB->jwl_gtf_WaitTLink->Pre;				
			}
			tmpTaskCB->jwl_gtf_WaitTLink={jwl_gtf_NULL,jwl_gtf_NULL};
			tmpTaskCB->jwl_gtf_TimeOut=0;
		}	
		if(tmpMutex!=jwl_gtf_NULL)
			jwl_gtf_MutexLock(0,tmpConVar->jwl_gtf_Mutex,0);
		else
		{
			if(oldTaskCB->jwl_gtf_TaskPro<jwl_gtf_TaskRun->jwl_gtf_TaskPro)
			{
				tmpExchOCB=tmpTaskCB;
				jwl_gtf_Switch
			}
		}	
	}
	else
	{
		tmpTaskCB=tmpConVar->jwl_gtf_ConVarLink;
		tmpMutex=tmpConVar->jwl_gtf_Mutex;
		if(tmpConvar->jwl_gtf_ConVarLink->jwl_gtf_EvenLink->Next==jwl_gtf_NULL)		/*只有一个挂起*/
		{
			tmpConVar->jwl_gtf_conVarLink=jwl_gtf_NULL;
			tmpConVar->jwl_gtf_Mutex=jwl_gtf_NULL;
		}
		else
		{
			tmpConVar->jwl_gtf_ConVarLink=tmpConVar->jwl_gtf_ConVarLink->jwl_gtf_EvenLink->Next;
			tmpConVar->jwl_gtf_ConVarLink->jwl_gtf_EvenLink->Pre=tmpConVar->jwl_gtf_ConVarLink;
		}
		tmpTaskCB->jwl_gtf_EvenLink={jwl_gtf_NULL,jwl_gtf_NULL};
		tmpTaskCB->jwl_gtf_TaskStatus=jwl_gtf_Ready;
		if(tmpTaskCB->jwl_gtf_WaitTLink!={jwl_gtf_NULL,jwl_gtf_NULL})				/*断开超时链表*/
		{
			if(tmpTaskCB->jwl_gtf_WaitTLink->Pre==tmpTaskCB)				/*在头部*/
			{
				if(tmpTaskCB->jwl_gtf_WaitTLink->Next==jwl_gtf_NULL)
					jwl_gtf_ConVarTOut=jwl_gtf_NULL;
				else
				{
					jwl_gtf_ConVarTOut=jwl_gtf_ConVarTOut->jwl_gtf_WaitTLink->Next;
					jwl_gtf_ConVarTOut->jwl_gtf_WaitTLink->Pre=jwl_gtf_ConVarTOut;
				}
			}
			else if(tmpTaskCB->jwl_gtf_WaitTLink->Next==jwl_gtf_NULL)			/*尾部*/
				tmpTaskCB->jwl_gtf_WaitTLink->Pre->jwl_gtf_WaitTLink->Next=jwl_gtf_NULL;
			else										/*其他*/
			{
				tmpTaskCB->jwl_gtf_WaitTLink->Pre->jwl_gtf_WaitTLink->Next=\
					tmpTaskCB->jwl_gtf_WaitTLink->Next;
				tmpTaskCB->jwl_gtf_WaitTLink->Next->jwl_gtf_WaitTLink->Pre=\
					tmpTaskCB->jwl_gtf_WaitTLink->Pre;				
			}
			tmpTaskCB->jwl_gtf_WaitTLink={jwl_gtf_NULL,jwl_gtf_NULL};
			tmpTaskCB->jwl_gtf_TimeOut=0;
		}	
		if(tmpMutex!=jwl_gtf_NULL)
			jwl_gtf_MutexLock(0,tmpConVar->jwl_gtf_Mutex,0);
		else
		{
			if(oldTaskCB->jwl_gtf_TaskPro<jwl_gtf_TaskRun->jwl_gtf_TaskPro)
			{
				tmpExchOCB=tmpTaskCB;
				jwl_gtf_Switch
			}
		}
	}
	return Noerror;
}

/********************************************************************************************************
*                                        jwl_gtf_ConVarBroadcast					*
* 描述:给自己连接的互斥量加锁										*
* 参数: 	ConVarID										*
*		ConVar											*
* 返回: 参看JWL-GTF.h											*
*********************************************************************************************************/
jwl_gtf_s8 jwl_gtf_ConVarBroacast(jwl_gtf_TaskCB *ConVar,jwl_gtf_u8 ConVarID)
{
	jwl_gtf_ConVar *tmpConVar;
	jwl_gtf_TaskCB *tmpTaskCB;
	jwl_gtf_TaskMutex *tmpMutex;
	if(ConVar==jwl_gtf_NULL)
	{
		if(tmpConVar=jwl_gtf_FindConVar(ConVarID)==jwl_gtf_NULL)
			return jwl_gtf_NoConVarID;
	}
	else
		tmpConVar=ConVar;
	if(tmpConVar->jwl_gtf_TaskStatus!=jwl_gtf_ConVarUsed)
		return jwl_gtf_ConVarNotUsed;
	if(tmpConVar->jwl_gtf_ConVarLink==jwl_gtf_NULL)
		return jwl_gtf_ConVarNotTask;
	tmpTaskCB=tmpConVar->jwl_gtf_ConVarLink;
	tmpMutex=tmpConVar->jwl_gtf_Mutex;
	do
	{
		if(Task->jwl_gtf_TaskPro>tmpTaskCB->jwl_gtf_TaskPro)
			Task=tmpTask;
		oldTaskCB=tmpTaskCB:
		tmpTaskCB=tmpTaskCB->jwl_gtf_EvenLink->Next;
		oldTaskCB->jwl_gtf_EvenLink={jwl_gtf_NULL,jwl_gtf_NULL};
		oldTaskCB->jwl_gtf_TaskStatus=jwl_gtf_Ready;
		if(oldTaskCB->jwl_gtf_WaitTLink!={jwl_gtf_NULL,jwl_gtf_NULL})				/*断开超时链表*/
		{
			if(oldTaskCB->jwl_gtf_WaitTLink->Pre==oldTaskCB)				/*在头部*/
			{
				if(oldTaskCB->jwl_gtf_WaitTLink->Next==jwl_gtf_NULL)
					jwl_gtf_ConVarTOut=jwl_gtf_NULL;
				else
				{
					jwl_gtf_ConVarTOut=jwl_gtf_ConVarTOut->jwl_gtf_WaitTLink->Next;
					jwl_gtf_ConVarTOut->jwl_gtf_WaitTLink->Pre=jwl_gtf_ConVarTOut;
				}
			}
			else if(oldTaskCB->jwl_gtf_WaitTLink->Next==jwl_gtf_NULL)			/*尾部*/
				oldTaskCB->jwl_gtf_WaitTLink->Pre->jwl_gtf_WaitTLink->Next=jwl_gtf_NULL;
			else										/*其他*/
			{
				oldTaskCB->jwl_gtf_WaitTLink->Pre->jwl_gtf_WaitTLink->Next=\
					oldTaskCB->jwl_gtf_WaitTLink->Next;
				oldTaskCB->jwl_gtf_WaitTLink->Next->jwl_gtf_WaitTLink->Pre=\
					oldTaskCB->jwl_gtf_WaitTLink->Pre;				
			}
			oldTaskCB->jwl_gtf_WaitTLink={jwl_gtf_NULL,jwl_gtf_NULL};
			oldTaskCB->jwl_gtf_TimeOut=0;
			jwl_gtf_SpecMutexLock(0,tmpConVar->jwl_gtf_Mutex,oldTaskCB,0)
		}
		oldTaskCB->jwl_gtf_ConVar=jwl_gtf_NULL;	
	}while(tmpTaskCB!=jwl_gtf_NULL);
	return Noerror;
}

⌨️ 快捷键说明

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