注解Futex(Fast userspace mutex,用户态快速互斥锁)模块实现

    百图画鸿蒙 + 百文说内核 + 百万注源码  => 挖透鸿蒙内核源码
    鸿蒙研究站 | http://weharmonyos.com (国内)
              | https://weharmony.github.io (国外)
    oschina | https://my.oschina.net/weharmony
    博客园 | https://www.cnblogs.com/weharmony/
    知乎 | https://www.zhihu.com/people/weharmonyos
    csdn | https://blog.csdn.net/kuangyufei
    51cto | https://harmonyos.51cto.com/column/34
    掘金 | https://juejin.cn/user/756888642000808
    公众号 | 鸿蒙研究站 (weharmonyos)
上级 9f0a4635
......@@ -67,8 +67,9 @@
使用通过FUTEX_BITSET_MATCH_ANY特殊定义的val3传入FUTEX_WAIT_BITSET可以获得附带timeout的FUTEX_WAIT的值。
@endverbatim
*/
#define FUTEX_WAIT 0 ///< 因等锁而被阻塞的线程
#define FUTEX_WAKE 1 ///< 唤醒一个被指定锁阻塞的线程
#define FUTEX_WAIT 0 ///< 原子性的检查 uaddr 中计数器的值是否为 val,如果是则让任务休眠,直到 FUTEX_WAKE 或者超时(time-out)。
//也就是把任务挂到 uaddr 相对应的等待队列上去。
#define FUTEX_WAKE 1 ///< 最多唤醒 val 个等待在 uaddr 上任务。
#define FUTEX_REQUEUE 3 ///< 调整指定锁在Futex表中的位置
#define FUTEX_WAKE_OP 5
#define FUTEX_LOCK_PI 6
......@@ -80,7 +81,7 @@
#define FUTEX_MASK 0x3U
typedef struct {
UINTPTR key; /* private:uvaddr | 私有锁 shared:paddr | 共享锁,物理地址 */
UINTPTR key; /* private:uvaddr | 私有锁,用虚拟地址 shared:paddr | 共享锁,用物理地址 */
UINT32 index; /* hash bucket index | 哈希桶索引 */
UINT32 pid; /* private:process id shared:OS_INVALID(-1) | 私有锁:进程ID , 共享锁为 -1 */
LOS_DL_LIST pendList; /* point to pendList in TCB struct | 挂到任务阻塞链表上*/
......
......@@ -104,17 +104,18 @@
#define FUTEX_INDEX_SHARED_MAX 16 ///< 64~79号桶用于存放共享锁(以物理地址进行哈希),不同进程间通过文件共享futex变量,表明该变量在文件中的位置
#define FUTEX_INDEX_MAX (FUTEX_INDEX_PRIVATE_MAX + FUTEX_INDEX_SHARED_MAX) ///< 80个哈希桶
#define FUTEX_INDEX_SHARED_POS FUTEX_INDEX_PRIVATE_MAX
#define FUTEX_INDEX_SHARED_POS FUTEX_INDEX_PRIVATE_MAX ///< 共享锁开始位置
#define FUTEX_HASH_PRIVATE_MASK (FUTEX_INDEX_PRIVATE_MAX - 1)
#define FUTEX_HASH_SHARED_MASK (FUTEX_INDEX_SHARED_MAX - 1)
/// 单独哈希桶
typedef struct {
LosMux listLock;///< 操作lockList的互斥锁
LosMux listLock;///< 内核操作lockList的互斥锁
LOS_DL_LIST lockList;///< 用于挂载Futex(Fast userspace mutex,用户态快速互斥锁)
} FutexHash;
FutexHash g_futexHash[FUTEX_INDEX_MAX];///< 80个哈希桶
/// 对互斥锁封装
STATIC INT32 OsFutexLock(LosMux *lock)
{
UINT32 ret = LOS_MuxLock(lock, LOS_WAIT_FOREVER);
......@@ -139,10 +140,10 @@ UINT32 OsFutexInit(VOID)
{
INT32 count;
UINT32 ret;
// 初始化 80个双向链表和互斥锁
// 初始化 80个哈希桶
for (count = 0; count < FUTEX_INDEX_MAX; count++) {
LOS_ListInit(&g_futexHash[count].lockList);
ret = LOS_MuxInit(&(g_futexHash[count].listLock), NULL);
LOS_ListInit(&g_futexHash[count].lockList); // 初始化双向链表,上面挂 FutexNode
ret = LOS_MuxInit(&(g_futexHash[count].listLock), NULL);//初始化互斥锁
if (ret) {
return ret;
}
......@@ -619,7 +620,7 @@ STATIC INT32 OsFutexInsertTaskToHash(LosTaskCB **taskCB, FutexNode **node, const
LOS_ListInit(&((*node)->pendList));
return LOS_OK;
}
//将当前任务挂入等待链表中
STATIC INT32 OsFutexWaitTask(const UINT32 *userVaddr, const UINT32 flags, const UINT32 val, const UINT32 timeOut)
{
INT32 futexRet;
......@@ -686,7 +687,7 @@ EXIT_ERR:
EXIT_UNLOCK_ERR:
return futexRet;
}
/// 向Futex表中插入代表被阻塞的线程的node
/// 设置线程等待 | 向Futex表中插入代表被阻塞的线程的node
INT32 OsFutexWait(const UINT32 *userVaddr, UINT32 flags, UINT32 val, UINT32 absTime)
{
INT32 ret;
......
......@@ -1011,7 +1011,7 @@ void SysThreadExit(int status)
* @param absTime 绝对时间
* @param flags 操作标识
* @param newUserAddr FUTEX_REQUEUE下调整后带回新的用户空间地址
* @param uAddr 用户空间地址
* @param uAddr 用户态下共享内存的地址,里面存放的是一个对齐的整型计数器
* @param val
* @return
*
......@@ -1028,7 +1028,7 @@ int SysFutex(const unsigned int *uAddr, unsigned int flags, int val,
return -OsFutexWake(uAddr, flags, val);
}
return -OsFutexWait(uAddr, flags, val, absTime);//等待标识
return -OsFutexWait(uAddr, flags, val, absTime);//设置线程等待
}
unsigned int SysGetTid(void)
......
git add -A
git commit -m ' 注解LiteIpc消息映射
git commit -m ' 注解Futex(Fast userspace mutex,用户态快速互斥锁)模块实现
百图画鸿蒙 + 百文说内核 + 百万注源码 => 挖透鸿蒙内核源码
鸿蒙研究站 | http://weharmonyos.com (国内)
| https://weharmony.github.io (国外)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册