📄 jwl-gtf_mutex.c
字号:
return jwl_gtf_TaskNoNutex;
else
{
tmpMutex=jwl_gtf_TaskRun->jwl_gtf_Mutex;
if(tmpMutex->jwl_gtf_RevOCB!=jwl_gtf_NULL)
{
jwl_gtf_ProiRevert(jwl_gtf_TaskRun,tmpMutex->jwl_gtf_RevOCB);
tmpMutex->jwl_gtf_RevOCB=jwl_gtf_NULL;
}
jwl_gtf_TaskRun->jwl_gtf_Mutex=jwl_gtf_NULL;
if(tmpMutex->jwl_gtf_Using=tmpMutex->jwl_gtf_MutexLink==jwl_gtf_NULL) /*系统中是否没有互斥挂起的线程*/
{
jwl_gtf_TaskRun->jwl_gtf_TaskStauts=jwl_gtf_TaskRun->jwl_gtf_TaskStaus&(!jwl_gtf_Mutex);
tmpMutex->jwl_gtf_Status=jwl_gtf_Usable;
}
else /*有线程挂起*/
{
if(tmpMutex->jwl_gtf_MutexLink->jwl_gtf_EvenLink->Next=jwl_gtf_NULL) /*是否只有一个挂挂起*/
{
tmpMutex->jwl_gtf_MutexLink=jwl_gtf_NULL;
tmpMutex->jwl_gtf_Using->jwl_gtf_EvenLink={jwl_gtf_NULL,jwl_gtf_NULL};
tmpMutex->jwl_gtf_Status=jwl_gtf_Using;
tmpMutex->jwl_gtf_Using->jwl_gtf_Status=jwl_gtf_Ready|jwl_gtf_Mutex;
jwl_gtf_TOutMutex=jwl_gtf_NULL;
tmpMutex->jwl_gtf_Using->jwl_gtf_WaitTLink={jwl_gtf_NULL,jwl_gtf_NULL};
if(tmpMutex->jwl_gtf_Using->Taskro<jwl_gtf_TaskRun->jwl_gtf_TaskPro)
{
tmpExchOCB=tmpMutex->jwl_gtf_Using;
jwl_gtf_Switch
}
}
else /*否则*/
{
tmpMutex->jwl_gtf_MutexLink=tmpMutex->jwl_gtf_MutexLink->Next;
tmpMutex->jwl_gtf_MutexLink->jwl_gtf_MutexLink->pre=tmpMutex->jwl_gtf_MutexLink;
tmpMutex->jwl_gtf_Using->jwl_gtf_EvenLink={jwl_gtf_NULL,jwl_gtf_NULL};
if(tmpMutex->jwl_gtf_MutexProtocol==jwl_gtf_MutexInherit)
{
if(tmpMutex->jwl_gtf_WaitStatus!=jwl_gtf_MutexPro)
{
oldTaskCB->jwl_gtf_TaskPro=jwl_gtf_MaxTask;
tmpTaskCB=tmpMutex->jwl_gtf_MutexLink;
for(;tmpTaskCB!=jwl_gtf_NULL;tmpTaskCB->jwl_gtf_EvenLink->Next) /*得到挂起最高优先级*/
{
if(tmpTaskCB->jwl_gtf_TaskPro<oldTaskCB->jwl_gtf_TaskPro)
oldTaskCB=tmpTaskCB;
}
if(tmpMutex->jwl_gtf_Using->jwl_gtf_TaskPro<oldTaskCB->jwl_gtf_TaskPro) /*是否要优先级任务反转*/
{
jwl_gtf_ProiRevert(tmpMutex->jwl_gtf_Using,oldTaskCB);
tmpMutex->jwl_gtf_Status=jwl_gtf_ProRev;
tmpMutex->jwl_gtf_RevOCB=oldTaskCB:
}
}
else
tmpMutex->jwl_gtf_Status=jwl_gtf_Using;
}
else
tmpMutex->jwl_gtf_Status=jwl_gtf_Using;
tmpMutex->jwl_gtf_Using->jwl_gtf_Status=jwl_gtf_Ready|jwl_gtf_Mutex;
if(tmpMutex->jwl_gtf_Using->jwl_gtf_WaitTLink!={jwl_gtf_NULL,jwl_gtf_NULL})
{
if(tmpMutex->jwl_gtf_Using->jwl_gtf_WaitTLink->Pre==jwl_gtf_TOutMutex)
{
jwl_gtf_TOutMutex=jwl_gtf_TOutMutex->jwl_gtf_WatiTLink->Next;
jwl_gtf_TOutMutex->jwl_gtf_WaitTLink->Pre=jwl_gtf_TOutMutex;
}
else if(tmpMutex->jwl_gtf_Using->jwl_gtf_WaitTLink->Next==jwl_gtf_NULL)
tmpMutex->jwl_gtf_Using->jwl_gtf_WaitTLink->Pre->\
jwl_gtf_WaitTLink->Next=jwl_gtf_NULL;
else
{
tmpMutex->jwl_gtf_Using->jwl_gtf_WaitTLink->Pre->jwl_gtf_WaitTLink\
->Next=tmpMutex->jwl_gtf_Using->jwl_gtf_WaitTLink->Next;
tmpMutex->jwl_gtf_Using->jwl_gtf_WaitTLink->Next->jwl_gtf_WaitTLink\
->Pre=tmpMutex->jwl_gtf_Using->jwl_gtf_WaitTLink->Pre;
}
tmpMutex->jwl_gtf_Using->jwl_gtf_WaitTLink={jwl_gtf)NULL,jwl_gtf_NULL};
}
if(tmpMutex->jwl_gtf_Using->Taskro<jwl_gtf_TaskRun->jwl_gtf_TaskPro)
{
tmpExchOCB=tmpMutex->jwl_gtf_Using;
jwl_gtf_Switch
}
}
}
}
return jwl_gtf_Noerror;
}
/********************************************************************************************************
* jwl_gtf_MutexUnLock *
* 描述:解锁指定互斥体 *
* 参数 TaskCB *
* TaskID *
* Stauts *
* 返回: 参看JWL-GTF_error.h *
*********************************************************************************************************/
jwl_gtf_s8 jwl_gtf_MutexUnLockSpec(jwl_gtf_TaskCB *TaskCB,jwl_gtf_u8 TaskID,jwl_gtf_bool Status)
{
jwl_gtf_Mutex *tmpMutex;
jwl_gtf_TaskCB *tmpTaskCB,*oldTaskCB,*Task;
if(Status!=jwl_gtf_Continue&&(Status!=jwl_gtf_Cancel)
return jwl_gtf_ParaError;
if(jwl_gtf_TaskRun->jwl_gtf_Mutex==jwl_gtf_NULL)
return jwl_gtf_TaskNoNutex;
if(TaskCB==jwl_gtf_NULL)
{
if(tmpTaskCB=jwl_gtf_FindTaskByID(TaskID)==jwl_gtf_NULL)
return jwl_gtf_NoTaskID;
}
else
tmpTaskCB=TaskCB;
if(tmpTaskCB->jwl_gtf_Mutex==jwl_gtf_TaskRun->jwl_gtf_Mutex)
{
tmpMutex=jwl_gtf_TaskRun->jwl_gtf_Mutex;
if(tmpMutex->jwl_gtf_RevOCB!=jwl_gtf_NULL)
{
jwl_gtf_ProiRevert(jwl_gtf_TaskRun,tmpMutex->jwl_gtf_RevOCB);
tmpMutex->jwl_gtf_RevOCB=jwl_gtf_NULL;
}
jwl_gtf_TaskRun->jwl_gtf_Mutex=jwl_gtf_NULL;
if(tmpMutex->jwl_gtf_MutexLink->jwl_gtf_EvenLink->Next=jwl_gtf_NULL) /*是否只有一个挂挂起*/
{
tmpMutex->jwl_gtf_Using=tmpMutex->jwl_gtf_MutexLink;
tmpMutex->jwl_gtf_MutexLink=jwl_gtf_NULL;
tmpMutex->jwl_gtf_Using->jwl_gtf_EvenLink={jwl_gtf_NULL,jwl_gtf_NULL};
tmpMutex->jwl_gtf_Status=jwl_gtf_Using;
tmpMutex->jwl_gtf_Using->jwl_gtf_Status=jwl_gtf_Ready|jwl_gtf_Mutex;
jwl_gtf_TOutMutex=jwl_gtf_NULL;
tmpMutex->jwl_gtf_Using->jwl_gtf_WaitTLink={jwl_gtf_NULL,jwl_gtf_NULL};
if(tmpMutex->jwl_gtf_Using->Taskro<jwl_gtf_TaskRun->jwl_gtf_TaskPro)
{
tmpExchOCB=tmpMutex->jwl_gtf_Using;
jwl_gtf_Switch
}
}
else /*否则*/
{
if(tmpTaskCB->jwl_gtf_EvenLink->Next==jwl_gtf_NULL) /*是否在尾巴*/
tmpTaskCB->jwl_gtf_EvenLink->Pre->\
jwl_gtf_EvenLink->Next=jwl_gtf_NULL;
else /*否则*/
{
tmpTaskCB->jwl_gtf_EvenLink->Pre->jwl_gtf_EvenLink->Next=\
tmpTaskCB->jwl_gtf_EvenLink->Next;
tmpTaskCB->jwl_gtf_EvenLink->Next->jwl_gtf_EvenLink->Pre=\
tmpTaskCB->jwl_gtf_EvenLink->Pre;
}
tmpMutex->jwl_gtf_Using->jwl_gtf_EvenLink={jwl_gtf_NULL,jwl_gtf_NULL};
if(tmpMutex->jwl_gtf_MutexProtocol==jwl_gtf_MutexInherit)
{
if(tmpMutex->jwl_gtf_WaitStatus!=jwl_gtf_MutexPro)
{
oldTaskCB->jwl_gtf_TaskPro=jwl_gtf_MaxTask;
Task=tmpMutex->jwl_gtf_MutexLink;
for(;Task!=jwl_gtf_NULL;Task=Task->jwl_gtf_EvenLink->Next) /*得到挂起最高优先级*/
{
if(Task->jwl_gtf_TaskPro<oldTaskCB->jwl_gtf_TaskPro)
oldTaskCB=Task;
}
}
else
oldTaskCB=tmpMutex->jwl_gtf_MutexLink;
if(tmpMutex->jwl_gtf_Using->jwl_gtf_TaskPro<oldTaskCB->jwl_gtf_TaskPro) /*是否要优先级任务反转*/
{
jwl_gtf_ProiRevert(tmpMutex->jwl_gtf_Using,oldTaskCB);
tmpMutex->jwl_gtf_Status=jwl_gtf_ProRev;
tmpMutex->jwl_gtf_RevOCB=oldTaskCB:
}
else
tmpMutex->jwl_gtf_Status=jwl_gtf_Using;
}
else
tmpMutex->jwl_gtf_Status=jwl_gtf_Using;
tmpMutex->jwl_gtf_Using->jwl_gtf_Status=jwl_gtf_Ready|jwl_gtf_Mutex;
if(tmpMutex->jwl_gtf_Using->jwl_gtf_WaitTLink!={jwl_gtf_NULL,jwl_gtf_NULL})
{
if(tmpMutex->jwl_gtf_Using->jwl_gtf_WaitTLink->Pre==jwl_gtf_TOutMutex)
{
jwl_gtf_TOutMutex=jwl_gtf_TOutMutex->jwl_gtf_WatiTLink->Next;
jwl_gtf_TOutMutex->jwl_gtf_WaitTLink->Pre=jwl_gtf_TOutMutex;
}
else if(tmpMutex->jwl_gtf_Using->jwl_gtf_WaitTLink->Next==jwl_gtf_NULL)
tmpMutex->jwl_gtf_Using->jwl_gtf_WaitTLink->Pre->\
jwl_gtf_WaitTLink->Next=jwl_gtf_NULL;
else
{
tmpMutex->jwl_gtf_Using->jwl_gtf_WaitTLink->Pre->jwl_gtf_WaitTLink\
->Next=tmpMutex->jwl_gtf_Using->jwl_gtf_WaitTLink->Next;
tmpMutex->jwl_gtf_Using->jwl_gtf_WaitTLink->Next->jwl_gtf_WaitTLink\
->Pre=tmpMutex->jwl_gtf_Using->jwl_gtf_WaitTLink->Pre;
}
tmpMutex->jwl_gtf_Using->jwl_gtf_WaitTLink={jwl_gtf)NULL,jwl_gtf_NULL};
}
if(tmpMutex->jwl_gtf_Using->Taskro<jwl_gtf_TaskRun->jwl_gtf_TaskPro)
{
tmpExchOCB=tmpMutex->jwl_gtf_Using;
jwl_gtf_Switch
}
}
}
else
{
if(Status==jwl_gtf_Cancel)
return jwl_gtf_Noerror;
else
{
tmpMutex=jwl_gtf_TaskRun->jwl_gtf_Mutex;
if(tmpMutex->jwl_gtf_RevOCB!=jwl_gtf_NULL)
{
jwl_gtf_ProiRevert(jwl_gtf_TaskRun,tmpMutex->jwl_gtf_RevOCB);
tmpMutex->jwl_gtf_RevOCB=jwl_gtf_NULL;
}
jwl_gtf_TaskRun->jwl_gtf_Mutex=jwl_gtf_NULL;
if(tmpMutex->jwl_gtf_Using=tmpMutex->jwl_gtf_MutexLink==jwl_gtf_NULL) /*系统中是否没有互斥挂起的线程*/
{
jwl_gtf_TaskRun->jwl_gtf_TaskStauts=jwl_gtf_TaskRun->jwl_gtf_TaskStaus&(!jwl_gtf_Mutex);
tmpMutex->jwl_gtf_Status=jwl_gtf_Usable;
}
else /*有线程挂起*/
{
if(tmpMutex->jwl_gtf_MutexLink->jwl_gtf_EvenLink->Next=jwl_gtf_NULL) /*是否只有一个挂挂起*/
{
tmpMutex->jwl_gtf_MutexLink=jwl_gtf_NULL;
tmpMutex->jwl_gtf_Using->jwl_gtf_EvenLink={jwl_gtf_NULL,jwl_gtf_NULL};
tmpMutex->jwl_gtf_Status=jwl_gtf_Using;
tmpMutex->jwl_gtf_Using->jwl_gtf_Status=jwl_gtf_Ready|jwl_gtf_Mutex;
jwl_gtf_TOutMutex=jwl_gtf_NULL;
tmpMutex->jwl_gtf_Using->jwl_gtf_WaitTLink={jwl_gtf_NULL,jwl_gtf_NULL};
if(tmpMutex->jwl_gtf_Using->Taskro<jwl_gtf_TaskRun->jwl_gtf_TaskPro)
{
tmpExchOCB=tmpMutex->jwl_gtf_Using;
jwl_gtf_Switch
}
}
else /*否则*/
{
tmpMutex->jwl_gtf_MutexLink=tmpMutex->jwl_gtf_MutexLink->Next;
tmpMutex->jwl_gtf_MutexLink->jwl_gtf_MutexLink->pre=tmpMutex->jwl_gtf_MutexLink;
tmpMutex->jwl_gtf_Using->jwl_gtf_EvenLink={jwl_gtf_NULL,jwl_gtf_NULL};
if(tmpMutex->jwl_gtf_MutexProtocol==jwl_gtf_MutexInherit)
{
if(tmpMutex->jwl_gtf_WaitStatus!=jwl_gtf_MutexPro)
{
oldTaskCB->jwl_gtf_TaskPro=jwl_gtf_MaxTask;
tmpTaskCB=tmpMutex->jwl_gtf_MutexLink;
for(;tmpTaskCB!=jwl_gtf_NULL;tmpTaskCB->jwl_gtf_EvenLink->Next) /*得到挂起最高优先级*/
{
if(tmpTaskCB->jwl_gtf_TaskPro<oldTaskCB->jwl_gtf_TaskPro)
oldTaskCB=tmpTaskCB;
}
}
else
oldTaskCB=tmpMutex->jwl_gtf_NutexLink;
if(tmpMutex->jwl_gtf_Using->jwl_gtf_TaskPro<oldTaskCB->jwl_gtf_TaskPro) /*是否要优先级任务反转*/
{
jwl_gtf_ProiRevert(tmpMutex->jwl_gtf_Using,oldTaskCB);
tmpMutex->jwl_gtf_Status=jwl_gtf_ProRev;
tmpMutex->jwl_gtf_RevOCB=oldTaskCB:
}
else
tmpMutex->jwl_gtf_Status=jwl_gtf_Using;
}
else
tmpMutex->jwl_gtf_Status=jwl_gtf_Using;
tmpMutex->jwl_gtf_Using->jwl_gtf_Status=jwl_gtf_Ready|jwl_gtf_Mutex;
if(tmpMutex->jwl_gtf_Using->jwl_gtf_WaitTLink!={jwl_gtf_NULL,jwl_gtf_NULL})
{
if(tmpMutex->jwl_gtf_Using->jwl_gtf_WaitTLink->Pre==jwl_gtf_TOutMutex)
{
jwl_gtf_TOutMutex=jwl_gtf_TOutMutex->jwl_gtf_WatiTLink->Next;
jwl_gtf_TOutMutex->jwl_gtf_WaitTLink->Pre=jwl_gtf_TOutMutex;
}
else if(tmpMutex->jwl_gtf_Using->jwl_gtf_WaitTLink->Next==jwl_gtf_NULL)
tmpMutex->jwl_gtf_Using->jwl_gtf_WaitTLink->Pre->\
jwl_gtf_WaitTLink->Next=jwl_gtf_NULL;
else
{
tmpMutex->jwl_gtf_Using->jwl_gtf_WaitTLink->Pre->jwl_gtf_WaitTLink\
->Next=tmpMutex->jwl_gtf_Using->jwl_gtf_WaitTLink->Next;
tmpMutex->jwl_gtf_Using->jwl_gtf_WaitTLink->Next->jwl_gtf_WaitTLink\
->Pre=tmpMutex->jwl_gtf_Using->jwl_gtf_WaitTLink->Pre;
}
tmpMutex->jwl_gtf_Using->jwl_gtf_WaitTLink={jwl_gtf)NULL,jwl_gtf_NULL};
}
if(tmpMutex->jwl_gtf_Using->Taskro<jwl_gtf_TaskRun->jwl_gtf_TaskPro)
{
tmpExchOCB=tmpMutex->jwl_gtf_Using;
jwl_gtf_Switch
}
}
}
}
}
return jwl_gtf_Noerror;
}
/********************************************************************************************************
* jwl_gtf_CancelMutexLock *
* 描述:取消指定挂起的任务 *
* 参数: MutexID :给出的互斥体ID号 *
* Mutex :给出的互斥体指针 *
* TaskID :给出的任务ID号 *
* Task :给出的任务指针 *
* 返回: :参看JWL-GTF_error.h *
*********************************************************************************************************/
jwl_gtf_s8 jwl_gtf_CancelMutexLock(wl_gtf_TaskCB *TaskCB,jwl_gtf_u8 TaskID)
{
jwl_gtf_TaskCB *tmpTaskCB,*oldTaskCB,*sTaskCB;
jwl_gtf_TaskMutex *tmpMutex;
if(TaskCB==jwl_gtf_NULL) /*所给的任务控制块是否为NULL*/
{
if(tmpTaskCB=jwl_gtf_FundByID(TaskID)!=jwl_gtf_NULL)
return jwl_gtf_NoRunCB;
}
else
tmpTaskCB=TaskCB;
if(tmpTaskCB->jwl_gtf_Mutex==jwl_gtf_NULL) /*线程是否被互斥*/
return jwl_gtf_TaskNoNutex;
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -