13d8536b4Sopenharmony_ci/*
23d8536b4Sopenharmony_ci * Copyright (c) 2022-2022 Huawei Device Co., Ltd. All rights reserved.
33d8536b4Sopenharmony_ci *
43d8536b4Sopenharmony_ci * Redistribution and use in source and binary forms, with or without modification,
53d8536b4Sopenharmony_ci * are permitted provided that the following conditions are met:
63d8536b4Sopenharmony_ci *
73d8536b4Sopenharmony_ci * 1. Redistributions of source code must retain the above copyright notice, this list of
83d8536b4Sopenharmony_ci *    conditions and the following disclaimer.
93d8536b4Sopenharmony_ci *
103d8536b4Sopenharmony_ci * 2. Redistributions in binary form must reproduce the above copyright notice, this list
113d8536b4Sopenharmony_ci *    of conditions and the following disclaimer in the documentation and/or other materials
123d8536b4Sopenharmony_ci *    provided with the distribution.
133d8536b4Sopenharmony_ci *
143d8536b4Sopenharmony_ci * 3. Neither the name of the copyright holder nor the names of its contributors may be used
153d8536b4Sopenharmony_ci *    to endorse or promote products derived from this software without specific prior written
163d8536b4Sopenharmony_ci *    permission.
173d8536b4Sopenharmony_ci *
183d8536b4Sopenharmony_ci * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
193d8536b4Sopenharmony_ci * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
203d8536b4Sopenharmony_ci * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
213d8536b4Sopenharmony_ci * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
223d8536b4Sopenharmony_ci * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
233d8536b4Sopenharmony_ci * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
243d8536b4Sopenharmony_ci * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
253d8536b4Sopenharmony_ci * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
263d8536b4Sopenharmony_ci * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
273d8536b4Sopenharmony_ci * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
283d8536b4Sopenharmony_ci * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
293d8536b4Sopenharmony_ci */
303d8536b4Sopenharmony_ci
313d8536b4Sopenharmony_ci#undef  _XOPEN_SOURCE
323d8536b4Sopenharmony_ci#define _XOPEN_SOURCE 600
333d8536b4Sopenharmony_ci
343d8536b4Sopenharmony_ci#include <securec.h>
353d8536b4Sopenharmony_ci#include "osTest.h"
363d8536b4Sopenharmony_ci#include "pthread.h"
373d8536b4Sopenharmony_ci#include "time.h"
383d8536b4Sopenharmony_ci#include <unistd.h>
393d8536b4Sopenharmony_ci
403d8536b4Sopenharmony_ci#undef TASK_PRIO_TEST
413d8536b4Sopenharmony_ci#define TASK_PRIO_TEST           LOSCFG_BASE_CORE_TSK_DEFAULT_PRIO
423d8536b4Sopenharmony_ci#define OS_TSK_TEST_STACK_SIZE   0x1000
433d8536b4Sopenharmony_ci#define PTHREAD_TASK_DELAY       10
443d8536b4Sopenharmony_ci
453d8536b4Sopenharmony_cistatic INT32 g_pthreadSem = 0;
463d8536b4Sopenharmony_ci
473d8536b4Sopenharmony_ci#define TEST_STR(func) ItLos##func
483d8536b4Sopenharmony_ci#define TEST_TO_STR(x) #x
493d8536b4Sopenharmony_ci#define TEST_HEAD_TO_STR(x) TEST_TO_STR(x)
503d8536b4Sopenharmony_ci#define ADD_TEST_CASE(func) \
513d8536b4Sopenharmony_ci    TEST_ADD_CASE(TEST_HEAD_TO_STR(TEST_STR(func)), func, TEST_LOS, TEST_TASK, TEST_LEVEL0, TEST_FUNCTION)
523d8536b4Sopenharmony_ci
533d8536b4Sopenharmony_ci#define Function   0
543d8536b4Sopenharmony_ci#define MediumTest 0
553d8536b4Sopenharmony_ci#define Level1     0
563d8536b4Sopenharmony_ci#define LITE_TEST_CASE(module, function, flag) static int function(void)
573d8536b4Sopenharmony_ci
583d8536b4Sopenharmony_cistatic VOID *PthreadJoinF01(void *argument)
593d8536b4Sopenharmony_ci{
603d8536b4Sopenharmony_ci    g_testCount++;
613d8536b4Sopenharmony_ci
623d8536b4Sopenharmony_ci    pthread_exit((void *)8); /* 8: pthread exit code */
633d8536b4Sopenharmony_ci    return (void *)9; /* 9: return val */
643d8536b4Sopenharmony_ci}
653d8536b4Sopenharmony_ci
663d8536b4Sopenharmony_ci/**
673d8536b4Sopenharmony_ci * @tc.number    : SUB_KERNEL_PTHREAD_OPERATION_001
683d8536b4Sopenharmony_ci * @tc.name      : event operation for join
693d8536b4Sopenharmony_ci * @tc.desc      : [C- SOFTWARE -0200]
703d8536b4Sopenharmony_ci */
713d8536b4Sopenharmony_ciLITE_TEST_CASE(PthreadFuncTestSuite, TestPthread001, Function | MediumTest | Level1)
723d8536b4Sopenharmony_ci{
733d8536b4Sopenharmony_ci    pthread_attr_t attr;
743d8536b4Sopenharmony_ci    pthread_t newTh;
753d8536b4Sopenharmony_ci    struct sched_param schedParam = { 0 };
763d8536b4Sopenharmony_ci    UINT32 ret;
773d8536b4Sopenharmony_ci    UINTPTR uwtemp = 1;
783d8536b4Sopenharmony_ci
793d8536b4Sopenharmony_ci    g_testCount = 0;
803d8536b4Sopenharmony_ci
813d8536b4Sopenharmony_ci    ret = pthread_attr_init(&attr);
823d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
833d8536b4Sopenharmony_ci
843d8536b4Sopenharmony_ci    ret = pthread_attr_setstacksize(&attr, OS_TSK_TEST_STACK_SIZE);
853d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
863d8536b4Sopenharmony_ci
873d8536b4Sopenharmony_ci    schedParam.sched_priority = TASK_PRIO_TEST;
883d8536b4Sopenharmony_ci    ret = pthread_attr_setschedparam(&attr, &schedParam);
893d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
903d8536b4Sopenharmony_ci
913d8536b4Sopenharmony_ci    ret = pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
923d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
933d8536b4Sopenharmony_ci
943d8536b4Sopenharmony_ci    ret = pthread_create(&newTh, &attr, PthreadJoinF01, NULL);
953d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
963d8536b4Sopenharmony_ci
973d8536b4Sopenharmony_ci    ret = pthread_join(newTh, (void **)&uwtemp);
983d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
993d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(uwtemp, 8, uwtemp); /* 8: pthread exit code */
1003d8536b4Sopenharmony_ci
1013d8536b4Sopenharmony_ci    return LOS_OK;
1023d8536b4Sopenharmony_ci};
1033d8536b4Sopenharmony_ci
1043d8536b4Sopenharmony_cistatic VOID *PthreadJoinF02(void *argument)
1053d8536b4Sopenharmony_ci{
1063d8536b4Sopenharmony_ci    g_testCount++;
1073d8536b4Sopenharmony_ci
1083d8536b4Sopenharmony_ci    return (void *)9; /* 9: return val */
1093d8536b4Sopenharmony_ci}
1103d8536b4Sopenharmony_ci
1113d8536b4Sopenharmony_ci/**
1123d8536b4Sopenharmony_ci * @tc.number    : SUB_KERNEL_PTHREAD_OPERATION_002
1133d8536b4Sopenharmony_ci * @tc.name      : event operation for join
1143d8536b4Sopenharmony_ci * @tc.desc      : [C- SOFTWARE -0200]
1153d8536b4Sopenharmony_ci */
1163d8536b4Sopenharmony_ciLITE_TEST_CASE(PthreadFuncTestSuite, TestPthread002, Function | MediumTest | Level1)
1173d8536b4Sopenharmony_ci{
1183d8536b4Sopenharmony_ci    pthread_attr_t attr;
1193d8536b4Sopenharmony_ci    pthread_t newTh;
1203d8536b4Sopenharmony_ci    struct sched_param schedParam = { 0 };
1213d8536b4Sopenharmony_ci    UINT32 ret;
1223d8536b4Sopenharmony_ci    UINTPTR uwtemp = 1;
1233d8536b4Sopenharmony_ci
1243d8536b4Sopenharmony_ci    g_testCount = 0;
1253d8536b4Sopenharmony_ci
1263d8536b4Sopenharmony_ci    ret = pthread_attr_init(&attr);
1273d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
1283d8536b4Sopenharmony_ci
1293d8536b4Sopenharmony_ci    ret = pthread_attr_setstacksize(&attr, OS_TSK_TEST_STACK_SIZE);
1303d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
1313d8536b4Sopenharmony_ci
1323d8536b4Sopenharmony_ci    schedParam.sched_priority = TASK_PRIO_TEST;
1333d8536b4Sopenharmony_ci    ret = pthread_attr_setschedparam(&attr, &schedParam);
1343d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
1353d8536b4Sopenharmony_ci
1363d8536b4Sopenharmony_ci    ret = pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
1373d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
1383d8536b4Sopenharmony_ci
1393d8536b4Sopenharmony_ci    ret = pthread_create(&newTh, &attr, PthreadJoinF02, NULL);
1403d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
1413d8536b4Sopenharmony_ci
1423d8536b4Sopenharmony_ci    ret = pthread_join(newTh, (void **)&uwtemp);
1433d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
1443d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(uwtemp, 9, uwtemp); /* 9: pthread exit code */
1453d8536b4Sopenharmony_ci
1463d8536b4Sopenharmony_ci    return LOS_OK;
1473d8536b4Sopenharmony_ci};
1483d8536b4Sopenharmony_ci
1493d8536b4Sopenharmony_cistatic VOID *PthreadJoinF03(void *argument)
1503d8536b4Sopenharmony_ci{
1513d8536b4Sopenharmony_ci    int ret = pthread_detach(pthread_self());
1523d8536b4Sopenharmony_ci    ICUNIT_GOTO_EQUAL(ret, ESRCH, ret, EXIT);
1533d8536b4Sopenharmony_ci
1543d8536b4Sopenharmony_ci    g_testCount++;
1553d8536b4Sopenharmony_ciEXIT:
1563d8536b4Sopenharmony_ci    return NULL;
1573d8536b4Sopenharmony_ci}
1583d8536b4Sopenharmony_ci
1593d8536b4Sopenharmony_ci/**
1603d8536b4Sopenharmony_ci * @tc.number    : SUB_KERNEL_PTHREAD_OPERATION_003
1613d8536b4Sopenharmony_ci * @tc.name      : event operation for deatch
1623d8536b4Sopenharmony_ci * @tc.desc      : [C- SOFTWARE -0200]
1633d8536b4Sopenharmony_ci */
1643d8536b4Sopenharmony_ciLITE_TEST_CASE(PthreadFuncTestSuite, TestPthread003, Function | MediumTest | Level1)
1653d8536b4Sopenharmony_ci{
1663d8536b4Sopenharmony_ci    pthread_attr_t attr;
1673d8536b4Sopenharmony_ci    pthread_t newTh;
1683d8536b4Sopenharmony_ci    struct sched_param schedParam = { 0 };
1693d8536b4Sopenharmony_ci    UINT32 ret;
1703d8536b4Sopenharmony_ci
1713d8536b4Sopenharmony_ci    g_testCount = 0;
1723d8536b4Sopenharmony_ci
1733d8536b4Sopenharmony_ci    ret = pthread_attr_init(&attr);
1743d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
1753d8536b4Sopenharmony_ci
1763d8536b4Sopenharmony_ci    ret = pthread_attr_setstacksize(&attr, OS_TSK_TEST_STACK_SIZE);
1773d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
1783d8536b4Sopenharmony_ci
1793d8536b4Sopenharmony_ci    schedParam.sched_priority = TASK_PRIO_TEST + 1;
1803d8536b4Sopenharmony_ci    ret = pthread_attr_setschedparam(&attr, &schedParam);
1813d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
1823d8536b4Sopenharmony_ci
1833d8536b4Sopenharmony_ci    ret = pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
1843d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
1853d8536b4Sopenharmony_ci
1863d8536b4Sopenharmony_ci    ret = pthread_create(&newTh, &attr, PthreadJoinF03, NULL);
1873d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
1883d8536b4Sopenharmony_ci
1893d8536b4Sopenharmony_ci    ret = pthread_join(newTh, NULL);
1903d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
1913d8536b4Sopenharmony_ci
1923d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(g_testCount, 1, g_testCount);
1933d8536b4Sopenharmony_ci    return LOS_OK;
1943d8536b4Sopenharmony_ci};
1953d8536b4Sopenharmony_ci
1963d8536b4Sopenharmony_cistatic VOID *PthreadJoinF04(void *argument)
1973d8536b4Sopenharmony_ci{
1983d8536b4Sopenharmony_ci    int ret = pthread_detach(pthread_self());
1993d8536b4Sopenharmony_ci    ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT);
2003d8536b4Sopenharmony_ci
2013d8536b4Sopenharmony_ci    g_testCount++;
2023d8536b4Sopenharmony_ciEXIT:
2033d8536b4Sopenharmony_ci    return NULL;
2043d8536b4Sopenharmony_ci}
2053d8536b4Sopenharmony_ci
2063d8536b4Sopenharmony_ci/**
2073d8536b4Sopenharmony_ci * @tc.number    : SUB_KERNEL_PTHREAD_OPERATION_004
2083d8536b4Sopenharmony_ci * @tc.name      : event operation for deatch
2093d8536b4Sopenharmony_ci * @tc.desc      : [C- SOFTWARE -0200]
2103d8536b4Sopenharmony_ci */
2113d8536b4Sopenharmony_ciLITE_TEST_CASE(PthreadFuncTestSuite, TestPthread004, Function | MediumTest | Level1)
2123d8536b4Sopenharmony_ci{
2133d8536b4Sopenharmony_ci    pthread_attr_t attr;
2143d8536b4Sopenharmony_ci    pthread_t newTh;
2153d8536b4Sopenharmony_ci    struct sched_param schedParam = { 0 };
2163d8536b4Sopenharmony_ci    UINT32 ret;
2173d8536b4Sopenharmony_ci
2183d8536b4Sopenharmony_ci    g_testCount = 0;
2193d8536b4Sopenharmony_ci
2203d8536b4Sopenharmony_ci    ret = pthread_attr_init(&attr);
2213d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
2223d8536b4Sopenharmony_ci
2233d8536b4Sopenharmony_ci    ret = pthread_attr_setstacksize(&attr, OS_TSK_TEST_STACK_SIZE);
2243d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
2253d8536b4Sopenharmony_ci
2263d8536b4Sopenharmony_ci    schedParam.sched_priority = TASK_PRIO_TEST - 1;
2273d8536b4Sopenharmony_ci    ret = pthread_attr_setschedparam(&attr, &schedParam);
2283d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
2293d8536b4Sopenharmony_ci
2303d8536b4Sopenharmony_ci    ret = pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
2313d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
2323d8536b4Sopenharmony_ci
2333d8536b4Sopenharmony_ci    ret = pthread_create(&newTh, &attr, PthreadJoinF04, NULL);
2343d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
2353d8536b4Sopenharmony_ci
2363d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(g_testCount, 1, g_testCount);
2373d8536b4Sopenharmony_ci
2383d8536b4Sopenharmony_ci    ret = pthread_join(newTh, NULL);
2393d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, ESRCH, ret);
2403d8536b4Sopenharmony_ci
2413d8536b4Sopenharmony_ci    return LOS_OK;
2423d8536b4Sopenharmony_ci};
2433d8536b4Sopenharmony_ci
2443d8536b4Sopenharmony_cistatic VOID *PthreadJoinF05(void *argument)
2453d8536b4Sopenharmony_ci{
2463d8536b4Sopenharmony_ci    int ret = pthread_detach(pthread_self());
2473d8536b4Sopenharmony_ci    ICUNIT_GOTO_EQUAL(ret, EINVAL, ret, EXIT);
2483d8536b4Sopenharmony_ci
2493d8536b4Sopenharmony_ci    usleep(100000); /* 100000: sleep 100 ms */
2503d8536b4Sopenharmony_ciEXIT:
2513d8536b4Sopenharmony_ci    return NULL;
2523d8536b4Sopenharmony_ci}
2533d8536b4Sopenharmony_ci
2543d8536b4Sopenharmony_ci/**
2553d8536b4Sopenharmony_ci * @tc.number    : SUB_KERNEL_PTHREAD_OPERATION_005
2563d8536b4Sopenharmony_ci * @tc.name      : event operation for deatch
2573d8536b4Sopenharmony_ci * @tc.desc      : [C- SOFTWARE -0200]
2583d8536b4Sopenharmony_ci */
2593d8536b4Sopenharmony_ciLITE_TEST_CASE(PthreadFuncTestSuite, TestPthread005, Function | MediumTest | Level1)
2603d8536b4Sopenharmony_ci{
2613d8536b4Sopenharmony_ci    pthread_attr_t attr;
2623d8536b4Sopenharmony_ci    pthread_t newTh;
2633d8536b4Sopenharmony_ci    struct sched_param schedParam = { 0 };
2643d8536b4Sopenharmony_ci    UINT32 ret;
2653d8536b4Sopenharmony_ci
2663d8536b4Sopenharmony_ci    ret = pthread_attr_init(&attr);
2673d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
2683d8536b4Sopenharmony_ci
2693d8536b4Sopenharmony_ci    ret = pthread_attr_setstacksize(&attr, OS_TSK_TEST_STACK_SIZE);
2703d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
2713d8536b4Sopenharmony_ci
2723d8536b4Sopenharmony_ci    schedParam.sched_priority = TASK_PRIO_TEST - 1;
2733d8536b4Sopenharmony_ci    ret = pthread_attr_setschedparam(&attr, &schedParam);
2743d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
2753d8536b4Sopenharmony_ci
2763d8536b4Sopenharmony_ci    ret = pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
2773d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
2783d8536b4Sopenharmony_ci
2793d8536b4Sopenharmony_ci    ret = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
2803d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
2813d8536b4Sopenharmony_ci
2823d8536b4Sopenharmony_ci    ret = pthread_create(&newTh, &attr, PthreadJoinF05, NULL);
2833d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
2843d8536b4Sopenharmony_ci
2853d8536b4Sopenharmony_ci    ret = pthread_join(newTh, NULL);
2863d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, EINVAL, ret);
2873d8536b4Sopenharmony_ci
2883d8536b4Sopenharmony_ci    return LOS_OK;
2893d8536b4Sopenharmony_ci};
2903d8536b4Sopenharmony_ci
2913d8536b4Sopenharmony_cistatic pthread_cond_t g_pthread_cond;
2923d8536b4Sopenharmony_cistatic pthread_mutex_t g_pthread_mutex;
2933d8536b4Sopenharmony_ci#define TEST_THREAD_COUNT 5
2943d8536b4Sopenharmony_cistatic void *PthreadCondFunc001(void *arg)
2953d8536b4Sopenharmony_ci{
2963d8536b4Sopenharmony_ci    int ret;
2973d8536b4Sopenharmony_ci    struct timespec ts;
2983d8536b4Sopenharmony_ci
2993d8536b4Sopenharmony_ci    g_testCount++;
3003d8536b4Sopenharmony_ci
3013d8536b4Sopenharmony_ci    ret = pthread_mutex_lock(&g_pthread_mutex);
3023d8536b4Sopenharmony_ci    ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT);
3033d8536b4Sopenharmony_ci
3043d8536b4Sopenharmony_ci    clock_gettime(CLOCK_REALTIME, &ts);
3053d8536b4Sopenharmony_ci    ts.tv_sec += 60; /* 60: wait 1 minute */
3063d8536b4Sopenharmony_ci
3073d8536b4Sopenharmony_ci    ret = pthread_cond_timedwait(&g_pthread_cond, &g_pthread_mutex, &ts);
3083d8536b4Sopenharmony_ci    ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT);
3093d8536b4Sopenharmony_ci
3103d8536b4Sopenharmony_ci    ret = pthread_mutex_unlock(&g_pthread_mutex);
3113d8536b4Sopenharmony_ci    ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT);
3123d8536b4Sopenharmony_ci
3133d8536b4Sopenharmony_ci    g_testCount++;
3143d8536b4Sopenharmony_ciEXIT:
3153d8536b4Sopenharmony_ci    return NULL;
3163d8536b4Sopenharmony_ci}
3173d8536b4Sopenharmony_ci
3183d8536b4Sopenharmony_cistatic VOID *PthreadFunc06(void *argument)
3193d8536b4Sopenharmony_ci{
3203d8536b4Sopenharmony_ci    int policy;
3213d8536b4Sopenharmony_ci    int ret;
3223d8536b4Sopenharmony_ci    int i;
3233d8536b4Sopenharmony_ci    pthread_attr_t attr;
3243d8536b4Sopenharmony_ci    struct sched_param schedParam = { 0 };
3253d8536b4Sopenharmony_ci    pthread_t thread[TEST_THREAD_COUNT];
3263d8536b4Sopenharmony_ci
3273d8536b4Sopenharmony_ci    g_testCount = 0;
3283d8536b4Sopenharmony_ci
3293d8536b4Sopenharmony_ci    ret = pthread_attr_init(&attr);
3303d8536b4Sopenharmony_ci    ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT);
3313d8536b4Sopenharmony_ci
3323d8536b4Sopenharmony_ci    ret = pthread_attr_setstacksize(&attr, OS_TSK_TEST_STACK_SIZE);
3333d8536b4Sopenharmony_ci    ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT);
3343d8536b4Sopenharmony_ci
3353d8536b4Sopenharmony_ci    ret = pthread_getschedparam(pthread_self(), &policy, &schedParam);
3363d8536b4Sopenharmony_ci    ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT);
3373d8536b4Sopenharmony_ci
3383d8536b4Sopenharmony_ci    schedParam.sched_priority -= 1;
3393d8536b4Sopenharmony_ci    ret = pthread_attr_setschedparam(&attr, &schedParam);
3403d8536b4Sopenharmony_ci    ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT);
3413d8536b4Sopenharmony_ci
3423d8536b4Sopenharmony_ci    ret = pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
3433d8536b4Sopenharmony_ci    ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT);
3443d8536b4Sopenharmony_ci
3453d8536b4Sopenharmony_ci    for (i = 0; i < TEST_THREAD_COUNT; i++) {
3463d8536b4Sopenharmony_ci        ret = pthread_create(&thread[i], &attr, PthreadCondFunc001, NULL);
3473d8536b4Sopenharmony_ci        ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT);
3483d8536b4Sopenharmony_ci    }
3493d8536b4Sopenharmony_ci
3503d8536b4Sopenharmony_ci    ICUNIT_GOTO_EQUAL(g_testCount, 5, g_testCount, EXIT); /* 5: Five threads */
3513d8536b4Sopenharmony_ci
3523d8536b4Sopenharmony_ci    ret = pthread_mutex_lock(&g_pthread_mutex);
3533d8536b4Sopenharmony_ci    ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT);
3543d8536b4Sopenharmony_ci
3553d8536b4Sopenharmony_ci    ret = pthread_cond_broadcast(&g_pthread_cond);
3563d8536b4Sopenharmony_ci    ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT);
3573d8536b4Sopenharmony_ci
3583d8536b4Sopenharmony_ci    ret = pthread_mutex_unlock(&g_pthread_mutex);
3593d8536b4Sopenharmony_ci    ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT);
3603d8536b4Sopenharmony_ci
3613d8536b4Sopenharmony_ci    ICUNIT_GOTO_EQUAL(g_testCount, 10, g_testCount, EXIT); /* 10: Twice per thread */
3623d8536b4Sopenharmony_ci
3633d8536b4Sopenharmony_ci    for (i = 0; i < TEST_THREAD_COUNT; i++) {
3643d8536b4Sopenharmony_ci        ret = pthread_join(thread[i], NULL);
3653d8536b4Sopenharmony_ci        ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT);
3663d8536b4Sopenharmony_ci    }
3673d8536b4Sopenharmony_ci
3683d8536b4Sopenharmony_ciEXIT:
3693d8536b4Sopenharmony_ci    return NULL;
3703d8536b4Sopenharmony_ci}
3713d8536b4Sopenharmony_ci
3723d8536b4Sopenharmony_ci/**
3733d8536b4Sopenharmony_ci * @tc.number    : SUB_KERNEL_PTHREAD_OPERATION_006
3743d8536b4Sopenharmony_ci * @tc.name      : event operation for deatch
3753d8536b4Sopenharmony_ci * @tc.desc      : [C- SOFTWARE -0200]
3763d8536b4Sopenharmony_ci */
3773d8536b4Sopenharmony_ciLITE_TEST_CASE(PthreadFuncTestSuite, TestPthread006, Function | MediumTest | Level1)
3783d8536b4Sopenharmony_ci{
3793d8536b4Sopenharmony_ci    pthread_attr_t attr;
3803d8536b4Sopenharmony_ci    pthread_t newTh;
3813d8536b4Sopenharmony_ci    struct sched_param schedParam = { 0 };
3823d8536b4Sopenharmony_ci    UINT32 ret;
3833d8536b4Sopenharmony_ci
3843d8536b4Sopenharmony_ci    ret = pthread_mutex_init(&g_pthread_mutex, NULL);
3853d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
3863d8536b4Sopenharmony_ci
3873d8536b4Sopenharmony_ci    ret = pthread_cond_init(&g_pthread_cond, NULL);
3883d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
3893d8536b4Sopenharmony_ci
3903d8536b4Sopenharmony_ci    ret = pthread_attr_init(&attr);
3913d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
3923d8536b4Sopenharmony_ci
3933d8536b4Sopenharmony_ci    ret = pthread_attr_setstacksize(&attr, OS_TSK_TEST_STACK_SIZE);
3943d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
3953d8536b4Sopenharmony_ci
3963d8536b4Sopenharmony_ci    schedParam.sched_priority = TASK_PRIO_TEST - 1;
3973d8536b4Sopenharmony_ci    ret = pthread_attr_setschedparam(&attr, &schedParam);
3983d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
3993d8536b4Sopenharmony_ci
4003d8536b4Sopenharmony_ci    ret = pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
4013d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
4023d8536b4Sopenharmony_ci
4033d8536b4Sopenharmony_ci    ret = pthread_create(&newTh, &attr, PthreadFunc06, NULL);
4043d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
4053d8536b4Sopenharmony_ci
4063d8536b4Sopenharmony_ci    ret = pthread_join(newTh, NULL);
4073d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
4083d8536b4Sopenharmony_ci
4093d8536b4Sopenharmony_ci    return LOS_OK;
4103d8536b4Sopenharmony_ci};
4113d8536b4Sopenharmony_ci
4123d8536b4Sopenharmony_cistatic void *PthreadCondFunc002(void *arg)
4133d8536b4Sopenharmony_ci{
4143d8536b4Sopenharmony_ci    int ret;
4153d8536b4Sopenharmony_ci    struct timespec ts;
4163d8536b4Sopenharmony_ci    g_testCount++;
4173d8536b4Sopenharmony_ci
4183d8536b4Sopenharmony_ci    ret = pthread_mutex_lock(&g_pthread_mutex);
4193d8536b4Sopenharmony_ci    ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT);
4203d8536b4Sopenharmony_ci
4213d8536b4Sopenharmony_ci    clock_gettime(CLOCK_REALTIME, &ts);
4223d8536b4Sopenharmony_ci    ts.tv_sec += 1; /* 1: wait 1 s */
4233d8536b4Sopenharmony_ci
4243d8536b4Sopenharmony_ci    ret = pthread_cond_timedwait(&g_pthread_cond, &g_pthread_mutex, &ts);
4253d8536b4Sopenharmony_ci    ICUNIT_GOTO_EQUAL(ret, ETIMEDOUT, ret, EXIT);
4263d8536b4Sopenharmony_ci
4273d8536b4Sopenharmony_ci    ret = pthread_mutex_unlock(&g_pthread_mutex);
4283d8536b4Sopenharmony_ci    ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT);
4293d8536b4Sopenharmony_ci
4303d8536b4Sopenharmony_ci    g_testCount++;
4313d8536b4Sopenharmony_ci
4323d8536b4Sopenharmony_ciEXIT:
4333d8536b4Sopenharmony_ci    return NULL;
4343d8536b4Sopenharmony_ci}
4353d8536b4Sopenharmony_ci
4363d8536b4Sopenharmony_cistatic VOID *PthreadFunc07(void *argument)
4373d8536b4Sopenharmony_ci{
4383d8536b4Sopenharmony_ci    int policy;
4393d8536b4Sopenharmony_ci    int ret;
4403d8536b4Sopenharmony_ci    int i;
4413d8536b4Sopenharmony_ci    pthread_attr_t attr;
4423d8536b4Sopenharmony_ci    struct sched_param schedParam = { 0 };
4433d8536b4Sopenharmony_ci    pthread_t thread[TEST_THREAD_COUNT];
4443d8536b4Sopenharmony_ci
4453d8536b4Sopenharmony_ci    g_testCount = 0;
4463d8536b4Sopenharmony_ci
4473d8536b4Sopenharmony_ci    ret = pthread_mutex_init(&g_pthread_mutex, NULL);
4483d8536b4Sopenharmony_ci    ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT);
4493d8536b4Sopenharmony_ci
4503d8536b4Sopenharmony_ci    ret = pthread_attr_init(&attr);
4513d8536b4Sopenharmony_ci    ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT);
4523d8536b4Sopenharmony_ci
4533d8536b4Sopenharmony_ci    ret = pthread_attr_setstacksize(&attr, OS_TSK_TEST_STACK_SIZE);
4543d8536b4Sopenharmony_ci    ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT);
4553d8536b4Sopenharmony_ci
4563d8536b4Sopenharmony_ci    ret = pthread_getschedparam(pthread_self(), &policy, &schedParam);
4573d8536b4Sopenharmony_ci    ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT);
4583d8536b4Sopenharmony_ci
4593d8536b4Sopenharmony_ci    schedParam.sched_priority -= 1;
4603d8536b4Sopenharmony_ci    ret = pthread_attr_setschedparam(&attr, &schedParam);
4613d8536b4Sopenharmony_ci    ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT);
4623d8536b4Sopenharmony_ci
4633d8536b4Sopenharmony_ci    ret = pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
4643d8536b4Sopenharmony_ci    ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT);
4653d8536b4Sopenharmony_ci
4663d8536b4Sopenharmony_ci    for (i = 0; i < TEST_THREAD_COUNT; i++) {
4673d8536b4Sopenharmony_ci        ret = pthread_create(&thread[i], &attr, PthreadCondFunc002, NULL);
4683d8536b4Sopenharmony_ci        ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT);
4693d8536b4Sopenharmony_ci    }
4703d8536b4Sopenharmony_ci
4713d8536b4Sopenharmony_ci    ICUNIT_GOTO_EQUAL(g_testCount, 5, g_testCount, EXIT); /* 5: Five threads */
4723d8536b4Sopenharmony_ci
4733d8536b4Sopenharmony_ci    for (i = 0; i < TEST_THREAD_COUNT; i++) {
4743d8536b4Sopenharmony_ci        ret = pthread_join(thread[i], NULL);
4753d8536b4Sopenharmony_ci        ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT);
4763d8536b4Sopenharmony_ci    }
4773d8536b4Sopenharmony_ci
4783d8536b4Sopenharmony_ci    ICUNIT_GOTO_EQUAL(g_testCount, 10, g_testCount, EXIT); /* 10: Twice per thread */
4793d8536b4Sopenharmony_ci
4803d8536b4Sopenharmony_ciEXIT:
4813d8536b4Sopenharmony_ci    return NULL;
4823d8536b4Sopenharmony_ci}
4833d8536b4Sopenharmony_ci
4843d8536b4Sopenharmony_ci/**
4853d8536b4Sopenharmony_ci * @tc.number    : SUB_KERNEL_PTHREAD_OPERATION_007
4863d8536b4Sopenharmony_ci * @tc.name      : event operation for deatch
4873d8536b4Sopenharmony_ci * @tc.desc      : [C- SOFTWARE -0200]
4883d8536b4Sopenharmony_ci */
4893d8536b4Sopenharmony_ciLITE_TEST_CASE(PthreadFuncTestSuite, TestPthread007, Function | MediumTest | Level1)
4903d8536b4Sopenharmony_ci{
4913d8536b4Sopenharmony_ci    pthread_attr_t attr;
4923d8536b4Sopenharmony_ci    pthread_t newTh;
4933d8536b4Sopenharmony_ci    struct sched_param schedParam = { 0 };
4943d8536b4Sopenharmony_ci    UINT32 ret;
4953d8536b4Sopenharmony_ci
4963d8536b4Sopenharmony_ci    ret = pthread_cond_init(&g_pthread_cond, NULL);
4973d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
4983d8536b4Sopenharmony_ci
4993d8536b4Sopenharmony_ci    ret = pthread_attr_init(&attr);
5003d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
5013d8536b4Sopenharmony_ci
5023d8536b4Sopenharmony_ci    ret = pthread_attr_setstacksize(&attr, OS_TSK_TEST_STACK_SIZE);
5033d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
5043d8536b4Sopenharmony_ci
5053d8536b4Sopenharmony_ci    schedParam.sched_priority = TASK_PRIO_TEST - 1;
5063d8536b4Sopenharmony_ci    ret = pthread_attr_setschedparam(&attr, &schedParam);
5073d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
5083d8536b4Sopenharmony_ci
5093d8536b4Sopenharmony_ci    ret = pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
5103d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
5113d8536b4Sopenharmony_ci
5123d8536b4Sopenharmony_ci    ret = pthread_create(&newTh, &attr, PthreadFunc07, NULL);
5133d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
5143d8536b4Sopenharmony_ci
5153d8536b4Sopenharmony_ci    ret = pthread_join(newTh, NULL);
5163d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
5173d8536b4Sopenharmony_ci
5183d8536b4Sopenharmony_ci    return LOS_OK;
5193d8536b4Sopenharmony_ci};
5203d8536b4Sopenharmony_ci
5213d8536b4Sopenharmony_cistatic int g_pthreadKey1;
5223d8536b4Sopenharmony_cistatic int g_pthreadKey2;
5233d8536b4Sopenharmony_cistatic void pthreadKeyFree(void *data)
5243d8536b4Sopenharmony_ci{
5253d8536b4Sopenharmony_ci    if (data != NULL) {
5263d8536b4Sopenharmony_ci        free(data);
5273d8536b4Sopenharmony_ci    }
5283d8536b4Sopenharmony_ci}
5293d8536b4Sopenharmony_ci
5303d8536b4Sopenharmony_cistatic void *PthreadFunc08(void *arg)
5313d8536b4Sopenharmony_ci{
5323d8536b4Sopenharmony_ci#define TEST_KEY_SIZE 0x100
5333d8536b4Sopenharmony_ci    int *data = (int *)malloc(TEST_KEY_SIZE);
5343d8536b4Sopenharmony_ci    if (data == NULL) {
5353d8536b4Sopenharmony_ci        return (void *)ENOMEM;
5363d8536b4Sopenharmony_ci    }
5373d8536b4Sopenharmony_ci
5383d8536b4Sopenharmony_ci    (void)memset_s(data, TEST_KEY_SIZE, 0, TEST_KEY_SIZE);
5393d8536b4Sopenharmony_ci    *data = 100 + (int)pthread_self(); /* 100: test data */
5403d8536b4Sopenharmony_ci    int ret = pthread_setspecific(g_pthreadKey1, (void *)data);
5413d8536b4Sopenharmony_ci    if (ret != 0) {
5423d8536b4Sopenharmony_ci        return (void *)ret;
5433d8536b4Sopenharmony_ci    }
5443d8536b4Sopenharmony_ci
5453d8536b4Sopenharmony_ci    data = (int *)malloc(TEST_KEY_SIZE);
5463d8536b4Sopenharmony_ci    if (data == NULL) {
5473d8536b4Sopenharmony_ci        return (void *)ENOMEM;
5483d8536b4Sopenharmony_ci    }
5493d8536b4Sopenharmony_ci
5503d8536b4Sopenharmony_ci    (void)memset_s(data, TEST_KEY_SIZE, 0, TEST_KEY_SIZE);
5513d8536b4Sopenharmony_ci    *data = 200 + (int)pthread_self(); /* 200: test data */
5523d8536b4Sopenharmony_ci    ret = pthread_setspecific(g_pthreadKey2, (void *)data);
5533d8536b4Sopenharmony_ci    if (ret != 0) {
5543d8536b4Sopenharmony_ci        return (void *)ret;
5553d8536b4Sopenharmony_ci    }
5563d8536b4Sopenharmony_ci
5573d8536b4Sopenharmony_ci    int *result = (int *)pthread_getspecific(g_pthreadKey1);
5583d8536b4Sopenharmony_ci    if (result == NULL) {
5593d8536b4Sopenharmony_ci        return (void *)EINVAL;
5603d8536b4Sopenharmony_ci    }
5613d8536b4Sopenharmony_ci
5623d8536b4Sopenharmony_ci    if (*result != (100 + (int)pthread_self())) { /* 100: test data */
5633d8536b4Sopenharmony_ci        return (void *)EDEADLK;
5643d8536b4Sopenharmony_ci    }
5653d8536b4Sopenharmony_ci
5663d8536b4Sopenharmony_ci    result = (int *)pthread_getspecific(g_pthreadKey2);
5673d8536b4Sopenharmony_ci    if (result == NULL) {
5683d8536b4Sopenharmony_ci        return (void *)EINVAL;
5693d8536b4Sopenharmony_ci    }
5703d8536b4Sopenharmony_ci
5713d8536b4Sopenharmony_ci    if (*result != (200 + (int)pthread_self())) { /* 200: test data */
5723d8536b4Sopenharmony_ci        return (void *)EDEADLK;
5733d8536b4Sopenharmony_ci    }
5743d8536b4Sopenharmony_ci
5753d8536b4Sopenharmony_ci    return NULL;
5763d8536b4Sopenharmony_ci}
5773d8536b4Sopenharmony_ci
5783d8536b4Sopenharmony_ci/**
5793d8536b4Sopenharmony_ci * @tc.number    : SUB_KERNEL_PTHREAD_OPERATION_008
5803d8536b4Sopenharmony_ci * @tc.name      : event operation for deatch
5813d8536b4Sopenharmony_ci * @tc.desc      : [C- SOFTWARE -0200]
5823d8536b4Sopenharmony_ci */
5833d8536b4Sopenharmony_ciLITE_TEST_CASE(PthreadFuncTestSuite, TestPthread008, Function | MediumTest | Level1)
5843d8536b4Sopenharmony_ci{
5853d8536b4Sopenharmony_ci    pthread_attr_t attr;
5863d8536b4Sopenharmony_ci    pthread_t newTh1, newTh2;
5873d8536b4Sopenharmony_ci    struct sched_param schedParam = { 0 };
5883d8536b4Sopenharmony_ci    int result = 0;
5893d8536b4Sopenharmony_ci    UINT32 ret;
5903d8536b4Sopenharmony_ci
5913d8536b4Sopenharmony_ci    ret = pthread_key_create((pthread_key_t *)&g_pthreadKey1, pthreadKeyFree);
5923d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
5933d8536b4Sopenharmony_ci
5943d8536b4Sopenharmony_ci    ret = pthread_key_create((pthread_key_t *)&g_pthreadKey2, pthreadKeyFree);
5953d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
5963d8536b4Sopenharmony_ci
5973d8536b4Sopenharmony_ci    ret = pthread_attr_init(&attr);
5983d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
5993d8536b4Sopenharmony_ci
6003d8536b4Sopenharmony_ci    ret = pthread_attr_setstacksize(&attr, OS_TSK_TEST_STACK_SIZE);
6013d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
6023d8536b4Sopenharmony_ci
6033d8536b4Sopenharmony_ci    schedParam.sched_priority = TASK_PRIO_TEST - 1;
6043d8536b4Sopenharmony_ci    ret = pthread_attr_setschedparam(&attr, &schedParam);
6053d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
6063d8536b4Sopenharmony_ci
6073d8536b4Sopenharmony_ci    ret = pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
6083d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
6093d8536b4Sopenharmony_ci
6103d8536b4Sopenharmony_ci    ret = pthread_create(&newTh1, &attr, PthreadFunc08, NULL);
6113d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
6123d8536b4Sopenharmony_ci
6133d8536b4Sopenharmony_ci    ret = pthread_create(&newTh2, &attr, PthreadFunc08, NULL);
6143d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
6153d8536b4Sopenharmony_ci
6163d8536b4Sopenharmony_ci    ret = pthread_join(newTh1, (void **)&result);
6173d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
6183d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(result, 0, result);
6193d8536b4Sopenharmony_ci
6203d8536b4Sopenharmony_ci    ret = pthread_join(newTh2, (void **)&result);
6213d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
6223d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(result, 0, result);
6233d8536b4Sopenharmony_ci
6243d8536b4Sopenharmony_ci    ret = pthread_key_delete(g_pthreadKey1);
6253d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
6263d8536b4Sopenharmony_ci
6273d8536b4Sopenharmony_ci    ret = pthread_key_delete(g_pthreadKey2);
6283d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
6293d8536b4Sopenharmony_ci    return LOS_OK;
6303d8536b4Sopenharmony_ci};
6313d8536b4Sopenharmony_ci
6323d8536b4Sopenharmony_cistatic VOID *PthreadPrioFunc01(void *argument)
6333d8536b4Sopenharmony_ci{
6343d8536b4Sopenharmony_ci    g_testCount++;
6353d8536b4Sopenharmony_ci    ICUNIT_TRACK_EQUAL(g_testCount, (UINT32)argument, g_testCount);
6363d8536b4Sopenharmony_ci    return NULL;
6373d8536b4Sopenharmony_ci}
6383d8536b4Sopenharmony_ci
6393d8536b4Sopenharmony_ci/**
6403d8536b4Sopenharmony_ci * @tc.number    : SUB_KERNEL_PTHREAD_OPERATION_009
6413d8536b4Sopenharmony_ci * @tc.name      : event operation for set priority
6423d8536b4Sopenharmony_ci * @tc.desc      : [C- SOFTWARE -0200]
6433d8536b4Sopenharmony_ci */
6443d8536b4Sopenharmony_ciLITE_TEST_CASE(PthreadFuncTestSuite, TestPthread009, Function | MediumTest | Level1)
6453d8536b4Sopenharmony_ci{
6463d8536b4Sopenharmony_ci    pthread_attr_t attr;
6473d8536b4Sopenharmony_ci    pthread_t thread[TEST_THREAD_COUNT];
6483d8536b4Sopenharmony_ci    struct sched_param schedParam = { 0 };
6493d8536b4Sopenharmony_ci    UINT32 ret;
6503d8536b4Sopenharmony_ci    UINT32 i = 0;
6513d8536b4Sopenharmony_ci    g_testCount = 0;
6523d8536b4Sopenharmony_ci    ret = pthread_attr_init(&attr);
6533d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
6543d8536b4Sopenharmony_ci
6553d8536b4Sopenharmony_ci    ret = pthread_attr_setstacksize(&attr, OS_TSK_TEST_STACK_SIZE);
6563d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
6573d8536b4Sopenharmony_ci
6583d8536b4Sopenharmony_ci    schedParam.sched_priority = TASK_PRIO_TEST + 1;
6593d8536b4Sopenharmony_ci    ret = pthread_attr_setschedparam(&attr, &schedParam);
6603d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
6613d8536b4Sopenharmony_ci
6623d8536b4Sopenharmony_ci    ret = pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
6633d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
6643d8536b4Sopenharmony_ci
6653d8536b4Sopenharmony_ci    for (i = 0; i < TEST_THREAD_COUNT; i++) {
6663d8536b4Sopenharmony_ci        ret = pthread_create(&thread[i], &attr, PthreadPrioFunc01, (void *)(TEST_THREAD_COUNT - i));
6673d8536b4Sopenharmony_ci        ICUNIT_ASSERT_EQUAL(ret, 0, ret);
6683d8536b4Sopenharmony_ci    }
6693d8536b4Sopenharmony_ci
6703d8536b4Sopenharmony_ci    for (i = 0; i < TEST_THREAD_COUNT; i++) {
6713d8536b4Sopenharmony_ci        ret = pthread_setschedprio(thread[i], TASK_PRIO_TEST + TEST_THREAD_COUNT - i);
6723d8536b4Sopenharmony_ci        ICUNIT_ASSERT_EQUAL(ret, 0, ret);
6733d8536b4Sopenharmony_ci    }
6743d8536b4Sopenharmony_ci
6753d8536b4Sopenharmony_ci    for (i = 0; i < TEST_THREAD_COUNT; i++) {
6763d8536b4Sopenharmony_ci        ret = pthread_join(thread[i], NULL);
6773d8536b4Sopenharmony_ci        ICUNIT_ASSERT_EQUAL(ret, 0, ret);
6783d8536b4Sopenharmony_ci    }
6793d8536b4Sopenharmony_ci
6803d8536b4Sopenharmony_ci    return LOS_OK;
6813d8536b4Sopenharmony_ci};
6823d8536b4Sopenharmony_ci
6833d8536b4Sopenharmony_cistatic VOID PthreadOnceFunc01(void)
6843d8536b4Sopenharmony_ci{
6853d8536b4Sopenharmony_ci    g_testCount++;
6863d8536b4Sopenharmony_ci    ICUNIT_TRACK_EQUAL(g_testCount, 1, g_testCount);
6873d8536b4Sopenharmony_ci    return;
6883d8536b4Sopenharmony_ci}
6893d8536b4Sopenharmony_ci
6903d8536b4Sopenharmony_ci/**
6913d8536b4Sopenharmony_ci * @tc.number    : SUB_KERNEL_PTHREAD_OPERATION_010
6923d8536b4Sopenharmony_ci * @tc.name      : event operation for pthread_once
6933d8536b4Sopenharmony_ci * @tc.desc      : [C- SOFTWARE -0200]
6943d8536b4Sopenharmony_ci */
6953d8536b4Sopenharmony_ciLITE_TEST_CASE(PthreadFuncTestSuite, TestPthread010, Function | MediumTest | Level1)
6963d8536b4Sopenharmony_ci{
6973d8536b4Sopenharmony_ci    pthread_attr_t attr;
6983d8536b4Sopenharmony_ci    struct sched_param schedParam = { 0 };
6993d8536b4Sopenharmony_ci    UINT32 ret;
7003d8536b4Sopenharmony_ci    UINT32 i = 0;
7013d8536b4Sopenharmony_ci    pthread_once_t onceControl = 0;
7023d8536b4Sopenharmony_ci    g_testCount = 0;
7033d8536b4Sopenharmony_ci    ret = pthread_attr_init(&attr);
7043d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
7053d8536b4Sopenharmony_ci
7063d8536b4Sopenharmony_ci    ret = pthread_attr_setstacksize(&attr, OS_TSK_TEST_STACK_SIZE);
7073d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
7083d8536b4Sopenharmony_ci
7093d8536b4Sopenharmony_ci    schedParam.sched_priority = TASK_PRIO_TEST + 1;
7103d8536b4Sopenharmony_ci    ret = pthread_attr_setschedparam(&attr, &schedParam);
7113d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
7123d8536b4Sopenharmony_ci
7133d8536b4Sopenharmony_ci    ret = pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
7143d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
7153d8536b4Sopenharmony_ci
7163d8536b4Sopenharmony_ci    for (i = 0; i < TEST_THREAD_COUNT; i++) {
7173d8536b4Sopenharmony_ci        ret = pthread_once(&onceControl, PthreadOnceFunc01);
7183d8536b4Sopenharmony_ci        ICUNIT_ASSERT_EQUAL(ret, 0, ret);
7193d8536b4Sopenharmony_ci    }
7203d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(g_testCount, 1, g_testCount);
7213d8536b4Sopenharmony_ci
7223d8536b4Sopenharmony_ci    return LOS_OK;
7233d8536b4Sopenharmony_ci};
7243d8536b4Sopenharmony_ci
7253d8536b4Sopenharmony_cistatic VOID *PthreadCancelFunc01(void *argument)
7263d8536b4Sopenharmony_ci{
7273d8536b4Sopenharmony_ci    pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
7283d8536b4Sopenharmony_ci    pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
7293d8536b4Sopenharmony_ci    while (1) {
7303d8536b4Sopenharmony_ci        g_testCount++;
7313d8536b4Sopenharmony_ci        ICUNIT_GOTO_EQUAL(g_testCount, 1, g_testCount, EXIT);
7323d8536b4Sopenharmony_ci        LOS_TaskDelay(PTHREAD_TASK_DELAY);
7333d8536b4Sopenharmony_ci    }
7343d8536b4Sopenharmony_ci
7353d8536b4Sopenharmony_ciEXIT:
7363d8536b4Sopenharmony_ci    return NULL;
7373d8536b4Sopenharmony_ci}
7383d8536b4Sopenharmony_ci
7393d8536b4Sopenharmony_ci/**
7403d8536b4Sopenharmony_ci * @tc.number    : SUB_KERNEL_PTHREAD_OPERATION_011
7413d8536b4Sopenharmony_ci * @tc.name      : event operation for pthread_cancel
7423d8536b4Sopenharmony_ci * @tc.desc      : [C- SOFTWARE -0200]
7433d8536b4Sopenharmony_ci */
7443d8536b4Sopenharmony_ciLITE_TEST_CASE(PthreadFuncTestSuite, TestPthread011, Function | MediumTest | Level1)
7453d8536b4Sopenharmony_ci{
7463d8536b4Sopenharmony_ci    pthread_attr_t attr;
7473d8536b4Sopenharmony_ci    pthread_t thread;
7483d8536b4Sopenharmony_ci    struct sched_param schedParam = { 0 };
7493d8536b4Sopenharmony_ci    UINT32 ret;
7503d8536b4Sopenharmony_ci    g_testCount = 0;
7513d8536b4Sopenharmony_ci    ret = pthread_attr_init(&attr);
7523d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
7533d8536b4Sopenharmony_ci
7543d8536b4Sopenharmony_ci    ret = pthread_attr_setstacksize(&attr, OS_TSK_TEST_STACK_SIZE);
7553d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
7563d8536b4Sopenharmony_ci
7573d8536b4Sopenharmony_ci    schedParam.sched_priority = TASK_PRIO_TEST - 1;
7583d8536b4Sopenharmony_ci    ret = pthread_attr_setschedparam(&attr, &schedParam);
7593d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
7603d8536b4Sopenharmony_ci
7613d8536b4Sopenharmony_ci    ret = pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
7623d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
7633d8536b4Sopenharmony_ci
7643d8536b4Sopenharmony_ci    ret = pthread_create(&thread, &attr, PthreadCancelFunc01, NULL);
7653d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
7663d8536b4Sopenharmony_ci
7673d8536b4Sopenharmony_ci    ret = pthread_cancel(thread);
7683d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
7693d8536b4Sopenharmony_ci
7703d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(g_testCount, 1, g_testCount);
7713d8536b4Sopenharmony_ci
7723d8536b4Sopenharmony_ci    return LOS_OK;
7733d8536b4Sopenharmony_ci};
7743d8536b4Sopenharmony_ci
7753d8536b4Sopenharmony_cistatic VOID *PthreadTestcancelFunc01(void *argument)
7763d8536b4Sopenharmony_ci{
7773d8536b4Sopenharmony_ci    INT32 ret = 0;
7783d8536b4Sopenharmony_ci
7793d8536b4Sopenharmony_ci    ret = pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
7803d8536b4Sopenharmony_ci    ICUNIT_TRACK_EQUAL(ret, 0, ret);
7813d8536b4Sopenharmony_ci
7823d8536b4Sopenharmony_ci    ret = pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
7833d8536b4Sopenharmony_ci    ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT);
7843d8536b4Sopenharmony_ci
7853d8536b4Sopenharmony_ci    g_testCount = 1;
7863d8536b4Sopenharmony_ci    g_pthreadSem = 1;
7873d8536b4Sopenharmony_ci    while (g_pthreadSem == 1) {
7883d8536b4Sopenharmony_ci        LOS_TaskDelay(PTHREAD_TASK_DELAY);
7893d8536b4Sopenharmony_ci    }
7903d8536b4Sopenharmony_ci
7913d8536b4Sopenharmony_ci    LOS_TaskDelay(PTHREAD_TASK_DELAY);
7923d8536b4Sopenharmony_ci    pthread_testcancel();
7933d8536b4Sopenharmony_ci    g_testCount = -1;
7943d8536b4Sopenharmony_ci
7953d8536b4Sopenharmony_ciEXIT:
7963d8536b4Sopenharmony_ci    return NULL;
7973d8536b4Sopenharmony_ci}
7983d8536b4Sopenharmony_ci
7993d8536b4Sopenharmony_ci/**
8003d8536b4Sopenharmony_ci * @tc.number    : SUB_KERNEL_PTHREAD_OPERATION_012
8013d8536b4Sopenharmony_ci * @tc.name      : event operation for testcancel
8023d8536b4Sopenharmony_ci * @tc.desc      : [C- SOFTWARE -0200]
8033d8536b4Sopenharmony_ci */
8043d8536b4Sopenharmony_ciLITE_TEST_CASE(PthreadFuncTestSuite, TestPthread012, Function | MediumTest | Level1)
8053d8536b4Sopenharmony_ci{
8063d8536b4Sopenharmony_ci    pthread_attr_t attr;
8073d8536b4Sopenharmony_ci    pthread_t thread;
8083d8536b4Sopenharmony_ci    struct sched_param schedParam = { 0 };
8093d8536b4Sopenharmony_ci    UINT32 ret;
8103d8536b4Sopenharmony_ci
8113d8536b4Sopenharmony_ci    g_testCount = 0;
8123d8536b4Sopenharmony_ci    g_pthreadSem = 0;
8133d8536b4Sopenharmony_ci
8143d8536b4Sopenharmony_ci    ret = pthread_attr_init(&attr);
8153d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
8163d8536b4Sopenharmony_ci
8173d8536b4Sopenharmony_ci    ret = pthread_attr_setstacksize(&attr, OS_TSK_TEST_STACK_SIZE);
8183d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
8193d8536b4Sopenharmony_ci
8203d8536b4Sopenharmony_ci    schedParam.sched_priority = TASK_PRIO_TEST - 1;
8213d8536b4Sopenharmony_ci    ret = pthread_attr_setschedparam(&attr, &schedParam);
8223d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
8233d8536b4Sopenharmony_ci
8243d8536b4Sopenharmony_ci    ret = pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
8253d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
8263d8536b4Sopenharmony_ci
8273d8536b4Sopenharmony_ci    ret = pthread_create(&thread, &attr, PthreadTestcancelFunc01, NULL);
8283d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
8293d8536b4Sopenharmony_ci
8303d8536b4Sopenharmony_ci    while (g_pthreadSem == 0) {
8313d8536b4Sopenharmony_ci        LOS_TaskDelay(PTHREAD_TASK_DELAY);
8323d8536b4Sopenharmony_ci    }
8333d8536b4Sopenharmony_ci
8343d8536b4Sopenharmony_ci    ret = pthread_cancel(thread);
8353d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
8363d8536b4Sopenharmony_ci
8373d8536b4Sopenharmony_ci    g_pthreadSem = 0;
8383d8536b4Sopenharmony_ci
8393d8536b4Sopenharmony_ci    ret = pthread_join(thread, NULL);
8403d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
8413d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(g_testCount, 1, g_testCount);
8423d8536b4Sopenharmony_ci
8433d8536b4Sopenharmony_ci    return LOS_OK;
8443d8536b4Sopenharmony_ci};
8453d8536b4Sopenharmony_ci
8463d8536b4Sopenharmony_ci/**
8473d8536b4Sopenharmony_ci * @tc.number    : SUB_KERNEL_PTHREAD_OPERATION_013
8483d8536b4Sopenharmony_ci * @tc.name      : event operation for set/get clock
8493d8536b4Sopenharmony_ci * @tc.desc      : [C- SOFTWARE -0200]
8503d8536b4Sopenharmony_ci */
8513d8536b4Sopenharmony_ciLITE_TEST_CASE(PthreadFuncTestSuite, TestPthread013, Function | MediumTest | Level1)
8523d8536b4Sopenharmony_ci{
8533d8536b4Sopenharmony_ci    INT32 ret;
8543d8536b4Sopenharmony_ci    clockid_t clk;
8553d8536b4Sopenharmony_ci    const int invalidClock = -100;
8563d8536b4Sopenharmony_ci    pthread_condattr_t condattr;
8573d8536b4Sopenharmony_ci    ret = pthread_condattr_init(&condattr);
8583d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
8593d8536b4Sopenharmony_ci
8603d8536b4Sopenharmony_ci    ret = pthread_condattr_getclock(&condattr, &clk);
8613d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
8623d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(clk, CLOCK_REALTIME, clk);
8633d8536b4Sopenharmony_ci
8643d8536b4Sopenharmony_ci    ret = pthread_condattr_setclock(&condattr, CLOCK_REALTIME);
8653d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
8663d8536b4Sopenharmony_ci    ret = pthread_condattr_getclock(&condattr, &clk);
8673d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
8683d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(clk, CLOCK_REALTIME, clk);
8693d8536b4Sopenharmony_ci
8703d8536b4Sopenharmony_ci    struct timespec ts = {0};
8713d8536b4Sopenharmony_ci    ret = clock_getres(CLOCK_MONOTONIC, &ts);
8723d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
8733d8536b4Sopenharmony_ci    ret = pthread_condattr_setclock(&condattr, CLOCK_MONOTONIC);
8743d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
8753d8536b4Sopenharmony_ci    ret = pthread_condattr_getclock(&condattr, &clk);
8763d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
8773d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(clk, CLOCK_MONOTONIC, clk);
8783d8536b4Sopenharmony_ci
8793d8536b4Sopenharmony_ci    ret = pthread_condattr_setclock(&condattr, invalidClock);
8803d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, EINVAL, ret);
8813d8536b4Sopenharmony_ci
8823d8536b4Sopenharmony_ci    return 0;
8833d8536b4Sopenharmony_ci}
8843d8536b4Sopenharmony_ci
8853d8536b4Sopenharmony_ci/**
8863d8536b4Sopenharmony_ci * @tc.number    : SUB_KERNEL_PTHREAD_OPERATION_014
8873d8536b4Sopenharmony_ci * @tc.name      : event operation for setpshared
8883d8536b4Sopenharmony_ci * @tc.desc      : [C- SOFTWARE -0200]
8893d8536b4Sopenharmony_ci */
8903d8536b4Sopenharmony_ciLITE_TEST_CASE(PthreadFuncTestSuite, TestPthread014, Function | MediumTest | Level1)
8913d8536b4Sopenharmony_ci{
8923d8536b4Sopenharmony_ci    INT32 ret;
8933d8536b4Sopenharmony_ci    pthread_condattr_t attr;
8943d8536b4Sopenharmony_ci
8953d8536b4Sopenharmony_ci    /* Initialize a cond attributes object */
8963d8536b4Sopenharmony_ci    ret = pthread_condattr_init(&attr);
8973d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
8983d8536b4Sopenharmony_ci
8993d8536b4Sopenharmony_ci    ret = pthread_condattr_setpshared(&attr, (-100)); /* -100: Set 'pshared' to INVALID_PSHARED_VALUE. */
9003d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, EINVAL, ret);
9013d8536b4Sopenharmony_ci
9023d8536b4Sopenharmony_ci    /* Destroy the cond attributes object */
9033d8536b4Sopenharmony_ci    ret = pthread_condattr_destroy(&attr);
9043d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
9053d8536b4Sopenharmony_ci
9063d8536b4Sopenharmony_ci    return 0;
9073d8536b4Sopenharmony_ci}
9083d8536b4Sopenharmony_ci
9093d8536b4Sopenharmony_ci/**
9103d8536b4Sopenharmony_ci * @tc.number    : SUB_KERNEL_PTHREAD_OPERATION_015
9113d8536b4Sopenharmony_ci * @tc.name      : event operation for getpshared
9123d8536b4Sopenharmony_ci * @tc.desc      : [C- SOFTWARE -0200]
9133d8536b4Sopenharmony_ci */
9143d8536b4Sopenharmony_ciLITE_TEST_CASE(PthreadFuncTestSuite, TestPthread015, Function | MediumTest | Level1)
9153d8536b4Sopenharmony_ci{
9163d8536b4Sopenharmony_ci    INT32 ret;
9173d8536b4Sopenharmony_ci    INT32 pshared;
9183d8536b4Sopenharmony_ci    pthread_condattr_t attr;
9193d8536b4Sopenharmony_ci
9203d8536b4Sopenharmony_ci    /* Initialize a cond attributes object */
9213d8536b4Sopenharmony_ci    ret = pthread_condattr_init(&attr);
9223d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
9233d8536b4Sopenharmony_ci
9243d8536b4Sopenharmony_ci    /* Set 'pshared' to INVALID_PSHARED_VALUE. */
9253d8536b4Sopenharmony_ci    ret = pthread_condattr_getpshared(&attr, &pshared);
9263d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
9273d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(pshared, PTHREAD_PROCESS_PRIVATE, pshared);
9283d8536b4Sopenharmony_ci
9293d8536b4Sopenharmony_ci    /* Destroy the cond attributes object */
9303d8536b4Sopenharmony_ci    ret = pthread_condattr_destroy(&attr);
9313d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
9323d8536b4Sopenharmony_ci
9333d8536b4Sopenharmony_ci    return 0;
9343d8536b4Sopenharmony_ci}
9353d8536b4Sopenharmony_ci
9363d8536b4Sopenharmony_ci/**
9373d8536b4Sopenharmony_ci * @tc.number    : SUB_KERNEL_PTHREAD_OPERATION_016
9383d8536b4Sopenharmony_ci * @tc.name      : event operation for get/set mutex attr
9393d8536b4Sopenharmony_ci * @tc.desc      : [C- SOFTWARE -0200]
9403d8536b4Sopenharmony_ci */
9413d8536b4Sopenharmony_ciLITE_TEST_CASE(PthreadFuncTestSuite, TestPthread016, Function | MediumTest | Level1)
9423d8536b4Sopenharmony_ci{
9433d8536b4Sopenharmony_ci    pthread_mutexattr_t mutexAttr;
9443d8536b4Sopenharmony_ci    int mutexType;
9453d8536b4Sopenharmony_ci    int ret;
9463d8536b4Sopenharmony_ci    pthread_mutexattr_init(&mutexAttr);
9473d8536b4Sopenharmony_ci    ret = pthread_mutexattr_settype(NULL, PTHREAD_MUTEX_ERRORCHECK);
9483d8536b4Sopenharmony_ci    ICUNIT_ASSERT_NOT_EQUAL(ret, 0, ret);
9493d8536b4Sopenharmony_ci
9503d8536b4Sopenharmony_ci    ret = pthread_mutexattr_settype(&mutexAttr, PTHREAD_MUTEX_ERRORCHECK);
9513d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
9523d8536b4Sopenharmony_ci    ret = pthread_mutexattr_gettype(&mutexAttr, &mutexType);
9533d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
9543d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(mutexType, PTHREAD_MUTEX_ERRORCHECK, mutexType);
9553d8536b4Sopenharmony_ci
9563d8536b4Sopenharmony_ci    ret = pthread_mutexattr_gettype(NULL, &mutexType);
9573d8536b4Sopenharmony_ci    ICUNIT_ASSERT_NOT_EQUAL(ret, 0, ret);
9583d8536b4Sopenharmony_ci
9593d8536b4Sopenharmony_ci    mutexAttr.type = 3; /* 3: Invalid type */
9603d8536b4Sopenharmony_ci    ret = pthread_mutexattr_gettype(&mutexAttr, &mutexType);
9613d8536b4Sopenharmony_ci    ICUNIT_ASSERT_NOT_EQUAL(ret, 0, ret);
9623d8536b4Sopenharmony_ci    return LOS_OK;
9633d8536b4Sopenharmony_ci}
9643d8536b4Sopenharmony_ci
9653d8536b4Sopenharmony_cistatic void *PthreadStackTest(void *argument)
9663d8536b4Sopenharmony_ci{
9673d8536b4Sopenharmony_ci    (void)argument;
9683d8536b4Sopenharmony_ci    g_testCount++;
9693d8536b4Sopenharmony_ci    return NULL;
9703d8536b4Sopenharmony_ci}
9713d8536b4Sopenharmony_ci
9723d8536b4Sopenharmony_ci/**
9733d8536b4Sopenharmony_ci * @tc.number    : SUB_KERNEL_PTHREAD_OPERATION_017
9743d8536b4Sopenharmony_ci * @tc.name      : set thread stack
9753d8536b4Sopenharmony_ci * @tc.desc      : [C- SOFTWARE -0200]
9763d8536b4Sopenharmony_ci */
9773d8536b4Sopenharmony_ciLITE_TEST_CASE(PthreadFuncTestSuite, TestPthread017, Function | MediumTest | Level1)
9783d8536b4Sopenharmony_ci{
9793d8536b4Sopenharmony_ci    pthread_attr_t attr;
9803d8536b4Sopenharmony_ci    pthread_t thread;
9813d8536b4Sopenharmony_ci    UINT32 ret;
9823d8536b4Sopenharmony_ci    void *stackAddr = NULL;
9833d8536b4Sopenharmony_ci    g_testCount = 0;
9843d8536b4Sopenharmony_ci
9853d8536b4Sopenharmony_ci    stackAddr = malloc(OS_TSK_TEST_STACK_SIZE);
9863d8536b4Sopenharmony_ci    ICUNIT_ASSERT_NOT_EQUAL(stackAddr, NULL, stackAddr);
9873d8536b4Sopenharmony_ci
9883d8536b4Sopenharmony_ci    ret = pthread_attr_init(&attr);
9893d8536b4Sopenharmony_ci    ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT);
9903d8536b4Sopenharmony_ci
9913d8536b4Sopenharmony_ci    ret = pthread_attr_setstack(&attr, stackAddr, OS_TSK_TEST_STACK_SIZE);
9923d8536b4Sopenharmony_ci    ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT);
9933d8536b4Sopenharmony_ci
9943d8536b4Sopenharmony_ci    ret = pthread_create(&thread, &attr, PthreadStackTest, NULL);
9953d8536b4Sopenharmony_ci    ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT);
9963d8536b4Sopenharmony_ci
9973d8536b4Sopenharmony_ci    ret = pthread_join(thread, NULL);
9983d8536b4Sopenharmony_ci    ICUNIT_GOTO_EQUAL(ret, 0, ret, EXIT);
9993d8536b4Sopenharmony_ci
10003d8536b4Sopenharmony_ciEXIT:
10013d8536b4Sopenharmony_ci    free(stackAddr);
10023d8536b4Sopenharmony_ci    return LOS_OK;
10033d8536b4Sopenharmony_ci};
10043d8536b4Sopenharmony_ci
10053d8536b4Sopenharmony_cistatic void PosixTestCase(void)
10063d8536b4Sopenharmony_ci{
10073d8536b4Sopenharmony_ci    ADD_TEST_CASE(TestPthread001);
10083d8536b4Sopenharmony_ci    ADD_TEST_CASE(TestPthread002);
10093d8536b4Sopenharmony_ci    ADD_TEST_CASE(TestPthread003);
10103d8536b4Sopenharmony_ci    ADD_TEST_CASE(TestPthread004);
10113d8536b4Sopenharmony_ci    ADD_TEST_CASE(TestPthread005);
10123d8536b4Sopenharmony_ci    ADD_TEST_CASE(TestPthread006);
10133d8536b4Sopenharmony_ci    ADD_TEST_CASE(TestPthread007);
10143d8536b4Sopenharmony_ci    ADD_TEST_CASE(TestPthread008);
10153d8536b4Sopenharmony_ci    ADD_TEST_CASE(TestPthread009);
10163d8536b4Sopenharmony_ci    ADD_TEST_CASE(TestPthread010);
10173d8536b4Sopenharmony_ci    ADD_TEST_CASE(TestPthread011);
10183d8536b4Sopenharmony_ci    ADD_TEST_CASE(TestPthread012);
10193d8536b4Sopenharmony_ci    ADD_TEST_CASE(TestPthread013);
10203d8536b4Sopenharmony_ci    ADD_TEST_CASE(TestPthread014);
10213d8536b4Sopenharmony_ci    ADD_TEST_CASE(TestPthread015);
10223d8536b4Sopenharmony_ci    ADD_TEST_CASE(TestPthread016);
10233d8536b4Sopenharmony_ci    ADD_TEST_CASE(TestPthread017);
10243d8536b4Sopenharmony_ci    return;
10253d8536b4Sopenharmony_ci}
10263d8536b4Sopenharmony_ci
10273d8536b4Sopenharmony_cistatic void *PosixTestThread(void *arg)
10283d8536b4Sopenharmony_ci{
10293d8536b4Sopenharmony_ci    PosixTestCase();
10303d8536b4Sopenharmony_ci    return NULL;
10313d8536b4Sopenharmony_ci}
10323d8536b4Sopenharmony_ciint PthreadFuncTestSuite(void)
10333d8536b4Sopenharmony_ci{
10343d8536b4Sopenharmony_ci    pthread_attr_t attr;
10353d8536b4Sopenharmony_ci    pthread_t newTh;
10363d8536b4Sopenharmony_ci    struct sched_param schedParam = { 0 };
10373d8536b4Sopenharmony_ci    UINT32 ret;
10383d8536b4Sopenharmony_ci
10393d8536b4Sopenharmony_ci    ret = pthread_attr_init(&attr);
10403d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
10413d8536b4Sopenharmony_ci
10423d8536b4Sopenharmony_ci    ret = pthread_attr_setstacksize(&attr, OS_TSK_TEST_STACK_SIZE);
10433d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
10443d8536b4Sopenharmony_ci
10453d8536b4Sopenharmony_ci    schedParam.sched_priority = TASK_PRIO_TEST;
10463d8536b4Sopenharmony_ci    ret = pthread_attr_setschedparam(&attr, &schedParam);
10473d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
10483d8536b4Sopenharmony_ci
10493d8536b4Sopenharmony_ci    ret = pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
10503d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
10513d8536b4Sopenharmony_ci
10523d8536b4Sopenharmony_ci    ret = pthread_create(&newTh, &attr, PosixTestThread, NULL);
10533d8536b4Sopenharmony_ci    ICUNIT_ASSERT_EQUAL(ret, 0, ret);
10543d8536b4Sopenharmony_ci
10553d8536b4Sopenharmony_ci    pthread_join(newTh, NULL);
10563d8536b4Sopenharmony_ci    return 0;
10573d8536b4Sopenharmony_ci}
10583d8536b4Sopenharmony_ci
1059