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

浏览源代码.

枚举

enum  RwlockMode {
  RWLOCK_NONE_MODE , RWLOCK_READ_MODE , RWLOCK_WRITE_MODE , RWLOCK_READFIRST_MODE ,
  RWLOCK_WRITEFIRST_MODE
}
 

函数

UINT32 OsRwlockRdUnsafe (LosRwlock *rwlock, UINT32 timeout)
 
UINT32 OsRwlockTryRdUnsafe (LosRwlock *rwlock, UINT32 timeout)
 
UINT32 OsRwlockWrUnsafe (LosRwlock *rwlock, UINT32 timeout)
 
UINT32 OsRwlockTryWrUnsafe (LosRwlock *rwlock, UINT32 timeout)
 
UINT32 OsRwlockUnlockUnsafe (LosRwlock *rwlock, BOOL *needSched)
 释放锁,唤醒任务 更多...
 

枚举类型说明

◆ RwlockMode

enum RwlockMode
枚举值
RWLOCK_NONE_MODE 

自由模式: 读写链表都没有内容

RWLOCK_READ_MODE 

读模式: 读链表有数据,写链表没有数据

RWLOCK_WRITE_MODE 

写模式: 写链表有数据,读链表没有数据

RWLOCK_READFIRST_MODE 

读优先模式: 读链表中的任务最高优先级高于写链表中任务最高优先级

RWLOCK_WRITEFIRST_MODE 

写优先模式: 写链表中的任务最高优先级高于读链表中任务最高优先级

在文件 los_rwlock_pri.h46 行定义.

46 {
47 RWLOCK_NONE_MODE, ///< 自由模式: 读写链表都没有内容
48 RWLOCK_READ_MODE, ///< 读模式: 读链表有数据,写链表没有数据
49 RWLOCK_WRITE_MODE, ///< 写模式: 写链表有数据,读链表没有数据
50 RWLOCK_READFIRST_MODE, ///< 读优先模式: 读链表中的任务最高优先级高于写链表中任务最高优先级
51 RWLOCK_WRITEFIRST_MODE ///< 写优先模式: 写链表中的任务最高优先级高于读链表中任务最高优先级
52};
@ RWLOCK_READ_MODE
读模式: 读链表有数据,写链表没有数据
@ RWLOCK_WRITE_MODE
写模式: 写链表有数据,读链表没有数据
@ RWLOCK_READFIRST_MODE
读优先模式: 读链表中的任务最高优先级高于写链表中任务最高优先级
@ RWLOCK_NONE_MODE
自由模式: 读写链表都没有内容
@ RWLOCK_WRITEFIRST_MODE
写优先模式: 写链表中的任务最高优先级高于读链表中任务最高优先级

函数说明

◆ OsRwlockRdUnsafe()

UINT32 OsRwlockRdUnsafe ( LosRwlock rwlock,
UINT32  timeout 
)

在文件 los_rwlock.c252 行定义.

253{
254 if ((rwlock->magic & RWLOCK_COUNT_MASK) != OS_RWLOCK_MAGIC) {
255 return LOS_EBADF;
256 }
257
258 return OsRwlockRdPendOp(OsCurrTaskGet(), rwlock, timeout);
259}
STATIC UINT32 OsRwlockRdPendOp(LosTaskCB *runTask, LosRwlock *rwlock, UINT32 timeout)
Definition: los_rwlock.c:161
STATIC INLINE LosTaskCB * OsCurrTaskGet(VOID)
INT32 magic
Definition: los_rwlock.h:53
函数调用图:
这是这个函数的调用关系图:

◆ OsRwlockTryRdUnsafe()

UINT32 OsRwlockTryRdUnsafe ( LosRwlock rwlock,
UINT32  timeout 
)

在文件 los_rwlock.c261 行定义.

