提交 d9938192 编写于 作者: 鸿蒙内核源码分析's avatar 鸿蒙内核源码分析

开始对IPC Futex 部分代码注释,鸿蒙提供了多种IPC方式

鸿蒙内核源码分析系列 【 CSDN | OSCHINA | WIKI 】
鸿蒙内核源码注释中文版 【 CSDN仓 | Gitee仓 | Github仓 | Coding仓 】四大仓库每日同步更新代码和wiki
项目给鸿蒙内核源码逐行加上中文注解,详细阐述框架和代码细节, 精读 HarmonyOS 内核源码, 将迅速拔高对计算机整体理解,从此高屋建瓴看问题.
上级 176e815d
......@@ -32,7 +32,7 @@
#ifndef _LOS_FUTEX_PRI_H
#define _LOS_FUTEX_PRI_H
#include "los_list.h"
// Futex 是Fast Userspace muTexes的缩写 快速用户空间互斥体
#define FUTEX_WAIT 0
#define FUTEX_WAKE 1
#define FUTEX_REQUEUE 3
......@@ -45,13 +45,13 @@
#define FUTEX_PRIVATE 128
#define FUTEX_MASK 0x3U
typedef struct {
UINTPTR key;
UINT32 index;
UINT32 pid;
LOS_DL_LIST pendList;
LOS_DL_LIST queueList;
LOS_DL_LIST futexList;
typedef struct {//快锁节点
UINTPTR key;
UINT32 index;
UINT32 pid; //进程ID
LOS_DL_LIST pendList; //阻塞链表 阻塞任务将会挂上去
LOS_DL_LIST queueList; //队列链表
LOS_DL_LIST futexList; //快锁链表
} FutexNode;
extern UINT32 OsFutexInit(VOID);
......
......@@ -358,14 +358,14 @@ typedef struct {
//typedef struct __sigset_t { unsigned long __bits[128/sizeof(long)]; } sigset_t;
//见于 ..\vendor_hisi_hi3861_hi3861\hi3861\platform\os\Huawei_LiteOS\components\lib\libc\musl\include\bits\alltypes.h
struct ProcessSignalInfo {//进程信号信息
siginfo_t *sigInfo; /**< Signal to be dispatched */
LosTaskCB *defaultTcb; /**< Default TCB */ //默认task
siginfo_t *sigInfo; /**< Signal to be dispatched */ //发送信号
LosTaskCB *defaultTcb; /**< Default TCB */ //默认task,指的是信号的发送方
LosTaskCB *unblockedTcb; /**< The signal unblock on this TCB*/ //这个task发解除阻塞信号
LosTaskCB *awakenedTcb; /**< This TCB was awakened */ //被唤醒task
LosTaskCB *receivedTcb; /**< This TCB received the signal */ //收信号task
LosTaskCB *receivedTcb; /**< This TCB received the signal */ //信号接收方task
};
typedef int (*ForEachTaskCB)(LosTaskCB *tcb, void *arg);
typedef int (*ForEachTaskCB)(LosTaskCB *tcb, void *arg);//函数指针
/**
* @ingroup los_task
......
......@@ -43,9 +43,9 @@
extern "C" {
#endif
#endif /* __cplusplus */
#define OS_FUTEX_FROM_FUTEXLIST(ptr) LOS_DL_LIST_ENTRY(ptr, FutexNode, futexList)
#define OS_FUTEX_FROM_QUEUELIST(ptr) LOS_DL_LIST_ENTRY(ptr, FutexNode, queueList)
// Futex 是Fast Userspace muTexes的缩写 就是快速用户空间互斥体 ,本次注解简称它会 快锁
#define OS_FUTEX_FROM_FUTEXLIST(ptr) LOS_DL_LIST_ENTRY(ptr, FutexNode, futexList) //从 futexList 位置拿节点FutexNode
#define OS_FUTEX_FROM_QUEUELIST(ptr) LOS_DL_LIST_ENTRY(ptr, FutexNode, queueList) //从 queueList 位置拿节点FutexNode//
#define OS_FUTEX_KEY_BASE USER_ASPACE_BASE
#define OS_FUTEX_KEY_MAX (USER_ASPACE_BASE + USER_ASPACE_SIZE)
......
......@@ -170,23 +170,23 @@ int OsSigprocMask(int how, const sigset_t_l *setl, sigset_t_l *oldset)
}
return ret;
}
//给进程的每一个task发送信号
int OsSigProcessForeachChild(LosProcessCB *spcb, ForEachTaskCB handler, void *arg)
{
int ret;
/* Visit the main thread last (if present) */
LosTaskCB *taskCB = NULL;
/* Visit the main thread last (if present) */ //最后访问主线程(如果有)
LosTaskCB *taskCB = NULL;//遍历进程的 threadList 链表,里面存放的都是task节点
LOS_DL_LIST_FOR_EACH_ENTRY(taskCB, &(spcb->threadSiblingList), LosTaskCB, threadList) {
ret = handler(taskCB, arg);
OS_RETURN_IF(ret != 0, ret);
ret = handler(taskCB, arg);//这里是个回调函数,给每个任务发信号,异步发信号
OS_RETURN_IF(ret != 0, ret);//这个宏的意思就是只有ret = 0时,啥也不处理.其余就返回 ret
}
return LOS_OK;
}
//信号处理函数
//信号处理函数,这里就是上面的 handler = SigProcessSignalHandler,见于 OsSigProcessSend
static int SigProcessSignalHandler(LosTaskCB *tcb, void *arg)
{
struct ProcessSignalInfo *info = (struct ProcessSignalInfo *)arg;
struct ProcessSignalInfo *info = (struct ProcessSignalInfo *)arg;//先把参数解出来
int ret;
int isMember;
......@@ -195,18 +195,18 @@ static int SigProcessSignalHandler(LosTaskCB *tcb, void *arg)
}
/* If the default tcb is not setted, then set this one as default. */
if (!info->defaultTcb) {
if (!info->defaultTcb) {//如果没有默认发送方的TCB,就给一个.
info->defaultTcb = tcb;
}
isMember = OsSigIsMember(&tcb->sig.sigwaitmask, info->sigInfo->si_signo);
if (isMember && (!info->awakenedTcb)) {
if (isMember && (!info->awakenedTcb)) {//这意味着任务正在等待此信号。
/* This means the task is waiting for this signal. Stop looking for it and use this tcb.
* The requirement is: if more than one task in this task group is waiting for the signal,
* then only one indeterminate task in the group will receive the signal.
*/
ret = OsTcbDispatch(tcb, info->sigInfo);
OS_RETURN_IF(ret < 0, ret);
ret = OsTcbDispatch(tcb, info->sigInfo);//发送信号
OS_RETURN_IF(ret < 0, ret);//这种写法很有意思
/* set this tcb as awakenedTcb */
info->awakenedTcb = tcb;
......
git add -A
git commit -m '进程,task模块部分代码注释,基本完成两大模块的注释工作
git commit -m '开始对IPC Futex 部分代码注释,鸿蒙提供了多种IPC方式
鸿蒙内核源码分析系列 【 CSDN | OSCHINA | WIKI 】
鸿蒙内核源码注释中文版 【 CSDN仓 | Gitee仓 | Github仓 | Coding仓 】四大仓库每日同步更新代码和wiki
项目给鸿蒙内核源码逐行加上中文注解,详细阐述框架和代码细节, 精读 HarmonyOS 内核源码, 将迅速拔高对计算机整体理解,从此高屋建瓴看问题.'
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册