| 函数逻辑报告 | 
| Source Code: kernel\locking\rwsem.c | Create Date:2022-07-27 10:48:37 | 
| Last Modify:2020-03-12 14:18:49 | Copyright©Brick | 
| 首页 | 函数Tree | 
| 注解内核,赢得工具 | 下载SCCT | English | 
函数名称:Wait for the read lock to be granted
函数原型:static struct rw_semaphore __sched *rwsem_down_read_slowpath(struct rw_semaphore *sem, int state)
返回类型:struct rw_semaphore
参数:
| 类型 | 参数 | 名称 | 
|---|---|---|
| struct rw_semaphore * | sem | |
| int | state | 
| 997 | adjustment等于负RWSEM_READER_BIAS | 
| 1000 | bool wake = false | 
| 1010 | 如果非rwsem_can_spin_on_owner(sem, RWSEM_RD_NONSPINNABLE)则转到:queue | 
| 1016 | atomic_long_add( - RWSEM_READER_BIAS, & count) | 
| 1017 | adjustment等于0 | 
| 1018 | 如果rwsem_optimistic_spin(sem, false)则 | 
| 1024 | 如果atomic_long_read( & count)按位与RWSEM_FLAG_WAITERS则 | 
| 1026 | 如果非链表为空则handle the lock release when processes blocked on it that can now run* - if we come here from up_xxxx(), then the RWSEM_FLAG_WAITERS bit must* have been set | 
| 1029 | raw_spin_unlock_irq( & wait_lock) | 
| 1032 | 返回:sem | 
| 1033 | 否则如果rwsem_reader_phase_trylock(sem, last_rowner)则 | 
| 1035 | 返回:sem | 
| 1038 | queue : | 
| 1040 | type等于RWSEM_WAITING_FOR_READ | 
| 1044 | 如果链表为空则 | 
| 1051 | 如果adjustment且非atomic_long_read( & count)按位与RWSEM_WRITER_MASK按位或RWSEM_FLAG_HANDOFF的值的值则 | 
| 1060 | adjustment加等于RWSEM_FLAG_WAITERS | 
| 1062 | 添加链表项 | 
| 1065 | 如果adjustment则count等于atomic_long_add_return(adjustment, & count) | 
| 1067 | 否则count等于atomic_long_read( & count) | 
| 1076 | 如果非count按位与RWSEM_LOCK_MASK的值则 | 
| 1077 | clear_wr_nonspinnable(sem) | 
| 1078 | wake = true | 
| 1084 | raw_spin_unlock_irq( & wait_lock) | 
| 1088 | 循环 | 
| 1089 | set_current_state(state) | 
| 1090 | 如果非smp_load_acquire( & task)则 | 
| 1092 | 退出 | 
| 1094 | 如果signal_pending_state(state, 当前进程)则 | 
| 1102 | 进程调度 | 
| 1108 | 返回:sem | 
| 1110 | out_nolock : | 
| 1111 | 删除链表项 | 
| 1112 | 如果链表为空则 | 
| 1116 | raw_spin_unlock_irq( & wait_lock) | 
| 1119 | 返回:错误号 | 
| 名称 | 描述 | 
|---|---|
| __down_read | lock for reading | 
| __down_read_killable | 
| 源代码转换工具 开放的插件接口 | X | 
|---|---|
| 支持:c/c++/esqlc/java Oracle/Informix/Mysql 插件可实现:逻辑报告 代码生成和批量转换代码 |