1f6603c60Sopenharmony_ci/* 2f6603c60Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd. 3f6603c60Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4f6603c60Sopenharmony_ci * you may not use this file except in compliance with the License. 5f6603c60Sopenharmony_ci * You may obtain a copy of the License at 6f6603c60Sopenharmony_ci * 7f6603c60Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8f6603c60Sopenharmony_ci * 9f6603c60Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10f6603c60Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11f6603c60Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12f6603c60Sopenharmony_ci * See the License for the specific language governing permissions and 13f6603c60Sopenharmony_ci * limitations under the License. 14f6603c60Sopenharmony_ci */ 15f6603c60Sopenharmony_ci#include <stdio.h> 16f6603c60Sopenharmony_ci#include <string.h> 17f6603c60Sopenharmony_ci#include <limits.h> 18f6603c60Sopenharmony_ci#include <pthread.h> 19f6603c60Sopenharmony_ci#include <gtest/gtest.h> 20f6603c60Sopenharmony_ci#include "utils.h" 21f6603c60Sopenharmony_ci#include "log.h" 22f6603c60Sopenharmony_ci#include "KernelConstants.h" 23f6603c60Sopenharmony_ci#include "FutexTest.h" 24f6603c60Sopenharmony_ci#include "mt_utils.h" 25f6603c60Sopenharmony_ci 26f6603c60Sopenharmony_ciusing namespace testing::ext; 27f6603c60Sopenharmony_ci 28f6603c60Sopenharmony_ci/** 29f6603c60Sopenharmony_ci * @tc.number SUB_KERNEL_PTHREAD_COND_INIT_0100 30f6603c60Sopenharmony_ci * @tc.name pthread_cond_init initializes condition variables 31f6603c60Sopenharmony_ci * @tc.desc [C- SOFTWARE -0200] 32f6603c60Sopenharmony_ci */ 33f6603c60Sopenharmony_ciHWTEST_F(FutexTest, testPthreadCondInit, Function | MediumTest | Level2) 34f6603c60Sopenharmony_ci{ 35f6603c60Sopenharmony_ci pthread_condattr_t condattr; 36f6603c60Sopenharmony_ci EXPECT_EQ(pthread_condattr_init(&condattr), 0); 37f6603c60Sopenharmony_ci pthread_cond_t cond1; 38f6603c60Sopenharmony_ci EXPECT_EQ(pthread_cond_init(&cond1, &condattr), 0); 39f6603c60Sopenharmony_ci 40f6603c60Sopenharmony_ci pthread_cond_t cond2; 41f6603c60Sopenharmony_ci EXPECT_EQ(pthread_cond_init(&cond2, nullptr), 0); 42f6603c60Sopenharmony_ci} 43f6603c60Sopenharmony_ci 44f6603c60Sopenharmony_ci/** 45f6603c60Sopenharmony_ci * @tc.number SUB_KERNEL_PTHREAD_COND_DESTROY_0100 46f6603c60Sopenharmony_ci * @tc.name pthread_cond_destroy destroy condition variables 47f6603c60Sopenharmony_ci * @tc.desc [C- SOFTWARE -0200] 48f6603c60Sopenharmony_ci */ 49f6603c60Sopenharmony_ciHWTEST_F(FutexTest, testPthreadCondDestroy, Function | MediumTest | Level3) 50f6603c60Sopenharmony_ci{ 51f6603c60Sopenharmony_ci pthread_condattr_t condattr; 52f6603c60Sopenharmony_ci EXPECT_EQ(pthread_condattr_init(&condattr), 0); 53f6603c60Sopenharmony_ci pthread_cond_t cond1; 54f6603c60Sopenharmony_ci EXPECT_EQ(pthread_cond_init(&cond1, &condattr), 0); 55f6603c60Sopenharmony_ci EXPECT_EQ(pthread_cond_destroy(&cond1), 0); 56f6603c60Sopenharmony_ci 57f6603c60Sopenharmony_ci pthread_cond_t cond2; 58f6603c60Sopenharmony_ci EXPECT_EQ(pthread_cond_init(&cond2, nullptr), 0); 59f6603c60Sopenharmony_ci EXPECT_EQ(pthread_cond_destroy(&cond2), 0); 60f6603c60Sopenharmony_ci 61f6603c60Sopenharmony_ci pthread_cond_t cond3 = PTHREAD_COND_INITIALIZER; 62f6603c60Sopenharmony_ci EXPECT_EQ(pthread_cond_destroy(&cond3), 0); 63f6603c60Sopenharmony_ci} 64f6603c60Sopenharmony_ci 65f6603c60Sopenharmony_ci/** 66f6603c60Sopenharmony_ci * @tc.number SUB_KERNEL_PTHREAD_CONDATTR_INIT_0100 67f6603c60Sopenharmony_ci * @tc.name Init and destroy operations 68f6603c60Sopenharmony_ci * @tc.desc [C- SOFTWARE -0200] 69f6603c60Sopenharmony_ci */ 70f6603c60Sopenharmony_ciHWTEST_F(FutexTest, testPthreadCondattrInit, Function | MediumTest | Level2) 71f6603c60Sopenharmony_ci{ 72f6603c60Sopenharmony_ci pthread_condattr_t condattr; 73f6603c60Sopenharmony_ci 74f6603c60Sopenharmony_ci EXPECT_EQ(pthread_condattr_init(&condattr), 0) << "> return errno"; 75f6603c60Sopenharmony_ci EXPECT_EQ(pthread_condattr_destroy(&condattr), 0) << "> return errno"; 76f6603c60Sopenharmony_ci EXPECT_EQ(pthread_condattr_init(&condattr), 0) << "> return errno"; 77f6603c60Sopenharmony_ci} 78f6603c60Sopenharmony_ci 79f6603c60Sopenharmony_ci/** 80f6603c60Sopenharmony_ci * @tc.number SUB_KERNEL_PTHREAD_CONDATTR_SETCLOCK_0100 81f6603c60Sopenharmony_ci * @tc.name Set and get the clock selection variable properties of the condition variable properties 82f6603c60Sopenharmony_ci * @tc.desc [C- SOFTWARE -0200] 83f6603c60Sopenharmony_ci */ 84f6603c60Sopenharmony_ciHWTEST_F(FutexTest, testPthreadCondattrSetclock, Function | MediumTest | Level3) 85f6603c60Sopenharmony_ci{ 86f6603c60Sopenharmony_ci clockid_t clk; 87f6603c60Sopenharmony_ci const int invalidClock = -100; 88f6603c60Sopenharmony_ci pthread_condattr_t condattr; 89f6603c60Sopenharmony_ci EXPECT_EQ(pthread_condattr_init(&condattr), 0); 90f6603c60Sopenharmony_ci 91f6603c60Sopenharmony_ci // default 92f6603c60Sopenharmony_ci EXPECT_EQ(pthread_condattr_getclock(&condattr, &clk), 0) << "> return errno"; 93f6603c60Sopenharmony_ci EXPECT_EQ(clk, DEF_PROCESS_CONDATTR_CLOCK); 94f6603c60Sopenharmony_ci 95f6603c60Sopenharmony_ci EXPECT_EQ(pthread_condattr_setclock(&condattr, CLOCK_REALTIME), 0) << "> return errno"; 96f6603c60Sopenharmony_ci EXPECT_EQ(pthread_condattr_getclock(&condattr, &clk), 0) << "> return errno"; 97f6603c60Sopenharmony_ci EXPECT_EQ(clk, CLOCK_REALTIME); 98f6603c60Sopenharmony_ci 99f6603c60Sopenharmony_ci struct timespec ts = {0}; 100f6603c60Sopenharmony_ci EXPECT_EQ(clock_getres(CLOCK_MONOTONIC, &ts), 0) << "> return errno"; 101f6603c60Sopenharmony_ci EXPECT_EQ(pthread_condattr_setclock(&condattr, CLOCK_MONOTONIC), 0) << "> return errno"; 102f6603c60Sopenharmony_ci EXPECT_EQ(pthread_condattr_getclock(&condattr, &clk), 0) << "> return errno"; 103f6603c60Sopenharmony_ci EXPECT_EQ(clk, CLOCK_MONOTONIC); 104f6603c60Sopenharmony_ci 105f6603c60Sopenharmony_ci EXPECT_EQ(pthread_condattr_setclock(&condattr, invalidClock), EINVAL) << "> return errno"; 106f6603c60Sopenharmony_ci} 107f6603c60Sopenharmony_ci 108f6603c60Sopenharmony_cipthread_mutex_t g_mtx1 = PTHREAD_MUTEX_INITIALIZER; 109f6603c60Sopenharmony_cipthread_cond_t g_cond1 = PTHREAD_COND_INITIALIZER; 110f6603c60Sopenharmony_ci 111f6603c60Sopenharmony_ci// pthread_cond_signal 112f6603c60Sopenharmony_civoid *ThreadPthreadCondSignalBefore1(void *arg) 113f6603c60Sopenharmony_ci{ 114f6603c60Sopenharmony_ci Msleep(20); 115f6603c60Sopenharmony_ci EXPECT_EQ(pthread_mutex_lock(&g_mtx1), 0); 116f6603c60Sopenharmony_ci LOG("step = %lx", CheckStep(2)); 117f6603c60Sopenharmony_ci EXPECT_EQ(pthread_cond_signal(&g_cond1), 0); 118f6603c60Sopenharmony_ci LOG("step = %lx", CheckStep(3)); 119f6603c60Sopenharmony_ci EXPECT_EQ(pthread_mutex_unlock(&g_mtx1), 0); 120f6603c60Sopenharmony_ci return arg; 121f6603c60Sopenharmony_ci} 122f6603c60Sopenharmony_ci 123f6603c60Sopenharmony_ci// pthread_cond_wait 124f6603c60Sopenharmony_civoid *ThreadPthreadCondSignalBefore2(void *arg) 125f6603c60Sopenharmony_ci{ 126f6603c60Sopenharmony_ci EXPECT_EQ(pthread_mutex_lock(&g_mtx1), 0); 127f6603c60Sopenharmony_ci EXPECT_EQ(pthread_cond_wait(&g_cond1, &g_mtx1), 0); 128f6603c60Sopenharmony_ci LOG("step = %lx", CheckStep(4)); 129f6603c60Sopenharmony_ci EXPECT_EQ(pthread_mutex_unlock(&g_mtx1), 0); 130f6603c60Sopenharmony_ci return arg; 131f6603c60Sopenharmony_ci} 132f6603c60Sopenharmony_ci 133f6603c60Sopenharmony_ci/** 134f6603c60Sopenharmony_ci * @tc.number SUB_KERNEL_PTHREAD_COND_SIGNAL_0100 135f6603c60Sopenharmony_ci * @tc.name Use pthread_cond_signal to release the conditional semaphore, pthread_cond_signal front 136f6603c60Sopenharmony_ci * @tc.desc [C- SOFTWARE -0200] 137f6603c60Sopenharmony_ci */ 138f6603c60Sopenharmony_ciHWTEST_F(FutexTest, testPthreadCondSignalBefore, Function | MediumTest | Level3) 139f6603c60Sopenharmony_ci{ 140f6603c60Sopenharmony_ci pthread_t tid[2]; 141f6603c60Sopenharmony_ci LOG("step = %lx", CheckStep(1)); 142f6603c60Sopenharmony_ci 143f6603c60Sopenharmony_ci ASSERT_EQ(pthread_create(&tid[0], nullptr, ThreadPthreadCondSignalBefore1, nullptr), 0) << "> return errno"; 144f6603c60Sopenharmony_ci ASSERT_EQ(pthread_create(&tid[1], nullptr, ThreadPthreadCondSignalBefore2, nullptr), 0) << "> return errno"; 145f6603c60Sopenharmony_ci 146f6603c60Sopenharmony_ci Msleep(100); 147f6603c60Sopenharmony_ci pthread_join(tid[0], nullptr); 148f6603c60Sopenharmony_ci pthread_join(tid[1], nullptr); 149f6603c60Sopenharmony_ci EXPECT_EQ(pthread_cond_destroy(&g_cond1), 0); 150f6603c60Sopenharmony_ci EXPECT_EQ(pthread_mutex_destroy(&g_mtx1), 0); 151f6603c60Sopenharmony_ci EXPECT_EQ(CheckStep(5), (uint64_t)0x12345); 152f6603c60Sopenharmony_ci} 153f6603c60Sopenharmony_ci 154f6603c60Sopenharmony_cipthread_mutex_t g_mtx2 = PTHREAD_MUTEX_INITIALIZER; 155f6603c60Sopenharmony_cipthread_cond_t g_cond2 = PTHREAD_COND_INITIALIZER; 156f6603c60Sopenharmony_ci 157f6603c60Sopenharmony_ci// pthread_cond_signal 158f6603c60Sopenharmony_civoid *ThreadTestCondSignalWaitAfter1(void *arg) 159f6603c60Sopenharmony_ci{ 160f6603c60Sopenharmony_ci Msleep(20); 161f6603c60Sopenharmony_ci EXPECT_EQ(pthread_mutex_lock(&g_mtx2), 0); 162f6603c60Sopenharmony_ci LOG("step = %lx", CheckStep(2)); 163f6603c60Sopenharmony_ci EXPECT_EQ(pthread_mutex_unlock(&g_mtx2), 0); 164f6603c60Sopenharmony_ci EXPECT_EQ(pthread_cond_signal(&g_cond2), 0); 165f6603c60Sopenharmony_ci return arg; 166f6603c60Sopenharmony_ci} 167f6603c60Sopenharmony_ci 168f6603c60Sopenharmony_ci// pthread_cond_wait 169f6603c60Sopenharmony_civoid *ThreadTestCondSignalWaitAfter2(void *arg) 170f6603c60Sopenharmony_ci{ 171f6603c60Sopenharmony_ci EXPECT_EQ(pthread_mutex_lock(&g_mtx2), 0); 172f6603c60Sopenharmony_ci EXPECT_EQ(pthread_cond_wait(&g_cond2, &g_mtx2), 0); 173f6603c60Sopenharmony_ci LOG("step = %lx", CheckStep(3)); 174f6603c60Sopenharmony_ci EXPECT_EQ(pthread_mutex_unlock(&g_mtx2), 0); 175f6603c60Sopenharmony_ci return arg; 176f6603c60Sopenharmony_ci} 177f6603c60Sopenharmony_ci 178f6603c60Sopenharmony_ci/** 179f6603c60Sopenharmony_ci * @tc.number SUB_KERNEL_PTHREAD_COND_SIGNAL_0200 180f6603c60Sopenharmony_ci * @tc.name Use pthread_cond_signal to release the conditional semaphore, pthread_cond_signal in the back 181f6603c60Sopenharmony_ci * @tc.desc [C- SOFTWARE -0200] 182f6603c60Sopenharmony_ci */ 183f6603c60Sopenharmony_ciHWTEST_F(FutexTest, testPthreadCondSignalAfter, Function | MediumTest | Level3) 184f6603c60Sopenharmony_ci{ 185f6603c60Sopenharmony_ci pthread_t tid[2]; 186f6603c60Sopenharmony_ci LOG("step = %lx", CheckStep(1)); 187f6603c60Sopenharmony_ci 188f6603c60Sopenharmony_ci ASSERT_EQ(pthread_create(&tid[0], nullptr, ThreadTestCondSignalWaitAfter1, nullptr), 0) << "> return errno"; 189f6603c60Sopenharmony_ci ASSERT_EQ(pthread_create(&tid[1], nullptr, ThreadTestCondSignalWaitAfter2, nullptr), 0) << "> return errno"; 190f6603c60Sopenharmony_ci 191f6603c60Sopenharmony_ci Msleep(100); 192f6603c60Sopenharmony_ci pthread_join(tid[0], nullptr); 193f6603c60Sopenharmony_ci pthread_join(tid[1], nullptr); 194f6603c60Sopenharmony_ci EXPECT_EQ(pthread_cond_destroy(&g_cond2), 0); 195f6603c60Sopenharmony_ci EXPECT_EQ(pthread_mutex_destroy(&g_mtx2), 0); 196f6603c60Sopenharmony_ci EXPECT_EQ(CheckStep(4), (uint64_t)0x1234); 197f6603c60Sopenharmony_ci} 198f6603c60Sopenharmony_ci 199f6603c60Sopenharmony_cipthread_mutex_t g_mtx3 = PTHREAD_MUTEX_INITIALIZER; 200f6603c60Sopenharmony_cipthread_cond_t g_cond3 = PTHREAD_COND_INITIALIZER; 201f6603c60Sopenharmony_ci 202f6603c60Sopenharmony_ci// pthread_cond_broadcast 203f6603c60Sopenharmony_civoid *ThreadPthreadCondBroadcast1(void *arg) 204f6603c60Sopenharmony_ci{ 205f6603c60Sopenharmony_ci int *testIntP = (int *)arg; 206f6603c60Sopenharmony_ci Msleep(20); 207f6603c60Sopenharmony_ci EXPECT_EQ(pthread_mutex_lock(&g_mtx3), 0); 208f6603c60Sopenharmony_ci *testIntP = 10; 209f6603c60Sopenharmony_ci EXPECT_EQ(pthread_cond_broadcast(&g_cond3), 0); 210f6603c60Sopenharmony_ci EXPECT_EQ(pthread_mutex_unlock(&g_mtx3), 0); 211f6603c60Sopenharmony_ci return arg; 212f6603c60Sopenharmony_ci} 213f6603c60Sopenharmony_ci 214f6603c60Sopenharmony_ci// pthread_cond_wait 215f6603c60Sopenharmony_civoid *ThreadPthreadCondBroadcast2(void *arg) 216f6603c60Sopenharmony_ci{ 217f6603c60Sopenharmony_ci int *testIntP = (int *)arg; 218f6603c60Sopenharmony_ci EXPECT_EQ(pthread_mutex_lock(&g_mtx3), 0); 219f6603c60Sopenharmony_ci EXPECT_EQ(pthread_cond_wait(&g_cond3, &g_mtx3), 0); 220f6603c60Sopenharmony_ci (*testIntP)++; 221f6603c60Sopenharmony_ci EXPECT_EQ(pthread_mutex_unlock(&g_mtx3), 0); 222f6603c60Sopenharmony_ci return arg; 223f6603c60Sopenharmony_ci} 224f6603c60Sopenharmony_ci 225f6603c60Sopenharmony_ci/** 226f6603c60Sopenharmony_ci * @tc.number SUB_KERNEL_PTHREAD_COND_BROADCAST_0100 227f6603c60Sopenharmony_ci * @tc.name Use pthread_cond_broadcast to release conditional semaphore 228f6603c60Sopenharmony_ci * @tc.desc [C- SOFTWARE -0200] 229f6603c60Sopenharmony_ci */ 230f6603c60Sopenharmony_ciHWTEST_F(FutexTest, testPthreadCondBroadcast, Function | MediumTest | Level3) 231f6603c60Sopenharmony_ci{ 232f6603c60Sopenharmony_ci pthread_t tid[3]; 233f6603c60Sopenharmony_ci int testInt = 0; 234f6603c60Sopenharmony_ci 235f6603c60Sopenharmony_ci ASSERT_EQ(pthread_create(&tid[0], nullptr, ThreadPthreadCondBroadcast1, (void*)&testInt), 0) << "> return errno"; 236f6603c60Sopenharmony_ci ASSERT_EQ(pthread_create(&tid[1], nullptr, ThreadPthreadCondBroadcast2, (void*)&testInt), 0) << "> return errno"; 237f6603c60Sopenharmony_ci ASSERT_EQ(pthread_create(&tid[2], nullptr, ThreadPthreadCondBroadcast2, (void*)&testInt), 0) << "> return errno"; 238f6603c60Sopenharmony_ci 239f6603c60Sopenharmony_ci Msleep(100); 240f6603c60Sopenharmony_ci pthread_join(tid[0], nullptr); 241f6603c60Sopenharmony_ci pthread_join(tid[1], nullptr); 242f6603c60Sopenharmony_ci pthread_join(tid[2], nullptr); 243f6603c60Sopenharmony_ci EXPECT_EQ(pthread_cond_destroy(&g_cond3), 0); 244f6603c60Sopenharmony_ci EXPECT_EQ(pthread_mutex_destroy(&g_mtx3), 0); 245f6603c60Sopenharmony_ci EXPECT_EQ(testInt, 12); 246f6603c60Sopenharmony_ci} 247f6603c60Sopenharmony_ci 248f6603c60Sopenharmony_cipthread_mutex_t g_mtx4 = PTHREAD_MUTEX_INITIALIZER; 249f6603c60Sopenharmony_cipthread_cond_t g_cond4 = PTHREAD_COND_INITIALIZER; 250f6603c60Sopenharmony_ci 251f6603c60Sopenharmony_ci// pthread_cond_signal 252f6603c60Sopenharmony_civoid *ThreadPthreadCondTimedwait1(void *arg) 253f6603c60Sopenharmony_ci{ 254f6603c60Sopenharmony_ci Msleep(50); 255f6603c60Sopenharmony_ci EXPECT_EQ(pthread_mutex_lock(&g_mtx4), 0); 256f6603c60Sopenharmony_ci LOG("step = %lx", CheckStep(2)); 257f6603c60Sopenharmony_ci EXPECT_EQ(pthread_mutex_unlock(&g_mtx4), 0); 258f6603c60Sopenharmony_ci EXPECT_EQ(pthread_cond_signal(&g_cond4), 0); 259f6603c60Sopenharmony_ci return arg; 260f6603c60Sopenharmony_ci} 261f6603c60Sopenharmony_ci 262f6603c60Sopenharmony_ci// pthread_cond_timedwait 263f6603c60Sopenharmony_civoid *ThreadPthreadCondTimedwait2(void *arg) 264f6603c60Sopenharmony_ci{ 265f6603c60Sopenharmony_ci const unsigned int nsecPerSec = 1000000000; 266f6603c60Sopenharmony_ci const unsigned int nsecPer100Ms = 100000000; 267f6603c60Sopenharmony_ci struct timespec ts = {0}; 268f6603c60Sopenharmony_ci EXPECT_EQ(pthread_mutex_lock(&g_mtx4), 0); 269f6603c60Sopenharmony_ci 270f6603c60Sopenharmony_ci clock_gettime(CLOCK_REALTIME, &ts); 271f6603c60Sopenharmony_ci ts.tv_sec = ts.tv_sec + (ts.tv_nsec + nsecPer100Ms) / nsecPerSec; 272f6603c60Sopenharmony_ci ts.tv_nsec = (ts.tv_nsec + nsecPer100Ms) % nsecPerSec; 273f6603c60Sopenharmony_ci 274f6603c60Sopenharmony_ci EXPECT_EQ(pthread_cond_timedwait(&g_cond4, &g_mtx4, &ts), 0); 275f6603c60Sopenharmony_ci LOG("step = %lx", CheckStep(3)); 276f6603c60Sopenharmony_ci EXPECT_EQ(pthread_mutex_unlock(&g_mtx4), 0); 277f6603c60Sopenharmony_ci return arg; 278f6603c60Sopenharmony_ci} 279f6603c60Sopenharmony_ci 280f6603c60Sopenharmony_ci/** 281f6603c60Sopenharmony_ci * @tc.number SUB_KERNEL_PTHREAD_COND_TIMEDWAIT_0100 282f6603c60Sopenharmony_ci * @tc.name Use pthread_cond_timedwait to get conditional semaphore 283f6603c60Sopenharmony_ci * @tc.desc [C- SOFTWARE -0200] 284f6603c60Sopenharmony_ci */ 285f6603c60Sopenharmony_ciHWTEST_F(FutexTest, testPthreadCondTimedwait, Function | MediumTest | Level3) 286f6603c60Sopenharmony_ci{ 287f6603c60Sopenharmony_ci pthread_t tid1; 288f6603c60Sopenharmony_ci pthread_t tid2; 289f6603c60Sopenharmony_ci LOG("step = %lx", CheckStep(1)); 290f6603c60Sopenharmony_ci 291f6603c60Sopenharmony_ci ASSERT_EQ(pthread_create(&tid1, nullptr, ThreadPthreadCondTimedwait1, nullptr), 0) << "> return errno"; 292f6603c60Sopenharmony_ci ASSERT_EQ(pthread_create(&tid2, nullptr, ThreadPthreadCondTimedwait2, nullptr), 0) << "> return errno"; 293f6603c60Sopenharmony_ci 294f6603c60Sopenharmony_ci Msleep(100); 295f6603c60Sopenharmony_ci pthread_join(tid1, nullptr); 296f6603c60Sopenharmony_ci pthread_join(tid2, nullptr); 297f6603c60Sopenharmony_ci EXPECT_EQ(pthread_cond_destroy(&g_cond4), 0); 298f6603c60Sopenharmony_ci EXPECT_EQ(pthread_mutex_destroy(&g_mtx4), 0); 299f6603c60Sopenharmony_ci EXPECT_EQ(CheckStep(4), (uint64_t)0x1234); 300f6603c60Sopenharmony_ci} 301f6603c60Sopenharmony_ci 302f6603c60Sopenharmony_cipthread_mutex_t g_mtx5 = PTHREAD_MUTEX_INITIALIZER; 303f6603c60Sopenharmony_cipthread_cond_t g_cond5 = PTHREAD_COND_INITIALIZER; 304f6603c60Sopenharmony_ci 305f6603c60Sopenharmony_ci// pthread_cond_timedwait 306f6603c60Sopenharmony_civoid *ThreadPthreadCondTimedwaitOut(void *arg) 307f6603c60Sopenharmony_ci{ 308f6603c60Sopenharmony_ci struct timespec ts = {0}; 309f6603c60Sopenharmony_ci struct timespec tsNow = {0}; 310f6603c60Sopenharmony_ci EXPECT_EQ(pthread_mutex_lock(&g_mtx5), 0); 311f6603c60Sopenharmony_ci 312f6603c60Sopenharmony_ci GetDelayedTime(&ts, 100); 313f6603c60Sopenharmony_ci EXPECT_EQ(pthread_cond_timedwait(&g_cond5, &g_mtx5, &ts), ETIMEDOUT) << "> return should errno"; 314f6603c60Sopenharmony_ci LOG("step = %lx", CheckStep(2)); 315f6603c60Sopenharmony_ci clock_gettime(CLOCK_REALTIME, &tsNow); 316f6603c60Sopenharmony_ci 317f6603c60Sopenharmony_ci int timeDiff = GetTimeDiff(tsNow, ts); // calculate time different 318f6603c60Sopenharmony_ci EXPECT_GE(timeDiff, 0); 319f6603c60Sopenharmony_ci EXPECT_LE(timeDiff, 20); 320f6603c60Sopenharmony_ci 321f6603c60Sopenharmony_ci EXPECT_EQ(pthread_mutex_unlock(&g_mtx5), 0); 322f6603c60Sopenharmony_ci return arg; 323f6603c60Sopenharmony_ci} 324f6603c60Sopenharmony_ci 325f6603c60Sopenharmony_ci/** 326f6603c60Sopenharmony_ci * @tc.number SUB_KERNEL_PTHREAD_COND_TIMEDWAIT_0200 327f6603c60Sopenharmony_ci * @tc.name Use pthread_cond_timedwait to time out time measurement 328f6603c60Sopenharmony_ci * @tc.desc [C- SOFTWARE -0200] 329f6603c60Sopenharmony_ci */ 330f6603c60Sopenharmony_ciHWTEST_F(FutexTest, testPthreadCondTimedwaitOut, Function | MediumTest | Level3) 331f6603c60Sopenharmony_ci{ 332f6603c60Sopenharmony_ci pthread_t tid; 333f6603c60Sopenharmony_ci LOG("step = %lx", CheckStep(1)); 334f6603c60Sopenharmony_ci 335f6603c60Sopenharmony_ci ASSERT_EQ(pthread_create(&tid, nullptr, ThreadPthreadCondTimedwaitOut, nullptr), 0) << "> return errno"; 336f6603c60Sopenharmony_ci 337f6603c60Sopenharmony_ci Msleep(200); 338f6603c60Sopenharmony_ci pthread_join(tid, nullptr); 339f6603c60Sopenharmony_ci EXPECT_EQ(pthread_cond_destroy(&g_cond5), 0); 340f6603c60Sopenharmony_ci EXPECT_EQ(pthread_mutex_destroy(&g_mtx5), 0); 341f6603c60Sopenharmony_ci EXPECT_EQ(CheckStep(3), (uint64_t)0x123); 342f6603c60Sopenharmony_ci} 343f6603c60Sopenharmony_ci 344f6603c60Sopenharmony_cipthread_mutex_t g_mtx6 = PTHREAD_MUTEX_INITIALIZER; 345f6603c60Sopenharmony_cipthread_cond_t g_cond6 = PTHREAD_COND_INITIALIZER; 346f6603c60Sopenharmony_ci 347f6603c60Sopenharmony_ci// pthread_cond_timedwait 348f6603c60Sopenharmony_civoid *ThreadPthreadCondTimedwaitEinval(void *arg) 349f6603c60Sopenharmony_ci{ 350f6603c60Sopenharmony_ci const long einvalNsec = 1000000000; 351f6603c60Sopenharmony_ci struct timespec ts = {0}; 352f6603c60Sopenharmony_ci EXPECT_EQ(pthread_mutex_lock(&g_mtx6), 0); 353f6603c60Sopenharmony_ci 354f6603c60Sopenharmony_ci ts.tv_sec = 1; 355f6603c60Sopenharmony_ci ts.tv_nsec = einvalNsec; 356f6603c60Sopenharmony_ci EXPECT_EQ(pthread_cond_timedwait(&g_cond6, &g_mtx6, &ts), EINVAL) << "> return should errno"; 357f6603c60Sopenharmony_ci CheckStep(2); 358f6603c60Sopenharmony_ci 359f6603c60Sopenharmony_ci EXPECT_EQ(pthread_mutex_unlock(&g_mtx6), 0); 360f6603c60Sopenharmony_ci return arg; 361f6603c60Sopenharmony_ci} 362f6603c60Sopenharmony_ci 363f6603c60Sopenharmony_ci/** 364f6603c60Sopenharmony_ci * @tc.number SUB_KERNEL_PTHREAD_COND_TIMEDWAIT_0300 365f6603c60Sopenharmony_ci * @tc.name test pthread_cond_timedwait EINVAL 366f6603c60Sopenharmony_ci * @tc.desc [C- SOFTWARE -0200] 367f6603c60Sopenharmony_ci */ 368f6603c60Sopenharmony_ciHWTEST_F(FutexTest, testPthreadCondTimedwaitEinval, Function | MediumTest | Level3) 369f6603c60Sopenharmony_ci{ 370f6603c60Sopenharmony_ci pthread_t tid; 371f6603c60Sopenharmony_ci CheckStep(1); 372f6603c60Sopenharmony_ci 373f6603c60Sopenharmony_ci ASSERT_EQ(pthread_create(&tid, nullptr, ThreadPthreadCondTimedwaitEinval, nullptr), 0) << "> return errno"; 374f6603c60Sopenharmony_ci 375f6603c60Sopenharmony_ci Msleep(200); 376f6603c60Sopenharmony_ci pthread_join(tid, nullptr); 377f6603c60Sopenharmony_ci EXPECT_EQ(pthread_cond_destroy(&g_cond6), 0); 378f6603c60Sopenharmony_ci EXPECT_EQ(pthread_mutex_destroy(&g_mtx6), 0); 379f6603c60Sopenharmony_ci EXPECT_EQ(CheckStep(3), (uint64_t)0x123); 380f6603c60Sopenharmony_ci}