From d993819228baecda42ba19aa228acf6c24b48549 Mon Sep 17 00:00:00 2001 From: kuangyufei Date: Tue, 3 Nov 2020 18:43:30 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BC=80=E5=A7=8B=E5=AF=B9IPC=20Futex=20?= =?UTF-8?q?=E9=83=A8=E5=88=86=E4=BB=A3=E7=A0=81=E6=B3=A8=E9=87=8A,?= =?UTF-8?q?=E9=B8=BF=E8=92=99=E6=8F=90=E4=BE=9B=E4=BA=86=E5=A4=9A=E7=A7=8D?= =?UTF-8?q?IPC=E6=96=B9=E5=BC=8F=20=E9=B8=BF=E8=92=99=E5=86=85=E6=A0=B8?= =?UTF-8?q?=E6=BA=90=E7=A0=81=E5=88=86=E6=9E=90=E7=B3=BB=E5=88=97=20?= =?UTF-8?q?=E3=80=90=20CSDN=20|=20OSCHINA=20|=20WIKI=20=E3=80=91=20?= =?UTF-8?q?=E9=B8=BF=E8=92=99=E5=86=85=E6=A0=B8=E6=BA=90=E7=A0=81=E6=B3=A8?= =?UTF-8?q?=E9=87=8A=E4=B8=AD=E6=96=87=E7=89=88=20=E3=80=90=20CSDN?= =?UTF-8?q?=E4=BB=93=20|=20Gitee=E4=BB=93=20|=20Github=E4=BB=93=20|=20Codi?= =?UTF-8?q?ng=E4=BB=93=20=E3=80=91=E5=9B=9B=E5=A4=A7=E4=BB=93=E5=BA=93?= =?UTF-8?q?=E6=AF=8F=E6=97=A5=E5=90=8C=E6=AD=A5=E6=9B=B4=E6=96=B0=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E5=92=8Cwiki=20=E9=A1=B9=E7=9B=AE=E7=BB=99=E9=B8=BF?= =?UTF-8?q?=E8=92=99=E5=86=85=E6=A0=B8=E6=BA=90=E7=A0=81=E9=80=90=E8=A1=8C?= =?UTF-8?q?=E5=8A=A0=E4=B8=8A=E4=B8=AD=E6=96=87=E6=B3=A8=E8=A7=A3,?= =?UTF-8?q?=E8=AF=A6=E7=BB=86=E9=98=90=E8=BF=B0=E6=A1=86=E6=9E=B6=E5=92=8C?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E7=BB=86=E8=8A=82,=20=E7=B2=BE=E8=AF=BB=20Ha?= =?UTF-8?q?rmonyOS=20=E5=86=85=E6=A0=B8=E6=BA=90=E7=A0=81,=20=E5=B0=86?= =?UTF-8?q?=E8=BF=85=E9=80=9F=E6=8B=94=E9=AB=98=E5=AF=B9=E8=AE=A1=E7=AE=97?= =?UTF-8?q?=E6=9C=BA=E6=95=B4=E4=BD=93=E7=90=86=E8=A7=A3,=E4=BB=8E?= =?UTF-8?q?=E6=AD=A4=E9=AB=98=E5=B1=8B=E5=BB=BA=E7=93=B4=E7=9C=8B=E9=97=AE?= =?UTF-8?q?=E9=A2=98.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/base/include/los_futex_pri.h | 16 ++++++++-------- kernel/base/include/los_task_pri.h | 8 ++++---- kernel/base/ipc/los_futex.c | 6 +++--- kernel/base/ipc/los_signal.c | 22 +++++++++++----------- zzz/git/push.sh | 2 +- 5 files changed, 27 insertions(+), 27 deletions(-) diff --git a/kernel/base/include/los_futex_pri.h b/kernel/base/include/los_futex_pri.h index f2d81831..37cae329 100644 --- a/kernel/base/include/los_futex_pri.h +++ b/kernel/base/include/los_futex_pri.h @@ -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); diff --git a/kernel/base/include/los_task_pri.h b/kernel/base/include/los_task_pri.h index bf3d1e3c..019aa96c 100644 --- a/kernel/base/include/los_task_pri.h +++ b/kernel/base/include/los_task_pri.h @@ -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 diff --git a/kernel/base/ipc/los_futex.c b/kernel/base/ipc/los_futex.c index bcce8809..6d024d5b 100644 --- a/kernel/base/ipc/los_futex.c +++ b/kernel/base/ipc/los_futex.c @@ -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) diff --git a/kernel/base/ipc/los_signal.c b/kernel/base/ipc/los_signal.c index cbe7d9bf..9c11126d 100644 --- a/kernel/base/ipc/los_signal.c +++ b/kernel/base/ipc/los_signal.c @@ -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; diff --git a/zzz/git/push.sh b/zzz/git/push.sh index 07ecfb76..c8328f67 100644 --- a/zzz/git/push.sh +++ b/zzz/git/push.sh @@ -1,5 +1,5 @@ git add -A -git commit -m '进程,task模块部分代码注释,基本完成两大模块的注释工作 +git commit -m '开始对IPC Futex 部分代码注释,鸿蒙提供了多种IPC方式 鸿蒙内核源码分析系列 【 CSDN | OSCHINA | WIKI 】 鸿蒙内核源码注释中文版 【 CSDN仓 | Gitee仓 | Github仓 | Coding仓 】四大仓库每日同步更新代码和wiki 项目给鸿蒙内核源码逐行加上中文注解,详细阐述框架和代码细节, 精读 HarmonyOS 内核源码, 将迅速拔高对计算机整体理解,从此高屋建瓴看问题.' -- GitLab