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测试用例