您当前的位置: 首页 > 

小生叫安辰

暂无认证

  • 5浏览

    0关注

    105博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

鸿蒙源码分析(六)

小生叫安辰 发布时间:2021-07-31 17:45:34 ,浏览量:5

os_adapter.c代码分析

本篇主要分析模块一中trans_service目录下tcp_socket.c代码。 文件路径(模块一\communication_softbus_lite- master\trans_service\source\utils\message.c)

一、背景知识

os_adapter相关前缀理论部分已经在队友博客中解释(点击此处查看理论部分)

二、代码分析

软总线模块中os_adapter目录为操作系统接口适配层,其中L0和L1两个目录下各有一个os_adapter.c文件,二者功能函数基本一致,不同点在于适用环境不同,下面主要分析L1下面os_adapter.c文件。 1.初始化互斥锁 mutexinit函数用来初始化互斥锁,基于pthread_mutex_init()函数。

MutexId MutexInit(void)//初始化互斥锁
{
    pthread_mutex_t *mutex = (pthread_mutex_t *)malloc(sizeof(pthread_mutex_t));
    //使用malloc函数动态申请内存空间
    if (mutex == NULL) {
        return NULL;
        //申请失败函数返回NULL
    }
    (void)pthread_mutex_init(mutex, NULL);
    //该函数用于C函数的多线程编程中,互斥锁的初始化。
    return (MutexId)mutex;
}

2.互斥体加锁 MutexLock函数用来为互斥体进行加锁,将参数指定的对象进行加锁,避免被其他进程调用读取。 基于pthread_mutex_lock(),该函数锁住由mutex指定的mutex 对象。如果mutex已经被锁住,调用这个函数的线程阻塞直到mutex可用为止。这跟函数返回的时候参数mutex指定的mutex对象变成锁住状态, 同时该函数的调用线程成为该mutex对象的拥有者。

void MutexLock(MutexId mutex)
{
    if (mutex == NULL) {
        return;
    }
    pthread_mutex_lock((pthread_mutex_t *)mutex);
    //锁住由mutex指定的mutex 对象。
}

3.互斥体释放 MutexUnLock函数用来释放互斥体指向对象上面的锁,基于pthread_mutex_unlock() 函数。 pthread_mutex_unlock()可释放mutex引用的互斥锁对象。互斥锁的释放方式取决于互斥锁的类型属性。 如果调用pthread_mutex_unlock()时有多个线程被mutex对象阻塞,则互斥锁变为可用时调度策略可确定获取该互斥锁的线程。 对于PTHREAD_MUTEX_RECURSIVE类型的互斥锁,当计数达到零并且调用线程不再对该互斥锁进行任何锁定时,该互斥锁将变为可用。

void MutexUnlock(MutexId mutex)//释放互斥体
{
    if (mutex == NULL) {
        return;
    }
    pthread_mutex_unlock((pthread_mutex_t *)mutex);
    //释放有参数mutex指定的mutex对象的锁。
}

4.关闭套接字函数

void CloseSocket(int *fd)
{
    if (fd == NULL) {
        return;
    }
    if (*fd >= 0) {
        close(*fd);
        //传入的正值对应的套接字接口关闭
        *fd = -1;
    }
    //关闭socket中套接字连接
}

5.创建消息队列 CreateMsgQue() 函数用来创建一个消息队列。 参数详解

  • const char *queueName :队列名
  • unsigned short len:每个消息的最大字节数
  • unsigned int *queueID:队列的ID编号
  • unsigned int flags:消息队列标志,表示是否堵塞
  • unsigned short maxMsgSize:消息队列中每个消息的最大字节数
int CreateMsgQue(const char *queueName,//创建一个消息队列
    unsigned short len, unsigned int *queueID,
    unsigned int flags, unsigned short maxMsgSize)
{
    if (queueName == NULL || queueID == NULL) {
        return -1;
    }
    struct mq_attr newAttr = {0};
    newAttr.mq_flags = flags;
    newAttr.mq_maxmsg = len;
    newAttr.mq_msgsize = maxMsgSize;
    int mqd = mq_open(queueName, O_CREAT | O_RDWR | O_EXCL, S_IRUSR | S_IWUSR, &newAttr);
    //mq_open函数用来创建一个消息队列,成功返回队列描述符,失败-1
    if (mqd             
关注
打赏
1635606302
查看更多评论
0.3718s