鸿蒙源码分析(九)

trans_lock.c相关代码分析

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

一、背景知识

本篇中所应用到的背景知识为互斥锁和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相关代码分析完毕,感谢阅读点赞。
传送门:

上一篇:【Luogu P4762】[CERC2014]Virus synthesis


下一篇:浅谈后缀自动机SAM模板