* Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
 * Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification,
 * are permitted provided that the following conditions are met:
 *
 * 1. Redistributions of source code must retain the above copyright notice, this list of
 * conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright notice, this list
 * of conditions and the following disclaimer in the documentation and/or other materials
 * provided with the distribution.
 *
 * 3. Neither the name of the copyright holder nor the names of its contributors may be used
 * to endorse or promote products derived from this software without specific prior written
 * permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
#ifndef _IT_PTHREAD_TEST_H  // 防止头文件被重复包含
#define _IT_PTHREAD_TEST_H

#include "osTest.h"  // 包含操作系统测试相关的头文件
#include <sys/resource.h>  // 包含资源控制相关的头文件
#include <sys/wait.h>  // 包含等待进程结束相关的头文件
#include <time.h>  // 包含时间处理的头文件

#define SLEEP_AND_YIELD(tick) usleep((tick)*10 * 1000)  // 定义宏,用于睡眠和让出CPU,tick为微秒单位

#include "sys/syscall.h"  // 包含系统调用相关的头文件

// 定义一个内联函数,用于执行系统调用
static inline int Syscall(int nbr, int parm1, int parm2, int parm3, int parm4)
{
    register int reg7 __asm__("r7") = nbr;  // 将系统调用号放入寄存器r7
    register int reg3 __asm__("r3") = parm4;  // 将第四个参数放入寄存器r3
    register int reg2 __asm__("r2") = parm3;  // 将第三个参数放入寄存器r2
    register int reg1 __asm__("r1") = parm2;  // 将第二个参数放入寄存器r1
    register int reg0 __asm__("r0") = parm1;  // 将第一个参数放入寄存器r0

    // 使用svc指令触发系统调用,将结果存回reg0
    __asm__ __volatile__("svc 0" : "=r"(reg0) : "r"(reg7), "r"(reg0), "r"(reg1), "r"(reg2), "r"(reg3) : "memory");

    return reg0;  // 返回系统调用的结果
}

// 声明全局变量,用于存储单元测试的错误码和错误行号
extern INT32 g_iCunitErrCode;
extern INT32 g_iCunitErrLineNo;

// 声明一系列pthread相关的测试函数
extern void ItTestPthread001(void);  // pthread测试函数1
extern void ItTestPthread002(void);  // pthread测试函数2
extern void ItTestPthread003(void);  // pthread测试函数3
extern void ItTestPthread004(void);  // pthread测试函数4
extern void ItTestPthread005(void);  // pthread测试函数5
extern void ItTestPthread006(void);  // pthread测试函数6
extern void ItTestPthread007(void);  // pthread测试函数7
extern void ItTestPthread008(void);  // pthread测试函数8
extern void ItTestPthread009(void);  // pthread测试函数9
extern void ItTestPthread010(void);  // pthread测试函数10
extern void ItTestPthread012(void);  // 省略了11,可能是个错误或者遗漏
extern void ItTestPthread011(void);  // pthread测试函数11
extern void ItTestPthread013(void);  // pthread测试函数13
extern void ItTestPthread014(void);  // pthread测试函数14
extern void ItTestPthread015(void);  // pthread测试函数15
extern void ItTestPthread016(void);  // pthread测试函数16
extern void ItTestPthread017(void);  // pthread测试函数17
extern void ItTestPthread018(void);  // pthread测试函数18
extern void ItTestPthread019(void);  // pthread测试函数19
extern void ItTestPthread020(void);  // pthread测试函数20
extern void ItTestPthread021(void);  // pthread测试函数21
extern void ItTestPthread022(void);  // pthread测试函数22
extern void ItTestPthread023(void);  // pthread测试函数23
extern void ItTestPthread024(void);  // pthread测试函数24
extern void ItTestPthread025(void);  // pthread测试函数25
extern void ItTestPthread026(void);  // pthread测试函数26
extern void ItTestPthread027(void);  // pthread测试函数27
extern void ItTestPthreadAtfork001(void);  // pthread atfork测试函数1
extern void ItTestPthreadAtfork002(void);  // pthread atfork测试函数2
extern void ItTestPthreadOnce001(void);  // pthread once测试函数1
extern void ItTestPthreadCond001(void);  // pthread 条件变量测试函数1
extern void ItTestPthreadCond002(void);  // pthread 条件变量测试函数2
extern void ItTestPthreadCond003(void);  // pthread 条件变量测试函数3
extern void ItTestPthreadCond004(void);  // pthread 条件变量测试函数4
#endif  // 结束头文件保护
pull/2/head
Lvwenxuan 7 months ago
parent 7a03be035e
commit 1e2e1722f8

