📄 jwl-gtf_convar.c
字号:
/********************************************************************************************************
* JWL-GTF *
* 实时多任务操作系统 *
* *
* 作者:JWL-GTF *
* 日期:2004/04/07 *
* 修改日期:2004/04/07 *
* *
* 功能说明:多任务的条件变量的详细实现 *
*********************************************************************************************************/
/********************************************************************************************************
* jwl_gtf_ConVarFreeInit *
* 描述:系统初始化全局全局条件变量 *
* 参数: 无 *
* 返回: jwl_gtf_void *
*********************************************************************************************************/
_jwl_gtf_BuildFreeLinkInit(ConVar,jwl_gtf_MaxConVar)
/********************************************************************************************************
* jwl_gtf_ConVarInit *
* 描述:系统初始化全局全局条件变量 *
* 参数: 无 *
* 返回: 无 *
*********************************************************************************************************/
jwl_gtf_void jwl_gtf_ConVarInit()
{
jwl_gtf_ConVarID=0;
jwl_gtf_ConVarUsed=jwl_gtf_NULL;
jwl_gtf_ConVarFreeInit();
}
/********************************************************************************************************
* jwl_gtf_DeleteHead *
* 描述:系统初始化全局全局条件变量 *
* 参数: 无 *
* 返回: jwl_gtf_void *
*********************************************************************************************************/
_jwl_gtf_BuildDeleteLinkHead(Link,jwl_gtf_ConVar)
/********************************************************************************************************
* jwl_gtf_InsertLinkHead *
* 描述:插入链表头 *
* 参数: 无 *
* 返回: jwl_gtf_void *
*********************************************************************************************************/
_jwl_gtf_BuildInsertLinkHead(Link,jwl_gtf_ConVar)
/********************************************************************************************************
* jwl_gtf_GetConVar *
* 描述:从系统中获得条件变量 *
* 参数: 无 *
* 返回: jwl_gtf_ConVar *
*********************************************************************************************************/
jwl_gtf_ConVar *jwl_gtf_GetConVar()
{
jwl_gtf_ConVar *tmpConVar;
if(jwl_gtf_ConVarFree==jwl_gtf_NULL) /*没有可用资源*/
return jwl_gtf_NULL;
tmpConVar=jwl_gtf_ConVarFree;
jwl_gtf_DeleteHead(jwl_gtf_ConVarFree);
jwl_gtf_InsertLinkHead(jwl_gtf_ConVarUsed,tmpConVar);
tmpConVar->jwl_gtf_Status=jwl_gtf_ConVarUnUsed;
tmpConVar->jwl_gtf_ConVarID=jwl_gtf_ConVarID++;
tmpConVar->jwl_gtf_ConVarLink=jwl_gtf_NULL;
tmpConVar->jwl_gtf_Mutex=jwl_gtf_NULL;
return jwl_gtf_ConVarFree;
}
/********************************************************************************************************
* jwl_gtf_FindConVar *
* 描述:和互斥量联合起来 *
* 参数: ConVarID *
* 返回: jwl_gtf_TaskConVat *
*********************************************************************************************************/
jwl_gtf_ConVar *jwl_gtf_FindConVar(jwl_gtf_u8 ConVarID)
{
jwl_gtf_ConVar *tmpConVar;
tmpConVar=jwl_gtf_ConVarFree;
for(;tmpConVar!=jwl_gtf_NULL&&tmpConVar->jwl_gtf_ConVarID!=ID;\
tmpConVar=tmpConVar->jwl_gtf_Link->Next)
return tmpConVar;
}
/********************************************************************************************************
* jwl_gtf_ConVarConnectMutex *
* 描述:和互斥量联合起来 *
* 参数: ConVarID *
* ConVar *
* MutexID *
* Mutex *
* 返回: 参看JWL-GTF.h *
*********************************************************************************************************/
jwl_gtf_s8 jwl_gtf_ConVarConnectMutex(jwl_gtf_u8 ConVarID,jwl_gtf_ConVar *ConVar,jwl_gtf_TaskMutex *Mutex\
,jwl_gtf_u8 TaskCBID,jwl_gtf_bool Staus)
{
jwl_gtf_ConVar *tmpConVar;
jwl_gtf_TaskMutex *tmpMutex;
if(Status!=jwl_gtf_ConVarFIFO&&Status!=jwl_gtf_LIFO&&Status!=jwl_gtf_ConVarPro)
return jwl_gtf_ParaError;
if(ConVar==jwl_gtf_NULL)
{
if(tmpConVar=jwl_gtf_FindConVar(ConVarID)==jwl_gtf_NULL)
return jwl_gtf_NoConVarUsed;
}
else
tmpConVar=ConVar;
if(tmpMutex->jwl_gtf_Status==jwl_gtf_ConVarUsed) /*条件变量是否被锁*/
return jwl_gtf_ConVarLock;
if(Mutex==jwl_gtf_NULL)
tmpMutex=jwl_gtf_FundMutex(MutexID);
else
tmpMutex=Mutex;
tmpConVar->jwl_gtf_Mutex=tmpMutex; /*和互斥量连接*/
tmpConVar->jwl_gtf_Status=jwl_gtf_ConVarUsed; /*此资源已被用*/
tmpConVar->jwl_gtf_WaiteStatus=Status;
return jwl_gtf_NULL;
}
/********************************************************************************************************
* jwl_gtf_LockConVar *
* 描述:给自己连接的互斥量加锁 *
* 参数: ConVarID *
* ConVar *
* 返回: 参看JWL-GTF.h *
*********************************************************************************************************/
jwl_gtf_s8 jwl_gtf_LockConVar(jwl_gtf_ConVar *ConVar,jwl_gtf_u8 ID)
{
jwl_gtf_ConVar *tmpConVar;
if(ConVar==jwl_gtf_NULL)
{
if(tmpConViar=jwl_gtf_FindConVar(ID)==jwl_gtf_NULL)
return jwl_gtf_NoConVarID;
}
else
tmpConVar=ConVar;
if(tmpConVar->jwl_gtf_Status!=jwl_gtf_ConVarUsed)
return jwl_gtf_NotConnectMutex; /*此条件变量没有连接到互斥量*/
if(tmpConVar->jwl_gtf_Mutex==jwl_gtf_NULL)
return jwl_gtf_Noerror;
jwl_gtf_MutexLock(0,tmpConVar->jwl_gtf_Mutex,0);
return jwl_gtf_Noerror;
}
/********************************************************************************************************
* jwl_gtf_ConVarWait *
* 描述:给自己连接的互斥量加锁 *
* 参数: ConVarID *
* ConVar *
* 返回: 参看JWL-GTF.h *
*********************************************************************************************************/
jwl_gtf_s8 jwl_gtf_ConVarWait(jwl_gtf_ConVar *ConVar,jwl_gtf_u8 ConVarID,jwl_gtf_u32 TimeOut)
{
jwl_gtf_ConVar *tmpMutex;
jwl_gtf_TaskCB *tmpTaskCB;
jwl_gtf_s8 tmpRetCode;
if(TimeOut<0)
return jwl_gtf_ParaError;
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_NotConnectMutex;
if(tmpConVar->jwl_gtf_Mutex!=jwl_gtf_NULL)
jwl_gtf_MutexUnLock();
jwl_gtf_TaskRun->jwl_gtf_Status=jwl_gtf_ConVar; /*线程变成条件变量状态*/
jwl_gtf_TaskRun->jwl_gtf_ConVar=tmpConVar;
if(tmpConVar->jwl_gtf_ConVarLink==jwl_gtf_NULL) /*挂起指针为NULL*/
{
tmpConVar->jwl_gtf_ConVarLink=jwl_gtf_TaskRun;
jwl_gtf_TaskRun->jwl_gtf_EvenLink->Next=jwl_gtf_NULL;
jwl_gtf_TaskRun->jwl_gtf_EvenLink->Pre=tmpConVar->jwl_gtf_ConVarLink;
}
else /*否则*/
{
tmpTaskCB=tmpConVar->jwl_gtf_ConVarLink;
if(tmpConVar->jwl_gtf_WaiteStatus==jwl_gtf_ConVarFIFO) /*先进先出*/
{
for(;tmpTaskCB->jwl_gtf_EvenLink->Next!=jwl_gtf_NULL;\
tmpConVar=tmpConVar->jwl_gtf_EvenLink->Next)
tmpTaskCB->jwl_gtf_EvenLink->Next=jwl_gtf_TaskRun;
jwl_gtf_Run->jwl_gtf_EvenLink->Next=jwl_gtf_NULL;
jwl_gtf_Run->jwl_gtf_EvenLink->Pre=tmpTaskCB;
}
else if(tmpConVar->jwl_gtf_WaiteStatus==jwl_gtf_ConVarLIFO) /*后进先出*/
{
jwl_gtf_TaskRun->jwl_gtf_EvenLink->Next=tmpTaskCB;
tmpTaskCB->jwl_gtf_EvenLink->Pre=jwl_gtf_TaskRun;
tmpTaskCB=jwl_gtf_TaskRun;
jwl_gtf_TaskRun->jwl_gtf_EvenLink->Pre=tmpTaskCB;
}
else /*按优先级*/
{
for(;tmpTaskCB!=jwl_gtf_NULL&&tmpTaskOCB->jwl_gtf_TaskPro>\
jwl_gtf_TaskRun->jwl_gtf_TaskPro;tmpTaskCB->jwl_gtf_EvenLink->Next)
if(tmpTaskCB->jwl_gtf_EnevLink->Pre=tmpTaskCB) /*头部*/
{
jwl_gtf_TaskRun->jwl_gtf_EvenLink->Next=tmpTaskCB;
tmpTaskCB->jwl_gtf_EvenLink->Pre=jwl_gtf_TaskRun;
tmpTaskCB=jwl_gtf_TaskRun;
jwl_gtf_TaskRun->jwl_gtf_EvenLink->Pre=tmpTaskCB;
}
else if(tmpTaskCB==jwl_gtf_NULL) /*尾部*/
{
jwl_gtf_TaskRun->jwl_gtf_EvenLink->Next=tmpTaskCB;
tmpTaskCB->jwl_gtf_EvenLink->Pre=jwl_gtf_TaskRun;
tmpTaskCB=jwl_gtf_TaskRun;
jwl_gtf_TaskRun->jwl_gtf_EvenLink->Pre=tmpTaskCB;
}
else /*中间*/
{
jwl_gtf_Run->jwl_gtf_EvenLink->Next=tmpTaskCB;
tmpTaskCB->jwl_gtf_EvenLink->Pre->jwl_gtf_EvenLink->Next=jwl_gtf_TaskRun;
jwl_gtf_TaskRun->jwl_gtf_EvenLink->Pre=tmpTaskCB->jwl_gtf_EvenLink->Pre;
tmpTaskCB->jwl_gtf_EvenLink->Pre=jwl_gtf_TaskRun;
}
}
}
jwl_gtf_TaskRun->jwl_gtf_TimeOut=TimeOut;
if(jwl_gtf_ConVarTOut==jwl_gtf_NULL) /*是否为NULL*/
{
jwl_gtf_ConVarTOut=jwl_gtf_TaskRun;
jwl_gtf_TaskRun->jwl_gtf_WaitTLink->Next=jwl_gtf_NULL;
jwl_gtf_TaskRun->jwl_gtf_WatiTLink->Pre=jwl_gtf_ConVarTOut;
}
else
{
jwl_gtf_TaskRun->jwl_gtf_WaitTLink->Next=jwl_gtf_ConVarTOut->jwl_gtf_WatTLink;
jwl_gtf_ConVarTOut->jwl_gtf_WaitTLink->Pre=jwl_gtf_TaskRun;
jwl_gtf_ConVarTOut=jwl_gtf_TaskRun;
jwl_gtf_ConVarTOut->jwl_gtf_WaitTLink->Pre-jwl_gtf_ConVarTOut;
}
jwl_gtf_FindRunTask();
jwl_gtf_Switch
tmpRetCode=jwl_gtf_TaskRun->jwl_gtf_RetCode;
jwl_gtf_TaskRun->jwl_gtf_RetCode=jwl_Noerror;
return tmpRetCode;
}
/********************************************************************************************************
* jwl_gtf_CancelConVarWait *
* 描述:取消挂起的进程 *
* 参数: ConVarID *
* ConVar *
* TaskID *
* Task *
* 返回: 参看JWL-GTF.h *
*********************************************************************************************************/
jwl_gtf_s8 jwl_gtf_CancelConVarVarWait(jwl_gtf_ConVar *ConVar,jwl_gtf_u8 ConVarID,jwl_gtf_TaskCB *Task\
,jwl_gtf_U8 TaskID)
{
jwl_gtf_TasCB *tmpTaskCB,*oldTaskCB;
jwl_gtf_ConVar *tmpConVar;
jwl_gtf_TaskMutex *tmpMutex;
if(TaskCB==jwl_gtf_NULL)
{
if(tmpTaskCB=jwl_gtf_FundByID(TaskCBID)==jwl_gtf_NULL) /*检测任务ID号是否存在*/
return jwl_gtf_NoTaskID;
}
else
tmpTaskCB=TaskCB;
if(tmpTaskCB->jwl_gtf_TaskStatus==jwl_gtfConVar)
return jwl_gtf_NoCancelTaskCB; /*此进程不在条件信号量挂起队列中*/
if(ConVar==jwl_gtf_NULL)
{
if(tmpConVar=jwl_gtf_FindConVar(ConVarID)==jwl_gtf_NULL)
return jwl_gtf_NoConVarID;
}
else
tmpConVar=ConVar;
if(ConVar->jwl_gtf_Status!=jwl_gtf_ConVarUsed)
return jwl_gtf_ConVarNotUsed;
oldTaskCB=tmpConVar->jwl_gtf_ConVarLink;
for(;oldTaskCB!=jwl_gtf_NULL&&oldTaskCB!=tmpTaskCB;oldTaskCB->\
jwl_gtf_EvenLink->Next);
if(oldTaskCB==jwl_gtf_NULL)
return jwl_gtf_ConVarNotTask; /*条件变量中没有挂起的线程*/
tmpMutex=tmpConVar->jwl_gtf_Mutex;
if(oldTaskCB->jwl_gtf_EvenLink->Pre==tmpConVar->jwl_gtf_ConVarLink) /*是否在链表头*/
{
if(oldTaskCB->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;
}
}
else if(oldTaskCB->jwl_gtf_EvenLink->Next==jwl_gtf_NULL) /*尾巴*/
oldTaskCB->jwl_gtf_EvenLink->Pre->jwl_gtf_EvenLink->Next=jwl_gtf_NULL;
else /*中间*/
{
oldTaskCB->jwl_gtf_EvenLink->Pre->jwl_gtf_EvenLink->Next=\
oldTaskCB->jwl_gtf_EvenLink->Next;
oldTaskCB->jwl_gtf_EvenLink->Next->jwl_gtf_EvenLink->Pre=\
oldTaskCB->jwl_gtf_EvenLink->Pre;
}
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;
}
oldTaskCB->jwl_gtf_ConVar=jwl_gtf_NULL;
oldTaskCB->jwl_gtf_RetCode=jwl_gtf_HupUpTaskCancel;
if(oldTaskCB->jwl_gtf_TaskPro<jwl_gtf_TaskRun->jwl_gtf_TaskPro)
{
tmpExchOCB=tmpTaskCB;
jwl_gtf_Switch
}
return jwl_gtf_Noerror;
}
/********************************************************************************************************
* jwl_gtf_CancelAllConWait *
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -