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

Posix IPC 部分代码的注释

搜索 @note_pic 可以查看全部字符图
搜索 @note_why 是注者尚未看明白的地方,如果您看明白了,请告诉注者完善
搜索 @note_thinking 是注者的思考和吐槽的地方
上级 0c25865b
......@@ -66,7 +66,7 @@ char *GetCmdline(ShellCB *shellCB)
return cmdNode->cmdString;
}
//保存 cmd 历史记录
static void ShellSaveHistoryCmd(char *string, ShellCB *shellCB)
{
CmdKeyLink *cmdHistory = shellCB->cmdHistoryKeyLink;
......
......@@ -234,7 +234,7 @@ STATIC struct mqpersonal *DoMqueueOpen(struct mqarray *mqueueCB, INT32 openFlag)
ERROUT:
return (struct mqpersonal *)-1;
}
//创建或打开 posix 消息队列
//posix ipc 标准接口之 创建或打开消息队列,参数是可变参数
mqd_t mq_open(const char *mqName, int openFlag, ...)
{
struct mqarray *mqueueCB = NULL;
......@@ -242,29 +242,29 @@ mqd_t mq_open(const char *mqName, int openFlag, ...)
struct mq_attr *attr = NULL;
struct mq_attr defaultAttr = { 0, MQ_MAX_MSG_NUM, MQ_MAX_MSG_LEN, 0 };
int retVal;
va_list ap;
va_list ap;//一个字符指针,可以理解为指向当前参数的一个指针,取参必须通过这个指针进行
if (MqNameCheck(mqName) == -1) {
return (mqd_t)-1;
}
(VOID)pthread_mutex_lock(&g_mqueueMutex);
mqueueCB = GetMqueueCBByName(mqName);
if ((UINT32)openFlag & (UINT32)O_CREAT) {
mqueueCB = GetMqueueCBByName(mqName);//通过名称获取队列控制块
if ((UINT32)openFlag & (UINT32)O_CREAT) {//需要创建了队列的情况
if (mqueueCB != NULL) {
if (((UINT32)openFlag & (UINT32)O_EXCL)) {
if (((UINT32)openFlag & (UINT32)O_EXCL)) {//已经在执行
errno = EEXIST;
goto OUT;
}
privateMqPersonal = DoMqueueOpen(mqueueCB, openFlag);
} else {
va_start(ap, openFlag);
(VOID)va_arg(ap, int);
attr = va_arg(ap, struct mq_attr *);
va_end(ap);
privateMqPersonal = DoMqueueOpen(mqueueCB, openFlag);//打开队列
} else {//可变参数的实现 函数参数是以数据结构:栈的形式存取,从右至左入栈。
va_start(ap, openFlag);//对ap进行初始化,让它指向可变参数表里面的第一个参数,va_start第一个参数是 ap 本身,第二个参数是在变参表前面紧挨着的一个变量,即“...”之前的那个参数
(VOID)va_arg(ap, int);//获取int参数,调用va_arg,它的第一个参数是ap,第二个参数是要获取的参数的指定类型,然后返回这个指定类型的值,并且把 ap 的位置指向变参表的下一个变量位置
attr = va_arg(ap, struct mq_attr *);//获取mq_attr参数,调用va_arg,它的第一个参数是ap,第二个参数是要获取的参数的指定类型,然后返回这个指定类型的值,并且把 ap 的位置指向变参表的下一个变量位置
va_end(ap);//获取所有的参数之后,将这个 ap 指针关掉,以免发生危险,方法是调用 va_end,它将输入的参数 ap 置为 NULL
if (attr != NULL) {
retVal = LOS_ArchCopyFromUser(&defaultAttr, attr, sizeof(struct mq_attr));
retVal = LOS_ArchCopyFromUser(&defaultAttr, attr, sizeof(struct mq_attr));//从用户区拷贝到内核区
if (retVal != 0) {
errno = EFAULT;
goto OUT;
......@@ -275,14 +275,14 @@ mqd_t mq_open(const char *mqName, int openFlag, ...)
goto OUT;
}
}
privateMqPersonal = DoMqueueCreate(&defaultAttr, mqName, openFlag);
privateMqPersonal = DoMqueueCreate(&defaultAttr, mqName, openFlag);//创建队列
}
} else {
if (mqueueCB == NULL) {
} else {//已经创建了队列
if (mqueueCB == NULL) {//
errno = ENOENT;
goto OUT;
}
privateMqPersonal = DoMqueueOpen(mqueueCB, openFlag);
privateMqPersonal = DoMqueueOpen(mqueueCB, openFlag);//直接打开队列
}
OUT:
......@@ -452,7 +452,7 @@ ERROUT_UNLOCK:
(VOID)pthread_mutex_unlock(&g_mqueueMutex);
return -1;
}
//把时间转成 节拍
STATIC INT32 ConvertTimeout(long flags, const struct timespec *absTimeout, UINT64 *ticks)
{
if ((UINT32)flags & (UINT32)FNONBLOCK) {
......@@ -498,6 +498,7 @@ STATIC INLINE BOOL MqParamCheck(mqd_t personal, const char *msg, size_t msgLen)
errno = errcode; \
goto ERROUT; \
}
//posix ipc 标准接口之 定时发送消息 msgPrio为消息发送的优先级,目前尚未支持优先级的发送
int mq_timedsend(mqd_t personal, const char *msg, size_t msgLen, unsigned int msgPrio,
const struct timespec *absTimeout)
{
......@@ -506,36 +507,36 @@ int mq_timedsend(mqd_t personal, const char *msg, size_t msgLen, unsigned int ms
struct mqarray *mqueueCB = NULL;
struct mqpersonal *privateMqPersonal = NULL;
OS_MQ_GOTO_ERROUT_IF(!MqParamCheck(personal, msg, msgLen), errno);
OS_MQ_GOTO_ERROUT_IF(!MqParamCheck(personal, msg, msgLen), errno);//参数异常处理
OS_MQ_GOTO_ERROUT_IF(msgPrio > (MQ_PRIO_MAX - 1), EINVAL);
OS_MQ_GOTO_ERROUT_IF(msgPrio > (MQ_PRIO_MAX - 1), EINVAL);//优先级异常处理,鸿蒙目前只支持 msgPrio <= 0
(VOID)pthread_mutex_lock(&g_mqueueMutex);
(VOID)pthread_mutex_lock(&g_mqueueMutex);//临界区拿锁操作
privateMqPersonal = (struct mqpersonal *)personal;
OS_MQ_GOTO_ERROUT_UNLOCK_IF(privateMqPersonal->mq_status != MQ_USE_MAGIC, EBADF);
OS_MQ_GOTO_ERROUT_UNLOCK_IF(privateMqPersonal->mq_status != MQ_USE_MAGIC, EBADF);//魔法数字异常处理
mqueueCB = privateMqPersonal->mq_posixdes;
OS_MQ_GOTO_ERROUT_UNLOCK_IF(msgLen > (size_t)(mqueueCB->mqcb->queueSize - sizeof(UINT32)), EMSGSIZE);
OS_MQ_GOTO_ERROUT_UNLOCK_IF(msgLen > (size_t)(mqueueCB->mqcb->queueSize - sizeof(UINT32)), EMSGSIZE);//消息长度异常处理
OS_MQ_GOTO_ERROUT_UNLOCK_IF((((UINT32)privateMqPersonal->mq_flags & (UINT32)O_WRONLY) != (UINT32)O_WRONLY) &&
(((UINT32)privateMqPersonal->mq_flags & (UINT32)O_RDWR) != (UINT32)O_RDWR),
EBADF);
EBADF);//消息标识异常,必须有只读而且是可读可写标签
OS_MQ_GOTO_ERROUT_UNLOCK_IF(ConvertTimeout(privateMqPersonal->mq_flags, absTimeout, &absTicks) == -1, errno);
mqueueID = mqueueCB->mq_id;
OS_MQ_GOTO_ERROUT_UNLOCK_IF(ConvertTimeout(privateMqPersonal->mq_flags, absTimeout, &absTicks) == -1, errno);//时间转换成tick 处理
mqueueID = mqueueCB->mq_id;//记录消息队列ID
(VOID)pthread_mutex_unlock(&g_mqueueMutex);
err = LOS_QueueWriteCopy(mqueueID, (VOID *)msg, (UINT32)msgLen, (UINT32)absTicks);
err = LOS_QueueWriteCopy(mqueueID, (VOID *)msg, (UINT32)msgLen, (UINT32)absTicks);//拷贝消息内容到内核空间
if (map_errno(err) != ENOERR) {
goto ERROUT;
}
return 0;
ERROUT_UNLOCK:
(VOID)pthread_mutex_unlock(&g_mqueueMutex);
(VOID)pthread_mutex_unlock(&g_mqueueMutex);//释放锁
ERROUT:
return -1;
}
//定时接收消息
ssize_t mq_timedreceive(mqd_t personal, char *msg, size_t msgLen, unsigned int *msgPrio,
const struct timespec *absTimeout)
{
......
......@@ -1608,7 +1608,7 @@ int osShellCmdChmod(int argc, const char **argv)
p = argv[0];
while (p[i])
{
if ((p[i] <= '7') && (p[i] >= '0'))
if ((p[i] <= '7') && (p[i] >= '0'))// 只能在 000 - 777 之间
{
mode = (mode << MODE_BIT) | (p[i] - '0');
}
......@@ -1621,7 +1621,7 @@ int osShellCmdChmod(int argc, const char **argv)
}
filename = argv[1];
shell_working_directory = OsShellGetWorkingDirtectory();
shell_working_directory = OsShellGetWorkingDirtectory();//获取当前工作目录
if (shell_working_directory == NULL)
{
return -1;
......
......@@ -72,8 +72,8 @@ typedef struct {
} CmdModInfo;
typedef struct {
UINT32 count;
LOS_DL_LIST list;
UINT32 count;//数量
LOS_DL_LIST list;//链表
CHAR cmdString[0];
} CmdKeyLink;
......
......@@ -64,10 +64,10 @@ extern "C" {
#define CMD_KEY_LEN 16U
#define CMD_MAX_LEN (256U + CMD_KEY_LEN) //256+16 = 272
#define CMD_KEY_NUM 32
#define CMD_HISTORY_LEN 10
#define CMD_MAX_PATH 256
#define DEFAULT_SCREEN_WIDTH 80
#define DEFAULT_SCREEN_HEIGNT 24
#define CMD_HISTORY_LEN 10 //记录历史记录的长度
#define CMD_MAX_PATH 256 //cmd 命令的最大路径
#define DEFAULT_SCREEN_WIDTH 80 //默认的屏幕宽度
#define DEFAULT_SCREEN_HEIGNT 24 //默认的屏幕高度
#define SHELL_MODE 0
#define OTHER_MODE 1
......@@ -96,7 +96,7 @@ typedef struct {
pthread_mutex_t keyMutex; //键盘输入互斥锁
pthread_mutex_t historyMutex;//历史记录互斥锁
CHAR shellBuf[SHOW_MAX_LEN];//shell命令的最大长度 不能大于 272个字符
CHAR shellWorkingDirectory[PATH_MAX];
CHAR shellWorkingDirectory[PATH_MAX];//shell的工作目录 类似:pwd
} ShellCB;
/* All support cmd types *///所有支持的 CMD 类型
......
......@@ -171,7 +171,7 @@ CHAR *OsShellGetWorkingDirtectory(VOID)
if (shellCB == NULL) {
return NULL;
}
return shellCB->shellWorkingDirectory;
return shellCB->shellWorkingDirectory;//shell 控制块的工作目录
}
#ifdef __cplusplus
......
#include <stdio.h>
#include <stdarg.h>
typedef unsigned int UINTPTR;
typedef unsigned char UINT8;
typedef unsigned long PTE_T;
......@@ -51,10 +53,31 @@ void round1(){
//printf("ROUNDUP %d\n",ROUNDUP(9, 2));
//printf("ROUNDDOWN %d\n",ROUNDDOWN(9, 2));
}
void arg_test(int i, ...)
{
int j=0,k=0;
va_list arg_ptr;
va_start(arg_ptr, i);
printf("&i = %p\n", &i);//打印参数i在堆栈中的地址
printf("arg_ptr = %p\n", arg_ptr);//打印va_start之后arg_ptr地址
printf("%d %d %d\n", i, j, k);
j=va_arg(arg_ptr, int);
printf("arg_ptr = %p\n", arg_ptr);//打印va_arg后arg_ptr的地址
printf("%d %d %d\n", i, j, k);
printf("arg_ptr = %p\n", arg_ptr);//打印va_arg后arg_ptr的地址
k=va_arg(arg_ptr, int);
printf("%d %d %d\n", i, j, k);
printf("arg_ptr = %p\n", arg_ptr);//打印va_arg后arg_ptr的地址
/*这时arg_ptr应该比参数i的地址高sizeof(int)个字节,即指向下一个参数的地址,如果已经是最后一个参数,arg_ptr会为NULL*/
va_end(arg_ptr);
printf("arg_ptr = %p\n", arg_ptr);//打印va_arg后arg_ptr的地址
printf("%d %d\n", i, j);
}
int main()
{
int size = 0;
printf("sizeof(int) %d\n",sizeof(int));
arg_test(99, 4,8,9);
size = sizeof(LOS_DL_LIST) << OS_TSK_SORTLINK_LOGLEN;
printf("LOS_DL_LIST %d\n",sizeof(LOS_DL_LIST *));
printf("size %d\n",size);
......
无法预览此类型文件
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册