67#ifdef LOSCFG_BASE_IPC_RWLOCK
68#define RWLOCK_COUNT_MASK 0x00FFFFFFU
72 if ((rwlock != NULL) && ((rwlock->
magic & RWLOCK_COUNT_MASK) == OS_RWLOCK_MAGIC)) {
87 SCHEDULER_LOCK(intSave);
88 if ((rwlock->
magic & RWLOCK_COUNT_MASK) == OS_RWLOCK_MAGIC) {
89 SCHEDULER_UNLOCK(intSave);
97 rwlock->
magic = OS_RWLOCK_MAGIC;
98 SCHEDULER_UNLOCK(intSave);
106 if (rwlock == NULL) {
110 SCHEDULER_LOCK(intSave);
111 if ((rwlock->
magic & RWLOCK_COUNT_MASK) != OS_RWLOCK_MAGIC) {
112 SCHEDULER_UNLOCK(intSave);
117 SCHEDULER_UNLOCK(intSave);
122 SCHEDULER_UNLOCK(intSave);
128 if (rwlock == NULL) {
138 if (runTask->
taskStatus & OS_TASK_FLAG_SYSTEM_TASK) {
148 LosTaskCB *highestTask = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(rwList));
171 if (rwlock->
rwCount == INT8_MAX) {
201 ret = runTask->
ops->
wait(runTask, node, timeout);
202 if (ret == LOS_ERRNO_TSK_TIMEOUT) {
203 return LOS_ETIMEDOUT;
224 if (rwlock->
rwCount == INT8_MIN) {
244 ret = runTask->
ops->
wait(runTask, node, timeout);
245 if (ret == LOS_ERRNO_TSK_TIMEOUT) {
254 if ((rwlock->
magic & RWLOCK_COUNT_MASK) != OS_RWLOCK_MAGIC) {
263 if ((rwlock->
magic & RWLOCK_COUNT_MASK) != OS_RWLOCK_MAGIC) {
292 if ((rwlock->
magic & RWLOCK_COUNT_MASK) != OS_RWLOCK_MAGIC) {
301 if ((rwlock->
magic & RWLOCK_COUNT_MASK) != OS_RWLOCK_MAGIC) {
330 SCHEDULER_LOCK(intSave);
332 SCHEDULER_UNLOCK(intSave);
345 SCHEDULER_LOCK(intSave);
347 SCHEDULER_UNLOCK(intSave);
360 SCHEDULER_LOCK(intSave);
362 SCHEDULER_UNLOCK(intSave);
375 SCHEDULER_LOCK(intSave);
377 SCHEDULER_UNLOCK(intSave);
385 if (isReadEmpty && isWriteEmpty) {
388 if (!isReadEmpty && isWriteEmpty) {
391 if (isReadEmpty && !isWriteEmpty) {
394 LosTaskCB *pendedReadTask = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(readList));
395 LosTaskCB *pendedWriteTask = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(writeList));
415 resumedTask = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&(rwlock->
writeList)));
418 resumedTask->
ops->
wake(resumedTask);
419 if (needSched != NULL) {
426 resumedTask = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&(rwlock->
readList)));
427 resumedTask->
ops->
wake(resumedTask);
429 resumedTask = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&(rwlock->
readList)));
431 LosTaskCB *pendedWriteTask = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&(rwlock->
writeList)));
436 if (rwlock->
rwCount == INT8_MAX) {
440 resumedTask->
ops->
wake(resumedTask);
443 if (needSched != NULL) {
451 if ((rwlock->
magic & RWLOCK_COUNT_MASK) != OS_RWLOCK_MAGIC) {
485 BOOL needSched = FALSE;
492 SCHEDULER_LOCK(intSave);
494 SCHEDULER_UNLOCK(intSave);
496 if (needSched == TRUE) {
LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListInit(LOS_DL_LIST *list)
LITE_OS_SEC_ALW_INLINE STATIC INLINE BOOL LOS_ListEmpty(LOS_DL_LIST *list)
Identify whether a specified doubly linked list is empty. | 判断链表是否为空
UINT32 LOS_RwlockUnLock(LosRwlock *rwlock)
释放指定读写锁
struct OsRwlock LosRwlock
UINT32 LOS_RwlockTryRdLock(LosRwlock *rwlock)
尝试申请指定的读模式下的锁
UINT32 LOS_RwlockInit(LosRwlock *rwlock)
创建读写锁,初始化锁信息
UINT32 LOS_RwlockWrLock(LosRwlock *rwlock, UINT32 timeout)
申请指定的写模式下的锁
UINT32 LOS_RwlockRdLock(LosRwlock *rwlock, UINT32 timeout)
申请指定的读模式下的锁
UINT32 LOS_RwlockDestroy(LosRwlock *rwlock)
删除指定的读写锁
UINT32 LOS_RwlockTryWrLock(LosRwlock *rwlock)
尝试申请指定的写模式下的锁
VOID LOS_Schedule(VOID)
Trigger active task scheduling.
VOID LOS_MpSchedule(UINT32 target)
STATIC UINT32 OsRwlockGetMode(LOS_DL_LIST *readList, LOS_DL_LIST *writeList)
获取读写锁模式
STATIC BOOL OsRwlockPriCompare(LosTaskCB *runTask, LOS_DL_LIST *rwList)
指定任务优先级优先级是否低于 写锁任务最高优先级
UINT32 OsRwlockWrUnsafe(LosRwlock *rwlock, UINT32 timeout)
STATIC UINT32 OsRwlockWrPendOp(LosTaskCB *runTask, LosRwlock *rwlock, UINT32 timeout)
申请写模式下的锁
UINT32 OsRwlockTryWrUnsafe(LosRwlock *rwlock, UINT32 timeout)
STATIC UINT32 OsRwlockPostOp(LosRwlock *rwlock, BOOL *needSched)
释放锁
UINT32 OsRwlockRdUnsafe(LosRwlock *rwlock, UINT32 timeout)
STATIC UINT32 OsRwlockCheck(LosRwlock *rwlock)
读写锁检查
UINT32 OsRwlockUnlockUnsafe(LosRwlock *rwlock, BOOL *needSched)
释放锁,唤醒任务
UINT32 OsRwlockTryRdUnsafe(LosRwlock *rwlock, UINT32 timeout)
STATIC UINT32 OsRwlockRdPendOp(LosTaskCB *runTask, LosRwlock *rwlock, UINT32 timeout)
BOOL LOS_RwlockIsValid(const LosRwlock *rwlock)
判断读写锁有效性
@ RWLOCK_READ_MODE
读模式: 读链表有数据,写链表没有数据
@ RWLOCK_WRITE_MODE
写模式: 写链表有数据,读链表没有数据
@ RWLOCK_READFIRST_MODE
读优先模式: 读链表中的任务最高优先级高于写链表中任务最高优先级
@ RWLOCK_NONE_MODE
自由模式: 读写链表都没有内容
@ RWLOCK_WRITEFIRST_MODE
写优先模式: 写链表中的任务最高优先级高于读链表中任务最高优先级
STATIC INLINE LosTaskCB * OsCurrTaskGet(VOID)
LOS_DL_LIST * OsSchedLockPendFindPos(const LosTaskCB *runTask, LOS_DL_LIST *lockList)
STATIC INLINE BOOL OsPreemptableInSched(VOID)
INT32 OsSchedParamCompare(const LosTaskCB *task1, const LosTaskCB *task2)
UINT32(* wait)(LosTaskCB *runTask, LOS_DL_LIST *list, UINT32 timeout)
任务等待
VOID(* wake)(LosTaskCB *taskCB)
任务唤醒