b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

tls pjsua app 分析 pjsua(10)

电脑杂谈  发布时间:2018-02-09 00:05:23  来源:网络整理

以上就是初始化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

pjlog2

tls_tls是什么文件格式_tls与ssl的区别

在 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

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...