@ -28,65 +28,70 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
#ifndef _IT_PTHREAD_TEST_H #ifndef _IT_PTHREAD_TEST_H // 防止头文件被重复包含
#define _IT_PTHREAD_TEST_H #define _IT_PTHREAD_TEST_H
#include "osTest.h" #include "osTest.h" // 包含操作系统测试相关的头文件
#include <sys/resource.h> #include <sys/resource.h> // 包含资源控制相关的头文件
#include <sys/wait.h> #include <sys/wait.h> // 包含等待进程结束相关的头文件
#include <time.h> #include <time.h> // 包含时间处理的头文件
#define SLEEP_AND_YIELD(tick) usleep((tick)*10 * 1000) #define SLEEP_AND_YIELD(tick) usleep((tick)*10 * 1000) // 定义宏用于睡眠和让出CPUtick为微秒单位
#include "sys/syscall.h" #include "sys/syscall.h" // 包含系统调用相关的头文件
// 定义一个内联函数,用于执行系统调用
static inline int Syscall(int nbr, int parm1, int parm2, int parm3, int parm4) static inline int Syscall(int nbr, int parm1, int parm2, int parm3, int parm4)
{ {
register int reg7 __asm__("r7") = nbr; register int reg7 __asm__("r7") = nbr; // 将系统调用号放入寄存器r7
register int reg3 __asm__("r3") = parm4; register int reg3 __asm__("r3") = parm4; // 将第四个参数放入寄存器r3
register int reg2 __asm__("r2") = parm3; register int reg2 __asm__("r2") = parm3; // 将第三个参数放入寄存器r2
register int reg1 __asm__("r1") = parm2; register int reg1 __asm__("r1") = parm2; // 将第二个参数放入寄存器r1
register int reg0 __asm__("r0") = parm1; register int reg0 __asm__("r0") = parm1; // 将第一个参数放入寄存器r0
// 使用svc指令触发系统调用将结果存回reg0
__asm__ __volatile__("svc 0" : "=r"(reg0) : "r"(reg7), "r"(reg0), "r"(reg1), "r"(reg2), "r"(reg3) : "memory"); __asm__ __volatile__("svc 0" : "=r"(reg0) : "r"(reg7), "r"(reg0), "r"(reg1), "r"(reg2), "r"(reg3) : "memory");
return reg0; return reg0; // 返回系统调用的结果
} }
// 声明全局变量,用于存储单元测试的错误码和错误行号
extern INT32 g_iCunitErrCode; extern INT32 g_iCunitErrCode;
extern INT32 g_iCunitErrLineNo; extern INT32 g_iCunitErrLineNo;
extern void ItTestPthread001(void); // 声明一系列pthread相关的测试函数
extern void ItTestPthread002(void); extern void ItTestPthread001(void); // pthread测试函数1
extern void ItTestPthread003(void); extern void ItTestPthread002(void); // pthread测试函数2
extern void ItTestPthread004(void); extern void ItTestPthread003(void); // pthread测试函数3
extern void ItTestPthread005(void); extern void ItTestPthread004(void); // pthread测试函数4
extern void ItTestPthread006(void); extern void ItTestPthread005(void); // pthread测试函数5
extern void ItTestPthread007(void); extern void ItTestPthread006(void); // pthread测试函数6
extern void ItTestPthread008(void); extern void ItTestPthread007(void); // pthread测试函数7
extern void ItTestPthread009(void); extern void ItTestPthread008(void); // pthread测试函数8
extern void ItTestPthread010(void); extern void ItTestPthread009(void); // pthread测试函数9
extern void ItTestPthread012(void); extern void ItTestPthread010(void); // pthread测试函数10
extern void ItTestPthread011(void); extern void ItTestPthread012(void); // 省略了11可能是个错误或者遗漏
extern void ItTestPthread013(void); extern void ItTestPthread011(void); // pthread测试函数11
extern void ItTestPthread014(void); extern void ItTestPthread013(void); // pthread测试函数13
extern void ItTestPthread015(void); extern void ItTestPthread014(void); // pthread测试函数14
extern void ItTestPthread016(void); extern void ItTestPthread015(void); // pthread测试函数15
extern void ItTestPthread017(void); extern void ItTestPthread016(void); // pthread测试函数16
extern void ItTestPthread018(void); extern void ItTestPthread017(void); // pthread测试函数17
extern void ItTestPthread019(void); extern void ItTestPthread018(void); // pthread测试函数18
extern void ItTestPthread020(void); extern void ItTestPthread019(void); // pthread测试函数19
extern void ItTestPthread021(void); extern void ItTestPthread020(void); // pthread测试函数20
extern void ItTestPthread022(void); extern void ItTestPthread021(void); // pthread测试函数21
extern void ItTestPthread023(void); extern void ItTestPthread022(void); // pthread测试函数22
extern void ItTestPthread024(void); extern void ItTestPthread023(void); // pthread测试函数23
extern void ItTestPthread025(void); extern void ItTestPthread024(void); // pthread测试函数24
extern void ItTestPthread026(void); extern void ItTestPthread025(void); // pthread测试函数25
extern void ItTestPthread027(void); extern void ItTestPthread026(void); // pthread测试函数26
extern void ItTestPthreadAtfork001(void); extern void ItTestPthread027(void); // pthread测试函数27
extern void ItTestPthreadAtfork002(void); extern void ItTestPthreadAtfork001(void); // pthread atfork测试函数1
extern void ItTestPthreadOnce001(void); extern void ItTestPthreadAtfork002(void); // pthread atfork测试函数2
extern void ItTestPthreadCond001(void); extern void ItTestPthreadOnce001(void); // pthread once测试函数1
extern void ItTestPthreadCond002(void); extern void ItTestPthreadCond001(void); // pthread 条件变量测试函数1
extern void ItTestPthreadCond003(void); extern void ItTestPthreadCond002(void); // pthread 条件变量测试函数2
extern void ItTestPthreadCond004(void); extern void ItTestPthreadCond003(void); // pthread 条件变量测试函数3
#endif extern void ItTestPthreadCond004(void); // pthread 条件变量测试函数4
#endif // 结束头文件保护

