更新日期: 2022/06/01 来源: https://gitee.com/weharmony/kernel_liteos_a_note
los_mux_pri.h 文件参考

浏览源代码.

函数

VOID OsMuxBitmapRestore (const LosMux *mutex, const LOS_DL_LIST *list, const LosTaskCB *runTask)
 恢复互斥锁位图 更多...
 
UINT32 OsMuxLockUnsafe (LosMux *mutex, UINT32 timeout)
 
UINT32 OsMuxTrylockUnsafe (LosMux *mutex, UINT32 timeout)
 尝试加锁, 更多...
 
UINT32 OsMuxUnlockUnsafe (LosTaskCB *taskCB, LosMux *mutex, BOOL *needSched)
 

函数说明

◆ OsMuxBitmapRestore()

VOID OsMuxBitmapRestore ( const LosMux mutex,
const LOS_DL_LIST list,
const LosTaskCB runTask 
)

恢复互斥锁位图

在文件 los_mux.c328 行定义.

329{
330 if (mutex->attr.protocol != LOS_MUX_PRIO_INHERIT) {
331 return;
332 }
333
334 SchedParam param = { 0 };
335 LosTaskCB *owner = (LosTaskCB *)mutex->owner;
336 runTask->ops->schedParamGet(runTask, &param);
337 owner->ops->priorityRestore(owner, list, &param);
338}
@ LOS_MUX_PRIO_INHERIT
Definition: los_mux.h:50
UINT8 protocol
协议
Definition: los_mux.h:63
VOID * owner
Definition: los_mux.h:78
LosMuxAttr attr
Definition: los_mux.h:75
VOID(* priorityRestore)(LosTaskCB *owner, const LOS_DL_LIST *list, const SchedParam *param)
恢复调度参数
UINT32(* schedParamGet)(const LosTaskCB *taskCB, SchedParam *param)
获取调度参数
const SchedOps * ops
这是这个函数的调用关系图:

◆ OsMuxLockUnsafe()

UINT32 OsMuxLockUnsafe ( LosMux mutex,
UINT32  timeout 
)

在文件 los_mux.c398 行定义.

399{
400 LosTaskCB *runTask = OsCurrTaskGet();//获取当前任务
401
402 if (mutex->magic != OS_MUX_MAGIC) {
403 return LOS_EBADF;
404 }
405
406 if (OsCheckMutexAttr(&mutex->attr) != LOS_OK) {
407 return LOS_EINVAL;
408 }
409 //LOS_MUX_ERRORCHECK 时 muxCount是要等于0 ,当前任务持有锁就不能再lock了. 鸿蒙默认用的是递归锁LOS_MUX_RECURSIVE
410 if ((mutex->attr.type == LOS_MUX_ERRORCHECK) && (mutex->owner == (VOID *)runTask)) {
411 return LOS_EDEADLK;
412 }
413
414 return OsMuxPendOp(runTask, mutex, timeout);
415}
STATIC UINT32 OsMuxPendOp(LosTaskCB *runTask, LosMux *mutex, UINT32 timeout)
最坏情况就是拿锁失败,让出CPU,变成阻塞任务,等别的任务释放锁后排到自己了接着执行.
Definition: los_mux.c:341
STATIC UINT32 OsCheckMutexAttr(const LosMuxAttr *attr)
检查互斥锁属性是否OK,否则 no ok :|)
Definition: los_mux.c:248
@ LOS_MUX_ERRORCHECK
进行错误检查,如果一个线程企图对一个已经锁住的mutex进行relock或对未加锁的unlock,将返回一个错误。
Definition: los_mux.h:58
STATIC INLINE LosTaskCB * OsCurrTaskGet(VOID)
UINT8 type
类型属性
Definition: los_mux.h:65
UINT32 magic
Definition: los_mux.h:74
函数调用图:
这是这个函数的调用关系图:

◆ OsMuxTrylockUnsafe()

UINT32 OsMuxTrylockUnsafe ( LosMux mutex,
UINT32  timeout 
)

尝试加锁,

在文件 los_mux.c417 行定义.

418{
419 LosTaskCB *runTask = OsCurrTaskGet();//获取当前任务
420
421 if (mutex->magic != OS_MUX_MAGIC) {//检查MAGIC有没有被改变
422 return LOS_EBADF;
423 }
424
425 if (OsCheckMutexAttr(&mutex->attr) != LOS_OK) {//检查互斥锁属性
426 return LOS_EINVAL;
427 }
428
429 if ((mutex->owner != NULL) &&
430 (((LosTaskCB *)mutex->owner != runTask) || (mutex->attr.type != LOS_MUX_RECURSIVE))) {
431 return LOS_EBUSY;
432 }
433
434 return OsMuxPendOp(runTask, mutex, timeout);//当前任务去拿锁,拿不到就等timeout
435}
@ LOS_MUX_RECURSIVE
递归锁 允许同一线程在互斥量解锁前对该互斥量进行多次加锁。递归互斥量维护锁的计数,在解锁次数和加锁次数不相同的情况下,不会释放锁,别的线程就无法加锁此互斥量。
Definition: los_mux.h:57
函数调用图:
这是这个函数的调用关系图:

◆ OsMuxUnlockUnsafe()

UINT32 OsMuxUnlockUnsafe ( LosTaskCB taskCB,
LosMux mutex,
BOOL needSched 
)

在文件 los_mux.c527 行定义.

528{
529 if (mutex->magic != OS_MUX_MAGIC) {
530 return LOS_EBADF;
531 }
532
533 if (OsCheckMutexAttr(&mutex->attr) != LOS_OK) {
534 return LOS_EINVAL;
535 }
536
537 if ((LosTaskCB *)mutex->owner != taskCB) {
538 return LOS_EPERM;
539 }
540
541 if (mutex->muxCount == 0) {
542 return LOS_EPERM;
543 }
544 //注意 --mutex->muxCount 先执行了-- 操作.
545 if ((--mutex->muxCount != 0) && (mutex->attr.type == LOS_MUX_RECURSIVE)) {//属性类型为LOS_MUX_RECURSIVE时,muxCount是可以不为0的
546 return LOS_OK;
547 }
548
549 if (mutex->attr.protocol == LOS_MUX_PRIO_PROTECT) {//属性协议为保护时
550 SchedParam param = { 0 };
551 taskCB->ops->schedParamGet(taskCB, &param);
552 taskCB->ops->priorityRestore(taskCB, NULL, &param);
553 }
554
555 /* Whether a task block the mutex lock. *///任务是否阻塞互斥锁
556 return OsMuxPostOp(taskCB, mutex, needSched);//一个任务去唤醒另一个在等锁的任务
557}
STATIC UINT32 OsMuxPostOp(LosTaskCB *taskCB, LosMux *mutex, BOOL *needSched)
OsMuxPostOp 是否有其他任务持有互斥锁而处于阻塞状,如果是就要唤醒它,注意唤醒一个任务的操作是由别的任务完成的 OsMuxPostOp只由OsMuxUnlockUnsafe,...
Definition: los_mux.c:502
@ LOS_MUX_PRIO_PROTECT
详见: OsMuxPendOp 中的注解,详细说明了LOS_MUX_PRIO_PROTECT的含义
Definition: los_mux.h:52
UINT16 muxCount
Definition: los_mux.h:79
函数调用图:
这是这个函数的调用关系图: