1.增加MUTEX权限判断,非Onwer任务不能解锁
STATIC E_STATUS IPC_UnlockMutex(LPKOBJECT_HEADER lpHeader, LPVOID lpParam)
{
LPTASK_CONTEXT lpThisContext, lpNextContext;
IPC_INFOR(TRUE, "Unlock mutex '%s' by '%s', value is %d.",
GetObjectName(lpHeader), GetContextTaskName(CORE_GetCurrentTask()),
GetMutexValue(lpHeader));
/* Mutex 的 Onwer 任务*/
lpThisContext = CORE_Handle2TaskContextCheck(GetMutexOnwer(lpHeader), FALSE);
/* 如果 Onwer 任务为空,则任务未锁或是BUG,返回未准备好 */
if (NULL == lpThisContext)
{
CORE_ERROR(TRUE, "Mutex '%s' haven't onwer task, task '%s' can not unlock it !",
GetObjectName(lpHeader), CORE_GetCurrentTaskName());
return STATE_NOT_READY;
}
/* 如果当前任务不是 Onwer 则没有解锁权限 */
if (lpThisContext != CORE_GetCurrentTask())
{
CORE_ERROR(TRUE, "Mutex '%s' unlock failed, task '%s' can not unlock it !",
GetObjectName(lpHeader), CORE_GetCurrentTaskName());
return STATE_INVALID_PERMISSION;
}
/* 如果 MUTEX VALUE 大于 0 表示 MUTEX 未锁, 信号数量不需要增加,直接返回成功 */
/* 如果 MUTEX VALUE + 1 后大于 0 表示,VALUE 自增前值为 0,即没有任务被阻塞 */
if (GetMutexValue(lpHeader) > 0 || IncMutexValue(lpHeader) > 0)
{
SetMutexOnwer(lpHeader, INVALID_HANDLE_VALUE);
return STATE_SUCCESS;
}
/* else 否则 MUTEX 中有任务被阻塞 */
/* 如果 VALUE 值表明 MUTEX 被阻塞,但是阻塞队列为空,则属于 BUG */
IPC_ASSERT(NULL != GetFirstWaitNode(lpHeader), SYSTEM_CALL_OOPS(),
"BUG: Bad mutex wait task queue.");
/* 阻塞在 MUTEX 中的最高优先级任务 */
lpNextContext = GetFirstWaitTask(lpHeader);
CORE_ResetTaskPriority(lpThisContext); /* 尝试恢复 ONWER 的初始先级 */
SetMutexOnwer(lpHeader, GetContextHandle(lpNextContext));
CORE_TaskWakeup(lpNextContext);
IPC_INFOR(TRUE, "Unlock '%s' and wakeup task '%s' ...",
GetObjectName(lpHeader), GetContextTaskName(lpNextContext));
return STATE_SUCCESS;
}
2.增加SEMAPHORE释放功能
STATIC E_STATUS IPC_FreeSemaphore(LPKOBJECT_HEADER lpHeader)
{
SHORT Signals = GetSemaphoreSignals(lpHeader);
/* 如果 Signals 小于0 则表明有任务被 SEMAPHORE 阻塞,释放前需要唤醒这些任务 */
if (Signals < 0)
{
LPLIST_HEAD lpList = NULL;
LPLIST_HEAD lpNode = NULL;
LIST_FOR_EACH_SAFE(lpList, lpNode, GetIPCWaitQueue(lpHeader))
{
LPTASK_CONTEXT lpWaitContext = GetContextByIPCNode(lpList);
CORE_TaskWakeup(lpWaitContext);
IPC_INFOR(TRUE, "Remove semaphore '%s' and wakeup task '%s' ...",
GetObjectName(lpHeader), GetContextTaskName(lpWaitContext));
}
IPC_DEBUG(TRUE, "Semaphore %s signals is '%d', max signals is '%d' ...",
GetObjectName(lpHeader), GetSemaphoreSignals(lpHeader), GetSemaphoreMaxCount(lpHeader));
}
return STATE_SUCCESS;
}
3.任务对象加入本地堆指针,ERROR CODE放入Bits字段节省空间
4.增加部分SEMAPHORE测试用例