@ -28,164 +28,165 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
#include "stdio.h"
#include <climits>
#include <gtest/gtest.h>
#include "it_pthread_test.h"
#include <sys/resource.h>
using namespace testing::ext; #include "stdio.h" // 引入标准输入输出头文件
namespace OHOS { #include <climits> // 引入字符类型限制头文件
class ProcessPthreadTest : public testing::Test { #include <gtest/gtest.h> // 引入google测试框架头文件
#include "it_pthread_test.h" // 引入自定义的pthread测试头文件
#include <sys/resource.h> // 引入系统资源头文件
using namespace testing::ext; // 使用google测试框架的扩展命名空间
namespace OHOS { // 定义OHOS命名空间
class ProcessPthreadTest : public testing::Test { // 定义一个继承自testing::Test的测试类
public: public:
static void SetUpTestCase(void) static void SetUpTestCase(void) // 静态成员函数,用于在所有测试开始前执行
{ {
struct sched_param param = { 0 }; struct sched_param param = { 0 }; // 定义一个sched_param结构体并初始化为0
int currThreadPolicy, ret; int currThreadPolicy, ret; // 定义当前线程策略和返回值变量
ret = pthread_getschedparam(pthread_self(), &currThreadPolicy, &param); ret = pthread_getschedparam(pthread_self(), &currThreadPolicy, &param); // 获取当前线程的调度参数
ICUNIT_ASSERT_EQUAL_VOID(ret, 0, -ret); ICUNIT_ASSERT_EQUAL_VOID(ret, 0, -ret); // 使用自定义宏断言返回值是否为0
param.sched_priority = TASK_PRIO_TEST; param.sched_priority = TASK_PRIO_TEST; // 设置调度优先级为TASK_PRIO_TEST未在代码中定义
ret = pthread_setschedparam(pthread_self(), SCHED_RR, &param); ret = pthread_setschedparam(pthread_self(), SCHED_RR, &param); // 设置当前线程的调度策略和参数
ICUNIT_ASSERT_EQUAL_VOID(ret, 0, -ret); ICUNIT_ASSERT_EQUAL_VOID(ret, 0, -ret); // 使用自定义宏断言返回值是否为0
} }
static void TearDownTestCase(void) {} static void TearDownTestCase(void) {} // 静态成员函数,用于在所有测试结束后执行,此处为空实现
}; };
#if defined(LOSCFG_USER_TEST_SMOKE) #if defined(LOSCFG_USER_TEST_SMOKE) // 如果定义了LOSCFG_USER_TEST_SMOKE宏
/* * /* *
* @tc.name: it_test_pthread_003 * @tc.name: it_test_pthread_003
* @tc.desc: function for ProcessPthreadTest * @tc.desc: function for ProcessPthreadTest
* @tc.type: FUNC * @tc.type: FUNC
*/ */
HWTEST_F(ProcessPthreadTest, ItTestPthread003, TestSize.Level0) HWTEST_F(ProcessPthreadTest, ItTestPthread003, TestSize.Level0) // 定义一个测试用例
{ {
ItTestPthread003(); ItTestPthread003(); // 调用ItTestPthread003函数未在代码中定义
} }
#ifndef LOSCFG_USER_TEST_SMP #ifndef LOSCFG_USER_TEST_SMP // 如果没有定义LOSCFG_USER_TEST_SMP宏
/* * /* *
* @tc.name: it_test_pthread_006 * @tc.name: it_test_pthread_006
* @tc.desc: function for ProcessPthreadTest * @tc.desc: function for ProcessPthreadTest
* @tc.type: FUNC * @tc.type: FUNC
*/ */
HWTEST_F(ProcessPthreadTest, ItTestPthread006, TestSize.Level0) HWTEST_F(ProcessPthreadTest, ItTestPthread006, TestSize.Level0) // 定义一个测试用例
{ {
ItTestPthread006(); ItTestPthread006(); // 调用ItTestPthread006函数未在代码中定义
} }
#endif #endif
/* * /* *
* @tc.name: it_test_pthread_007 * @tc.name: it_test_pthread_007
* @tc.desc: function for ProcessPthreadTest * @tc.desc: function for ProcessPthreadTest
* @tc.type: FUNC * @tc.type: FUNC
*/ */
HWTEST_F(ProcessPthreadTest, ItTestPthread007, TestSize.Level0) HWTEST_F(ProcessPthreadTest, ItTestPthread007, TestSize.Level0) // 定义一个测试用例
{ {
ItTestPthread007(); ItTestPthread007(); // 调用ItTestPthread007函数未在代码中定义
} }
/* * /* *
* @tc.name: it_test_pthread_008 * @tc.name: it_test_pthread_008
* @tc.desc: function for ProcessPthreadTest * @tc.desc: function for ProcessPthreadTest
* @tc.type: FUNC * @tc.type: FUNC
*/ */
HWTEST_F(ProcessPthreadTest, ItTestPthread008, TestSize.Level0) HWTEST_F(ProcessPthreadTest, ItTestPthread008, TestSize.Level0) // 定义一个测试用例
{ {
ItTestPthread008(); ItTestPthread008(); // 调用ItTestPthread008函数未在代码中定义
} }
/* * /* *
* @tc.name: it_test_pthread_009 * @tc.name: it_test_pthread_009
* @tc.desc: function for ProcessPthreadTest * @tc.desc: function for ProcessPthreadTest
* @tc.type: FUNC * @tc.type: FUNC
*/ */
HWTEST_F(ProcessPthreadTest, ItTestPthread009, TestSize.Level0) HWTEST_F(ProcessPthreadTest, ItTestPthread009, TestSize.Level0) // 定义一个测试用例
{ {
ItTestPthread009(); ItTestPthread009(); // 调用ItTestPthread009函数未在代码中定义
} }
#ifndef LOSCFG_USER_TEST_SMP #ifndef LOSCFG_USER_TEST_SMP // 如果没有定义LOSCFG_USER_TEST_SMP宏
/* * /* *
* @tc.name: it_test_pthread_010 * @tc.name: it_test_pthread_010
* @tc.desc: function for ProcessPthreadTest * @tc.desc: function for ProcessPthreadTest
* @tc.type: FUNC * @tc.type: FUNC
*/ */
HWTEST_F(ProcessPthreadTest, ItTestPthread010, TestSize.Level0) HWTEST_F(ProcessPthreadTest, ItTestPthread010, TestSize.Level0) // 定义一个测试用例
{ {
ItTestPthread010(); ItTestPthread010(); // 调用ItTestPthread010函数未在代码中定义
} }
#endif #endif
/* * /* *
* @tc.name: it_test_pthread_011 * @tc.name: it_test_pthread_011
* @tc.desc: function for ProcessPthreadTest * @tc.desc: function for ProcessPthreadTest
* @tc.type: FUNC * @tc.type: FUNC
*/ */
HWTEST_F(ProcessPthreadTest, ItTestPthread011, TestSize.Level0) HWTEST_F(ProcessPthreadTest, ItTestPthread011, TestSize.Level0) // 定义一个测试用例
{ {
ItTestPthread011(); ItTestPthread011(); // 调用ItTestPthread011函数未在代码中定义
} }
/* * /* *
* @tc.name: it_test_pthread_012 * @tc.name: it_test_pthread_012
* @tc.desc: function for ProcessPthreadTest * @tc.desc: function for ProcessPthreadTest
* @tc.type: FUNC * @tc.type: FUNC
*/ */
HWTEST_F(ProcessPthreadTest, ItTestPthread012, TestSize.Level0) HWTEST_F(ProcessPthreadTest, ItTestPthread012, TestSize.Level0) // 定义一个测试用例
{ {
ItTestPthread012(); ItTestPthread012(); // 调用ItTestPthread012函数未在代码中定义
} }
/* * /* *
* @tc.name: it_test_pthread_013 * @tc.name: it_test_pthread_013
* @tc.desc: function for ProcessPthreadTest * @tc.desc: function for ProcessPthreadTest
* @tc.type: FUNC * @tc.type: FUNC
*/ */
HWTEST_F(ProcessPthreadTest, ItTestPthread013, TestSize.Level0) HWTEST_F(ProcessPthreadTest, ItTestPthread013, TestSize.Level0) // 定义一个测试用例
{ {
ItTestPthread013(); ItTestPthread013(); // 调用ItTestPthread013函数未在代码中定义
} }
/* * /* *
* @tc.name: it_test_pthread_015 * @tc.name: it_test_pthread_015
* @tc.desc: function for ProcessPthreadTest * @tc.desc: function for ProcessPthreadTest
* @tc.type: FUNC * @tc.type: FUNC
*/ */
HWTEST_F(ProcessPthreadTest, ItTestPthread015, TestSize.Level0) HWTEST_F(ProcessPthreadTest, ItTestPthread015, TestSize.Level0) // 定义一个测试用例
{ {
ItTestPthread015(); ItTestPthread015(); // 调用ItTestPthread015函数未在代码中定义
} }
/* * /* *
* @tc.name: it_test_pthread_016 * @tc.name: it_test_pthread_016
* @tc.desc: function for ProcessPthreadTest * @tc.desc: function for ProcessPthreadTest
* @tc.type: FUNC * @tc.type: FUNC
*/ */
HWTEST_F(ProcessPthreadTest, ItTestPthread016, TestSize.Level0) HWTEST_F(ProcessPthreadTest, ItTestPthread016, TestSize.Level0) // 定义一个测试用例
{ {
ItTestPthread016(); ItTestPthread016(); // 调用ItTestPthread016函数未在代码中定义
} }
/* * /* *
* @tc.name: it_test_pthread_018 * @tc.name: it_test_pthread_018
* @tc.desc: function for ProcessPthreadTest * @tc.desc: function for ProcessPthreadTest
* @tc.type: FUNC * @tc.type: FUNC
*/ */
HWTEST_F(ProcessPthreadTest, ItTestPthread018, TestSize.Level0) HWTEST_F(ProcessPthreadTest, ItTestPthread018, TestSize.Level0) // 定义一个测试用例
{ {
ItTestPthread018(); ItTestPthread018(); // 调用ItTestPthread018函数未在代码中定义
} }
/* * /* *
* @tc.name: it_test_pthread_019 * @tc.name: it_test_pthread_019
* @tc.desc: function for ProcessPthreadTest * @tc.desc: function for ProcessPthreadTest
* @tc.type: FUNC * @tc.type: FUNC
*/ */
HWTEST_F(ProcessPthreadTest, ItTestPthread019, TestSize.Level0) HWTEST_F(ProcessPthreadTest, ItTestPthread019, TestSize.Level0) // 定义一个测试用例
{ {
ItTestPthread019(); ItTestPthread019(); // 调用ItTestPthread019函数未在代码中定义
} }
/* * /* *
* @tc.name: it_test_pthread_020 * @tc.name: it_test_pthread_020
* @tc.desc: function for ProcessPthreadTest * @tc.desc: function for ProcessPthreadTest
@ -193,9 +194,9 @@ HWTEST_F(ProcessPthreadTest, ItTestPthread019, TestSize.Level0)
* @tc.require: issueI6T3P3 * @tc.require: issueI6T3P3
* @tc.author: * @tc.author:
*/ */
HWTEST_F(ProcessPthreadTest, ItTestPthread020, TestSize.Level0) HWTEST_F(ProcessPthreadTest, ItTestPthread020, TestSize.Level0) // 定义一个测试用例
{ {
ItTestPthread020(); ItTestPthread020(); // 调用ItTestPthread020函数未在代码中定义
} }
/* * /* *

@ -28,7 +28,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
#include "it_pthread_test.h" #include "it_pthread_test.h"
static volatile int g_count = 0; static volatile int g_count = 0;
static pthread_mutex_t g_lock = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t g_lock = PTHREAD_MUTEX_INITIALIZER;

Loading…
Cancel
Save