本篇主要分析模块一中trans_service目录下trans_lock.c代码
文件路径(模块一\communication_softbus_lite- master\trans_service\source\libdisbus\trans_lock.c)
本篇中所应用到的背景知识为互斥锁和session创建
传送门:
头文件主要是使用条件编译和相关函数声明。
#ifndef TRANS_LOCK_H #define TRANS_LOCK_H int InitTcpMgrLock(void); int GetTcpMgrLock(void); int ReleaseTcpMgrLock(void); //对相关函数进行提前声明 #endif // TRANS_SERVICE_UTIL_H
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相关代码分析完毕,感谢阅读点赞。
传送门: