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