以上就是初始化pjlib 库
在pj_init 的时候 还要初始化 log
pj_status_t pj_log_init(void)//TlsAlloc 分配绑定index 和 当前线程的slot
{
#if PJ_HAS_THREADS
status = pj_thread_local_alloc(&thread_suspended_tls_id);
#if PJ_LOG_ENABLE_INDENT
status = pj_thread_local_alloc(&thread_indent_tls_id);
#endif
return PJ_SUCCESS;
}
初始化同步锁,简单看了下源码,还是挺复杂的这里不分析了
rc=init_mutex(&critical_section_mutex, “pj%p”)
PJ_DEF(pj_str_t*) pj_generate_unique_string(pj_str_t *str){
GUID guid;
CoCreateGuid(&guid); //生成全球唯一名称字符串,GUID的使用
guid_to_str( &guid, str );
return str;
}
以上差不多pjlib 初始化成功了
在分析产生随机之前 ,先分析Create pjsua 中的 pj_log_push_indent 和 pj_log_pop_indent

在 pjlib的log.c文件中可以看到源码
先看 pj_log_push_indent pj_log_pop_indent 都是调用pj_log_add_indent 只是参数不同
#ifndef PJ_LOG_INDENT_SIZE
# define PJ_LOG_INDENT_SIZE 1
#endif
PJ_DEF(void) pj_log_push_indent(void)
{
pj_log_add_indent(PJ_LOG_INDENT_SIZE); //1
}
PJ_DEF(void) pj_log_pop_indent(void)
{
pj_log_add_indent(-PJ_LOG_INDENT_SIZE);//-1
}
然后就直接log_set_indent 设置indent值
PJ_DEF(void) pj_log_add_indent(int indent)
{
log_set_indent(log_get_raw_indent() + indent);
}
这里其实可以看一下log_get_raw_indent 分析源码,但是我可以确定log_get_raw_indent获取一个值,所以直接分析log_set_indent
static void log_set_indent(int indent)
{
if (indent < 0) indent = 0;
/*上面pj_log_init初始化的时候,就已经通过TlsAlloc 分配线程index 即thread_indent_tls_id*/
pj_thread_local_set(thread_indent_tls_id, (void*)(pj_ssize_t)indent);
}
最后调用TlsSetValue ,这里其实有线程的基本知识要学习
每个线程除了共享进程的资源外还拥有各自的私有资源 寄存器组(或者说是线程上下文)、堆栈、消息队列、Thread Local Storage(TLS)、结构化异常处理串链
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-67841-10.html
疯了吧