您当前的位置: 首页 > 

小生叫安辰

暂无认证

  • 5浏览

    0关注

    105博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

鸿蒙源码分析(九)

小生叫安辰 发布时间:2021-08-02 11:56:28 ,浏览量:5

trans_lock.c相关代码分析

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

一、背景知识

本篇中所应用到的背景知识为互斥锁和session创建 传送门:

  • 1. 互斥锁详解
  • 2.session机制
二、代码分析 1. 头文件trans_lock.h

头文件主要是使用条件编译和相关函数声明。

#ifndef TRANS_LOCK_H
#define TRANS_LOCK_H
int InitTcpMgrLock(void);
int GetTcpMgrLock(void);
int ReleaseTcpMgrLock(void);
//对相关函数进行提前声明
#endif // TRANS_SERVICE_UTIL_H
2. 源文件trans_lock.c

1. 相关定义

#define BUS_WAIT_FOREVER 0xFFFFFFFF//定义总线等待的超时阈值

#if defined(__LITEOS_M__) || defined(__LITEOS_RISCV__)//使用条件编译进行定义变量
//基于指令集架构和鸿蒙内核架构的条件编译,来创建不同类型的锁变量
static osMutexId_t g_sessionManagerLock;//定义会话管理锁变量
#else
static pthread_mutex_t g_sessionManagerLock;//定义会话管理锁变量
#endif

2.初始话tcp管理锁

int InitTcpMgrLock(void)//用来初始化tcp管理锁
{
#if defined(__LITEOS_M__) || defined(__LITEOS_RISCV__)
    if (g_sessionManagerLock != NULL) {
        return DBE_SUCCESS;
    }
    g_sessionManagerLock = osMutexNew(NULL);
    //创建并初始化一个新的互斥锁对象
#else
    pthread_mutex_init(&g_sessionManagerLock, NULL);
    //以指定属性来初始化刚创建的互斥锁,这里的属性默认为NULL
#endif
    return DBE_SUCCESS;
}

3.获取/申请互斥锁 通过 pthread_mutex_lock和osMutexAcquire来对不同情况下的条件进行申请互斥锁

int GetTcpMgrLock(void)//
{
#if defined(__LITEOS_M__) || defined(__LITEOS_RISCV__)
    if (g_sessionManagerLock == NULL) {
        return -DBE_INNER_ERROR;
    }
    osStatus_t ret = osMutexAcquire(g_sessionManagerLock, BUS_WAIT_FOREVER);
    //如果g_sessionManagerLock指向的对象被锁定,就获取互斥锁或者超时值。
    if (ret != osOK) {
        return -DBE_INNER_ERROR;
    }
#else
    pthread_mutex_lock(&g_sessionManagerLock);
    //对g_sessionManagerLock指向地址中对象进行申请互斥锁操作。
    //并且是以阻塞的方式申请互斥锁
#endif
    return DBE_SUCCESS;
}

4.释放互斥锁 通过osMutexRelease()函数和pthread_mutex_unlock()函数来释放所申请的互斥锁。

int ReleaseTcpMgrLock(void)
{
#if defined(__LITEOS_M__) || defined(__LITEOS_RISCV__)
    if (g_sessionManagerLock == NULL) {
        return -DBE_INNER_ERROR;
    }
    osStatus_t ret = osMutexRelease(g_sessionManagerLock);
    //释放由osMutexAcquire获取的互斥锁
    if (ret != osOK) {
        return -DBE_INNER_ERROR;
    }
#else
    pthread_mutex_unlock(&g_sessionManagerLock);
    //实现互斥锁的释放。
    //其中释放操作只能由占有该互斥锁的线程完成。
#endif
    return DBE_SUCCESS;
}
三、总结

本篇代码涉及到互斥锁相关操作,主要是基于互斥锁上面操作对tcp进行加锁、释放等操作。为tcp服务连接和会话创建等进行铺垫。 该文件中两个主要函数GetTcpMgrLock()和ReleaseTcpMgrLock()就是通过g_sessionManagerLock这个Mutex进行互斥操作,防止同一时间多个模块同时在创建Session Server。 真正的业务逻辑在CreateSessionServerInner()函数中,我们来看看代码: (文件位置:trans_service下tcp_session_manager.c中) 在这里插入图片描述 爱按 至此trans_lock相关代码分析完毕,感谢阅读点赞。 传送门:

  • 1. 互斥锁详解
  • 2.session机制
关注
打赏
1635606302
查看更多评论
立即登录/注册

微信扫码登录

0.0562s