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相关代码分析完毕,感谢阅读点赞。
传送门: