1.debug_manager.c分析
static PT_DebugOpr g_ptDebugOprHead;
static int g_iDbgLevelLimit = 8;
int RegisterDebugOpr(PT_DebugOpr ptDebugOpr); //注册可供打印debug的设备
void ShowDebugOpr(void); //显示一下有哪些设备
PT_DebugOpr GetDebugOpr(char *pcName); //根据名字找设备的结构体指针
int SetDbgLevel(char *strBuf); //设置打印等级,主要在网络接收线程中被调用
//格式为 "strBuf = "dbglevel=6"
int SetDbgChanel(char *strBuf); //设置通道的开和关,主要在网络接收线程中被调用
//格式为 stdout=0 stdout=1 netprint=0 netprint=1
int DebugPrint(const char *pcFormat, ...); //所有DEBUG都指向这个函数
//主要工作是,把输入进来的变参转换成字符串
//判断字符串中是否有打印等级,若有,判断打印等级是否高于设置的打印等级
//依次轮询链表中能用的打印设备,挨个打印字符串
/*这两个函数在主函数中调用,一开始就调用了,以便后面可以DEBUG*/
int DebugInit(void); //调用所有打印设备的Init函数,用来向链表头注册
int InitDebugChanel(void); //初始化打印通道
//意思就是看链表里的打印设备如果isCanUse标志位都是1
//并且初始化函数存在
//就为每一个设备执行其自己的设备初始化函数
2.netprint.c分析
开始定义的变量分析
#define SERVER_PORT 5678 //服务器端口
#define PRINT_BUF_SIZE (16*1024) //环形缓冲区的大小设置
static int g_iSocketServer; //服务器的socket句柄
static struct sockaddr_in g_tSocketServerAddr; //服务器的IP地址
static struct sockaddr_in g_tSocketClientAddr; //用来存放连接上来的客户端的IP地址
static int g_iHaveConnected = 0; //是否有客户端成功连接的标志
static char *g_pcNetPrintBuf;//环形缓冲区的首地址
static int g_iReadPos = 0; //环形缓冲区读的位置
static int g_iWritePos = 0; //环形缓冲区写的位置
/*收发线程的两个ID号*/
static pthread_t g_tSendTreadID;
static pthread_t g_tRecvTreadID;
/*线程间通信,定义的锁和一个什么东西*/
static pthread_mutex_t g_tNetDbgSendMutex = PTHREAD_MUTEX_INITIALIZER; //定义锁
static pthread_cond_t g_tNetDbgSendConVar = PTHREAD_COND_INITIALIZER; //定义唤醒的一个什么东西
函数分析
/*这四个是环形缓冲区的函数,详情看C语言类中的环形缓冲区的代码详解*/
static int isFull(void);
static int isEmpty(void);
static int PutData(char cVal);
static int GetData(char *pcVal);
/*发送线程的执行函数
*1.通过NetDbgPrint函数唤醒
2.如果 已经有客户端连接,并且 环形缓冲区不为空,那么就开始发送
3.一次最多发送512个字节的数据,直到把缓冲区的数据发完
4.上锁进睡眠等唤醒*/
static void *NetDbgSendTreadFunction(void *pVoid);
/*接收线程的执行函数
*1.这条进程不进入睡眠
2.阻塞等待接收数据
3.如果收到的是"setclient",就表明客户端需要打印数据,就设置g_tSocketClientAddr,g_iHaveConnected
4.如果收到的是"dbglevel=",就调用SetDbgLevel设置
5.剩下的都丢给 SetDbgChanel去处理,格式不对就直接丢了,格式对了就处理*/
static void *NetDbgRecvTreadFunction(void *pVoid);
/*主要做三件事
*1.设置服务器
*2.挖一块内存给环形缓冲区
*3.开两个线程给收发的*/
static int NetDbgInit(void);
/*关服务器,以及释放环形缓冲区*/
static int NetDbgExit(void);
/*net debug显示函数
*先把数据一个字节一个字节放到环形缓冲区
*然后告诉子线程,可以搞了*/
static int NetDbgPrint(char *strData);
int NetPrintInit(void); //注册函数
整个的流程:
主函数两个初始化,第一个是让各个设备注册到链表,第二个是看哪些设备能用,然后依次调用设备初始化函数。
net_print初始化好后,接收线程就在等待客户端的连接或者设置,在有客户端发送set_client之前,调用到DEBUG都会把字符串放到环形缓冲区中,最后有客户端连接后, 执行的第一次net_print,就会一次性把缓冲区的内容全部发送出去。