262{
263 if ((rwlock->magic & RWLOCK_COUNT_MASK) != OS_RWLOCK_MAGIC) {
264 return LOS_EBADF;
265 }
266
267 LosTaskCB *runTask = OsCurrTaskGet();
268 if ((LosTaskCB *)(rwlock->writeOwner) == runTask) {
269 return LOS_EINVAL;
270 }
271
272 /*
273 * When the rwlock mode is read mode or free mode and the priority of the current read task
274 * is lower than the first pended write task, current read task can not obtain the rwlock.
275 */
276 if ((rwlock->rwCount >= 0) && !OsRwlockPriCompare(runTask, &(rwlock->writeList))) {
277 return LOS_EBUSY;
278 }
279
280 /*
281 * When the rwlock mode is write mode, current read task can not obtain the rwlock.
282 */
283 if (rwlock->rwCount < 0) {
284 return LOS_EBUSY;
285 }
286
287 return OsRwlockRdPendOp(runTask, rwlock, timeout);
288}
STATIC BOOL OsRwlockPriCompare(LosTaskCB *runTask, LOS_DL_LIST *rwList)
指定任务优先级优先级是否低于 写锁任务最高优先级
Definition: los_rwlock.c:145
VOID * writeOwner
Definition: los_rwlock.h:58
INT32 rwCount
Definition: los_rwlock.h:54
LOS_DL_LIST writeList
Definition: los_rwlock.h:60
函数调用图:
这是这个函数的调用关系图:

◆ OsRwlockTryWrUnsafe()

UINT32 OsRwlockTryWrUnsafe ( LosRwlock rwlock,
UINT32  timeout 
)

在文件 los_rwlock.c299 行定义.

300{
301 if ((rwlock->magic & RWLOCK_COUNT_MASK) != OS_RWLOCK_MAGIC) {
302 return LOS_EBADF;
303 }
304
305 /* When the rwlock is read mode, current write task will be pended.
306 | 当 rwlock 为读模式时,当前的写任务将被挂起。*/
307 if (rwlock->rwCount > 0) {
308 return LOS_EBUSY;
309 }
310
311 /* When other write task obtains this rwlock, current write task will be pended.
312 | 当其他写任务获得这个rwlock时,当前的写任务将被挂起。*/
313 LosTaskCB *runTask = OsCurrTaskGet();
314 if ((rwlock->rwCount < 0) && ((LosTaskCB *)(rwlock->writeOwner) != runTask)) {
315 return LOS_EBUSY;
316 }
317
318 return OsRwlockWrPendOp(runTask, rwlock, timeout);//
319}
STATIC UINT32 OsRwlockWrPendOp(LosTaskCB *runTask, LosRwlock *rwlock, UINT32 timeout)
申请写模式下的锁
Definition: los_rwlock.c:209
函数调用图:
这是这个函数的调用关系图:

◆ OsRwlockUnlockUnsafe()

UINT32 OsRwlockUnlockUnsafe ( LosRwlock rwlock,
BOOL needSched 
)

释放锁,唤醒任务

在文件 los_rwlock.c449 行定义.

450{
451 if ((rwlock->magic & RWLOCK_COUNT_MASK) != OS_RWLOCK_MAGIC) {
452 return LOS_EBADF;
453 }
454
455 if (rwlock->rwCount == 0) {
456 return LOS_EPERM;
457 }
458
459 LosTaskCB *runTask = OsCurrTaskGet();
460 if ((rwlock->rwCount < 0) && ((LosTaskCB *)(rwlock->writeOwner) != runTask)) {//写模式时,当前任务未持有锁
461 return LOS_EPERM;
462 }
463
464 /*
465 * When the rwCount of the rwlock more than 1 or less than -1, the rwlock mode will
466 * not changed after current unlock operation, so pended tasks can not be waken.
467 | 当 rwlock 的 rwCount 大于 1 或小于 -1 时,当前解锁操作后 rwlock 模式不会改变,因此挂起的任务不能被唤醒。
468 */
469 if (rwlock->rwCount > 1) {//读模式
470 rwlock->rwCount--;
471 return LOS_OK;
472 }
473
474 if (rwlock->rwCount < -1) {//写模式
475 rwlock->rwCount++;
476 return LOS_OK;
477 }
478
479 return OsRwlockPostOp(rwlock, needSched);
480}
STATIC UINT32 OsRwlockPostOp(LosRwlock *rwlock, BOOL *needSched)
释放锁
Definition: los_rwlock.c:402
函数调用图:
这是这个函数的调用关系图:

◆ OsRwlockWrUnsafe()

UINT32 OsRwlockWrUnsafe ( LosRwlock rwlock,
UINT32  timeout 
)

在文件 los_rwlock.c290 行定义.

291{
292 if ((rwlock->magic & RWLOCK_COUNT_MASK) != OS_RWLOCK_MAGIC) {
293 return LOS_EBADF;
294 }
295
296 return OsRwlockWrPendOp(OsCurrTaskGet(), rwlock, timeout);
297}
函数调用图:
这是这个函数的调用关系图: