1570af302Sopenharmony_ci/* 2570af302Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd. 3570af302Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4570af302Sopenharmony_ci * you may not use this file except in compliance with the License. 5570af302Sopenharmony_ci * You may obtain a copy of the License at 6570af302Sopenharmony_ci * 7570af302Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8570af302Sopenharmony_ci * 9570af302Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10570af302Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11570af302Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12570af302Sopenharmony_ci * See the License for the specific language governing permissions and 13570af302Sopenharmony_ci * limitations under the License. 14570af302Sopenharmony_ci */ 15570af302Sopenharmony_ci#include <errno.h> 16570af302Sopenharmony_ci#include <pthread.h> 17570af302Sopenharmony_ci#include "pthread_util.h" 18570af302Sopenharmony_ci 19570af302Sopenharmony_ci/********************************************* Test case dividing line ***********************************************/ 20570af302Sopenharmony_ci 21570af302Sopenharmony_cistatic void *PthreadClocklockOutRealTime(void *arg) 22570af302Sopenharmony_ci{ 23570af302Sopenharmony_ci pthread_mutex_t *mtx = (pthread_mutex_t*)arg; 24570af302Sopenharmony_ci struct timespec ts = {0}; 25570af302Sopenharmony_ci struct timespec tsNow = {0}; 26570af302Sopenharmony_ci 27570af302Sopenharmony_ci Msleep(SLEEP_20_MS); 28570af302Sopenharmony_ci GetDelayedTimeByClockid(&ts, DELAY_TIME_100_MS, CLOCK_REALTIME); 29570af302Sopenharmony_ci TEST(pthread_mutex_clocklock(mtx, CLOCK_REALTIME, &ts) == ETIMEDOUT); 30570af302Sopenharmony_ci 31570af302Sopenharmony_ci clock_gettime(CLOCK_REALTIME, &tsNow); 32570af302Sopenharmony_ci int timeDiff = GetTimeDiff(tsNow, ts); // calculate time different 33570af302Sopenharmony_ci TEST(timeDiff < 20); 34570af302Sopenharmony_ci return arg; 35570af302Sopenharmony_ci} 36570af302Sopenharmony_ci 37570af302Sopenharmony_ci/** 38570af302Sopenharmony_ci * @tc.name : pthread_mutex_clocklock_0010 39570af302Sopenharmony_ci * @tc.desc : test pthread_mutex_clocklock whith timeout by CLOCK_REALTIME 40570af302Sopenharmony_ci * @tc.level : Level 0 41570af302Sopenharmony_ci */ 42570af302Sopenharmony_cistatic void pthread_mutex_clocklock_0010(void) 43570af302Sopenharmony_ci{ 44570af302Sopenharmony_ci pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; 45570af302Sopenharmony_ci pthread_t tid; 46570af302Sopenharmony_ci TEST(pthread_create(&tid, NULL, PthreadClocklockOutRealTime, (void*)&mtx) == 0); 47570af302Sopenharmony_ci 48570af302Sopenharmony_ci TEST(pthread_mutex_lock(&mtx) == 0); 49570af302Sopenharmony_ci Msleep(SLEEP_50_MS); 50570af302Sopenharmony_ci Msleep(SLEEP_100_MS); 51570af302Sopenharmony_ci TEST(pthread_mutex_unlock(&mtx) == 0); 52570af302Sopenharmony_ci 53570af302Sopenharmony_ci TEST(pthread_join(tid, NULL) == 0); 54570af302Sopenharmony_ci} 55570af302Sopenharmony_ci 56570af302Sopenharmony_ci/********************************************* Test case dividing line ***********************************************/ 57570af302Sopenharmony_ci 58570af302Sopenharmony_cistatic void *PthreadClocklockNoOutRealTime(void *arg) 59570af302Sopenharmony_ci{ 60570af302Sopenharmony_ci pthread_mutex_t *mtx = (pthread_mutex_t*)arg; 61570af302Sopenharmony_ci struct timespec ts = {0}; 62570af302Sopenharmony_ci 63570af302Sopenharmony_ci Msleep(SLEEP_20_MS); 64570af302Sopenharmony_ci GetDelayedTimeByClockid(&ts, DELAY_TIME_100_MS, CLOCK_REALTIME); 65570af302Sopenharmony_ci TEST(pthread_mutex_clocklock(mtx, CLOCK_REALTIME, &ts) == 0); 66570af302Sopenharmony_ci return arg; 67570af302Sopenharmony_ci} 68570af302Sopenharmony_ci 69570af302Sopenharmony_ci/** 70570af302Sopenharmony_ci * @tc.name : pthread_mutex_clocklock_0020 71570af302Sopenharmony_ci * @tc.desc : test pthread_mutex_clocklock with no timeout by CLOCK_REALTIME 72570af302Sopenharmony_ci * @tc.level : Level 0 73570af302Sopenharmony_ci */ 74570af302Sopenharmony_cistatic void pthread_mutex_clocklock_0020(void) 75570af302Sopenharmony_ci{ 76570af302Sopenharmony_ci pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; 77570af302Sopenharmony_ci pthread_t tid; 78570af302Sopenharmony_ci TEST(pthread_create(&tid, NULL, PthreadClocklockNoOutRealTime, (void*)&mtx) == 0); 79570af302Sopenharmony_ci 80570af302Sopenharmony_ci TEST(pthread_mutex_lock(&mtx) == 0); 81570af302Sopenharmony_ci Msleep(SLEEP_50_MS); 82570af302Sopenharmony_ci TEST(pthread_mutex_unlock(&mtx) == 0); 83570af302Sopenharmony_ci 84570af302Sopenharmony_ci TEST(pthread_join(tid, NULL) == 0); 85570af302Sopenharmony_ci} 86570af302Sopenharmony_ci 87570af302Sopenharmony_ci/********************************************* Test case dividing line ***********************************************/ 88570af302Sopenharmony_ci 89570af302Sopenharmony_cistatic void *PthreadClocklockOutMonoTime(void *arg) 90570af302Sopenharmony_ci{ 91570af302Sopenharmony_ci pthread_mutex_t *mtx = (pthread_mutex_t*)arg; 92570af302Sopenharmony_ci struct timespec ts = {0}; 93570af302Sopenharmony_ci struct timespec tsNow = {0}; 94570af302Sopenharmony_ci 95570af302Sopenharmony_ci Msleep(SLEEP_20_MS); 96570af302Sopenharmony_ci GetDelayedTimeByClockid(&ts, DELAY_TIME_100_MS, CLOCK_MONOTONIC); 97570af302Sopenharmony_ci TEST(pthread_mutex_clocklock(mtx, CLOCK_MONOTONIC, &ts) == ETIMEDOUT); 98570af302Sopenharmony_ci 99570af302Sopenharmony_ci clock_gettime(CLOCK_MONOTONIC, &tsNow); 100570af302Sopenharmony_ci int timeDiff = GetTimeDiff(tsNow, ts); // calculate time different 101570af302Sopenharmony_ci TEST(timeDiff < 20); 102570af302Sopenharmony_ci return arg; 103570af302Sopenharmony_ci} 104570af302Sopenharmony_ci 105570af302Sopenharmony_ci/** 106570af302Sopenharmony_ci * @tc.name : pthread_mutex_clocklock_0030 107570af302Sopenharmony_ci * @tc.desc : test pthread_mutex_clocklock whith timeout by CLOCK_MONOTONIC 108570af302Sopenharmony_ci * @tc.level : Level 0 109570af302Sopenharmony_ci */ 110570af302Sopenharmony_cistatic void pthread_mutex_clocklock_0030(void) 111570af302Sopenharmony_ci{ 112570af302Sopenharmony_ci pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; 113570af302Sopenharmony_ci pthread_t tid; 114570af302Sopenharmony_ci TEST(pthread_create(&tid, NULL, PthreadClocklockOutMonoTime, (void*)&mtx) == 0); 115570af302Sopenharmony_ci 116570af302Sopenharmony_ci TEST(pthread_mutex_lock(&mtx) == 0); 117570af302Sopenharmony_ci Msleep(SLEEP_50_MS); 118570af302Sopenharmony_ci Msleep(SLEEP_100_MS); 119570af302Sopenharmony_ci TEST(pthread_mutex_unlock(&mtx) == 0); 120570af302Sopenharmony_ci 121570af302Sopenharmony_ci TEST(pthread_join(tid, NULL) == 0); 122570af302Sopenharmony_ci} 123570af302Sopenharmony_ci 124570af302Sopenharmony_ci/********************************************* Test case dividing line ***********************************************/ 125570af302Sopenharmony_ci 126570af302Sopenharmony_cistatic void *PthreadClocklockNoOutMonoTime(void *arg) 127570af302Sopenharmony_ci{ 128570af302Sopenharmony_ci pthread_mutex_t *mtx = (pthread_mutex_t*)arg; 129570af302Sopenharmony_ci struct timespec ts = {0}; 130570af302Sopenharmony_ci 131570af302Sopenharmony_ci Msleep(SLEEP_20_MS); 132570af302Sopenharmony_ci GetDelayedTimeByClockid(&ts, DELAY_TIME_100_MS, CLOCK_MONOTONIC); 133570af302Sopenharmony_ci TEST(pthread_mutex_clocklock(mtx, CLOCK_MONOTONIC, &ts) == 0); 134570af302Sopenharmony_ci return arg; 135570af302Sopenharmony_ci} 136570af302Sopenharmony_ci 137570af302Sopenharmony_ci/** 138570af302Sopenharmony_ci * @tc.name : pthread_mutex_clocklock_0040 139570af302Sopenharmony_ci * @tc.desc : test pthread_mutex_clocklock with no timeout by CLOCK_MONOTONIC 140570af302Sopenharmony_ci * @tc.level : Level 0 141570af302Sopenharmony_ci */ 142570af302Sopenharmony_cistatic void pthread_mutex_clocklock_0040(void) 143570af302Sopenharmony_ci{ 144570af302Sopenharmony_ci pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; 145570af302Sopenharmony_ci pthread_t tid; 146570af302Sopenharmony_ci TEST(pthread_create(&tid, NULL, PthreadClocklockNoOutMonoTime, (void*)&mtx) == 0); 147570af302Sopenharmony_ci 148570af302Sopenharmony_ci TEST(pthread_mutex_lock(&mtx) == 0); 149570af302Sopenharmony_ci Msleep(SLEEP_50_MS); 150570af302Sopenharmony_ci TEST(pthread_mutex_unlock(&mtx) == 0); 151570af302Sopenharmony_ci 152570af302Sopenharmony_ci TEST(pthread_join(tid, NULL) == 0); 153570af302Sopenharmony_ci} 154570af302Sopenharmony_ci 155570af302Sopenharmony_ci/********************************************* Test case dividing line ***********************************************/ 156570af302Sopenharmony_ci 157570af302Sopenharmony_cistatic void *PthreadClocklockOutRealTime2(void *arg) 158570af302Sopenharmony_ci{ 159570af302Sopenharmony_ci pthread_mutex_t *mtx = (pthread_mutex_t*)arg; 160570af302Sopenharmony_ci struct timespec ts = {0}; 161570af302Sopenharmony_ci struct timespec tsNow = {0}; 162570af302Sopenharmony_ci 163570af302Sopenharmony_ci Msleep(SLEEP_20_MS); 164570af302Sopenharmony_ci GetDelayedTimeByClockid(&ts, DELAY_TIME_100_MS, CLOCK_REALTIME); 165570af302Sopenharmony_ci clock_gettime(CLOCK_REALTIME, &tsNow); 166570af302Sopenharmony_ci tsNow.tv_sec += 1; 167570af302Sopenharmony_ci clock_settime(CLOCK_REALTIME, &tsNow); 168570af302Sopenharmony_ci TEST(pthread_mutex_clocklock(mtx, CLOCK_REALTIME, &ts) == ETIMEDOUT); 169570af302Sopenharmony_ci 170570af302Sopenharmony_ci clock_gettime(CLOCK_REALTIME, &tsNow); 171570af302Sopenharmony_ci tsNow.tv_sec -= 1; 172570af302Sopenharmony_ci clock_settime(CLOCK_REALTIME, &tsNow); 173570af302Sopenharmony_ci 174570af302Sopenharmony_ci return arg; 175570af302Sopenharmony_ci} 176570af302Sopenharmony_ci 177570af302Sopenharmony_ci/** 178570af302Sopenharmony_ci * @tc.name : pthread_mutex_clocklock_0050 179570af302Sopenharmony_ci * @tc.desc : test pthread_mutex_clocklock whith timeout by CLOCK_REALTIME 180570af302Sopenharmony_ci * @tc.level : Level 2 181570af302Sopenharmony_ci */ 182570af302Sopenharmony_cistatic void pthread_mutex_clocklock_0050(void) 183570af302Sopenharmony_ci{ 184570af302Sopenharmony_ci pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; 185570af302Sopenharmony_ci pthread_t tid; 186570af302Sopenharmony_ci TEST(pthread_create(&tid, NULL, PthreadClocklockOutRealTime2, (void*)&mtx) == 0); 187570af302Sopenharmony_ci 188570af302Sopenharmony_ci TEST(pthread_mutex_lock(&mtx) == 0); 189570af302Sopenharmony_ci Msleep(SLEEP_50_MS); 190570af302Sopenharmony_ci TEST(pthread_mutex_unlock(&mtx) == 0); 191570af302Sopenharmony_ci 192570af302Sopenharmony_ci TEST(pthread_join(tid, NULL) == 0); 193570af302Sopenharmony_ci} 194570af302Sopenharmony_ci 195570af302Sopenharmony_ci/********************************************* Test case dividing line ***********************************************/ 196570af302Sopenharmony_ci 197570af302Sopenharmony_cistatic void *PthreadClocklockNoOutMonoTime2(void *arg) 198570af302Sopenharmony_ci{ 199570af302Sopenharmony_ci pthread_mutex_t *mtx = (pthread_mutex_t*)arg; 200570af302Sopenharmony_ci struct timespec ts = {0}; 201570af302Sopenharmony_ci 202570af302Sopenharmony_ci Msleep(SLEEP_20_MS); 203570af302Sopenharmony_ci GetDelayedTimeByClockid(&ts, DELAY_TIME_100_MS, CLOCK_MONOTONIC); 204570af302Sopenharmony_ci TEST(pthread_mutex_clocklock(mtx, CLOCK_MONOTONIC, &ts) == 0); 205570af302Sopenharmony_ci return arg; 206570af302Sopenharmony_ci} 207570af302Sopenharmony_ci 208570af302Sopenharmony_ci/** 209570af302Sopenharmony_ci * @tc.name : pthread_mutex_clocklock_0060 210570af302Sopenharmony_ci * @tc.desc : test pthread_mutex_clocklock whith timeout by CLOCK_REALTIME 211570af302Sopenharmony_ci * @tc.level : Level 2 212570af302Sopenharmony_ci */ 213570af302Sopenharmony_cistatic void pthread_mutex_clocklock_0060(void) 214570af302Sopenharmony_ci{ 215570af302Sopenharmony_ci struct timespec tsNow = {0}; 216570af302Sopenharmony_ci pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; 217570af302Sopenharmony_ci pthread_t tid; 218570af302Sopenharmony_ci TEST(pthread_create(&tid, NULL, PthreadClocklockNoOutMonoTime2, (void*)&mtx) == 0); 219570af302Sopenharmony_ci 220570af302Sopenharmony_ci TEST(pthread_mutex_lock(&mtx) == 0); 221570af302Sopenharmony_ci Msleep(SLEEP_50_MS); 222570af302Sopenharmony_ci clock_gettime(CLOCK_MONOTONIC, &tsNow); 223570af302Sopenharmony_ci tsNow.tv_sec += 1; 224570af302Sopenharmony_ci clock_settime(CLOCK_REALTIME, &tsNow); 225570af302Sopenharmony_ci TEST(pthread_mutex_unlock(&mtx) == 0); 226570af302Sopenharmony_ci 227570af302Sopenharmony_ci TEST(pthread_join(tid, NULL) == 0); 228570af302Sopenharmony_ci 229570af302Sopenharmony_ci clock_gettime(CLOCK_REALTIME, &tsNow); 230570af302Sopenharmony_ci tsNow.tv_sec -= 1; 231570af302Sopenharmony_ci clock_settime(CLOCK_REALTIME, &tsNow); 232570af302Sopenharmony_ci} 233570af302Sopenharmony_ci 234570af302Sopenharmony_ci/********************************************* Test case dividing line ***********************************************/ 235570af302Sopenharmony_ci 236570af302Sopenharmony_cistatic void *PthreadTimedlockMonotonicNPOut(void *arg) 237570af302Sopenharmony_ci{ 238570af302Sopenharmony_ci pthread_mutex_t *mtx = (pthread_mutex_t*)arg; 239570af302Sopenharmony_ci struct timespec ts = {0}; 240570af302Sopenharmony_ci struct timespec tsNow = {0}; 241570af302Sopenharmony_ci 242570af302Sopenharmony_ci Msleep(SLEEP_20_MS); 243570af302Sopenharmony_ci GetDelayedTimeByClockid(&ts, DELAY_TIME_100_MS, CLOCK_MONOTONIC); 244570af302Sopenharmony_ci TEST(pthread_mutex_timedlock_monotonic_np(mtx, &ts) == ETIMEDOUT); 245570af302Sopenharmony_ci 246570af302Sopenharmony_ci clock_gettime(CLOCK_MONOTONIC, &tsNow); 247570af302Sopenharmony_ci int timeDiff = GetTimeDiff(tsNow, ts); // calculate time different 248570af302Sopenharmony_ci TEST(timeDiff < 20); 249570af302Sopenharmony_ci return arg; 250570af302Sopenharmony_ci} 251570af302Sopenharmony_ci 252570af302Sopenharmony_ci/** 253570af302Sopenharmony_ci * @tc.name : pthread_mutex_timedlock_monotonic_np_0010 254570af302Sopenharmony_ci * @tc.desc : test pthread_mutex_timedlock_monotonic_np whith timeout by CLOCK_MONOTONIC 255570af302Sopenharmony_ci * @tc.level : Level 0 256570af302Sopenharmony_ci */ 257570af302Sopenharmony_cistatic void pthread_mutex_timedlock_monotonic_np_0010(void) 258570af302Sopenharmony_ci{ 259570af302Sopenharmony_ci pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; 260570af302Sopenharmony_ci pthread_t tid; 261570af302Sopenharmony_ci TEST(pthread_create(&tid, NULL, PthreadTimedlockMonotonicNPOut, (void*)&mtx) == 0); 262570af302Sopenharmony_ci 263570af302Sopenharmony_ci TEST(pthread_mutex_lock(&mtx) == 0); 264570af302Sopenharmony_ci Msleep(SLEEP_50_MS); 265570af302Sopenharmony_ci Msleep(SLEEP_100_MS); 266570af302Sopenharmony_ci TEST(pthread_mutex_unlock(&mtx) == 0); 267570af302Sopenharmony_ci 268570af302Sopenharmony_ci TEST(pthread_join(tid, NULL) == 0); 269570af302Sopenharmony_ci} 270570af302Sopenharmony_ci 271570af302Sopenharmony_ci/********************************************* Test case dividing line ***********************************************/ 272570af302Sopenharmony_ci 273570af302Sopenharmony_cistatic void *PthreadTimedlockMonotonicNPNoOut(void *arg) 274570af302Sopenharmony_ci{ 275570af302Sopenharmony_ci pthread_mutex_t *mtx = (pthread_mutex_t*)arg; 276570af302Sopenharmony_ci struct timespec ts = {0}; 277570af302Sopenharmony_ci 278570af302Sopenharmony_ci Msleep(SLEEP_20_MS); 279570af302Sopenharmony_ci GetDelayedTimeByClockid(&ts, DELAY_TIME_100_MS, CLOCK_MONOTONIC); 280570af302Sopenharmony_ci TEST(pthread_mutex_timedlock_monotonic_np(mtx, &ts) == 0); 281570af302Sopenharmony_ci return arg; 282570af302Sopenharmony_ci} 283570af302Sopenharmony_ci 284570af302Sopenharmony_ci/** 285570af302Sopenharmony_ci * @tc.name : pthread_mutex_timedlock_monotonic_np_0020 286570af302Sopenharmony_ci * @tc.desc : test pthread_mutex_timedlock_monotonic_np with no timeout by CLOCK_MONOTONIC 287570af302Sopenharmony_ci * @tc.level : Level 0 288570af302Sopenharmony_ci */ 289570af302Sopenharmony_cistatic void pthread_mutex_timedlock_monotonic_np_0020(void) 290570af302Sopenharmony_ci{ 291570af302Sopenharmony_ci pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; 292570af302Sopenharmony_ci pthread_t tid; 293570af302Sopenharmony_ci TEST(pthread_create(&tid, NULL, PthreadTimedlockMonotonicNPNoOut, (void*)&mtx) == 0); 294570af302Sopenharmony_ci 295570af302Sopenharmony_ci TEST(pthread_mutex_lock(&mtx) == 0); 296570af302Sopenharmony_ci Msleep(SLEEP_50_MS); 297570af302Sopenharmony_ci TEST(pthread_mutex_unlock(&mtx) == 0); 298570af302Sopenharmony_ci 299570af302Sopenharmony_ci TEST(pthread_join(tid, NULL) == 0); 300570af302Sopenharmony_ci} 301570af302Sopenharmony_ci 302570af302Sopenharmony_ci/********************************************* Test case dividing line ***********************************************/ 303570af302Sopenharmony_ci 304570af302Sopenharmony_ci/** 305570af302Sopenharmony_ci * @tc.name : pthread_mutex_timedlock_monotonic_np_0030 306570af302Sopenharmony_ci * @tc.desc : test pthread_mutex_timedlock_monotonic_np_0030 with invalid args 307570af302Sopenharmony_ci * @tc.level : Level 2 308570af302Sopenharmony_ci */ 309570af302Sopenharmony_cistatic void pthread_mutex_timedlock_monotonic_np_0030(void) 310570af302Sopenharmony_ci{ 311570af302Sopenharmony_ci pthread_mutex_t *mtx = (pthread_mutex_t *)NULL; 312570af302Sopenharmony_ci struct timespec ts = {0}; 313570af302Sopenharmony_ci EXPECT_EQ(pthread_mutex_timedlock_monotonic_np(mtx, &ts), EINVAL); 314570af302Sopenharmony_ci} 315570af302Sopenharmony_ci 316570af302Sopenharmony_ci/********************************************* Test case dividing line ***********************************************/ 317570af302Sopenharmony_ci 318570af302Sopenharmony_cistatic void *PthreadLockTimeoutNPOut(void *arg) 319570af302Sopenharmony_ci{ 320570af302Sopenharmony_ci pthread_mutex_t *mtx = (pthread_mutex_t*)arg; 321570af302Sopenharmony_ci unsigned ms = DELAY_TIME_100_MS; 322570af302Sopenharmony_ci struct timespec ts = {0}; 323570af302Sopenharmony_ci struct timespec tsNow = {0}; 324570af302Sopenharmony_ci 325570af302Sopenharmony_ci Msleep(SLEEP_20_MS); 326570af302Sopenharmony_ci GetDelayedTimeByClockid(&ts, ms, CLOCK_MONOTONIC); 327570af302Sopenharmony_ci TEST(pthread_mutex_lock_timeout_np(mtx, ms) == ETIMEDOUT); 328570af302Sopenharmony_ci 329570af302Sopenharmony_ci clock_gettime(CLOCK_MONOTONIC, &tsNow); 330570af302Sopenharmony_ci int timeDiff = GetTimeDiff(tsNow, ts); // calculate time different 331570af302Sopenharmony_ci TEST(timeDiff < 20); 332570af302Sopenharmony_ci return arg; 333570af302Sopenharmony_ci} 334570af302Sopenharmony_ci 335570af302Sopenharmony_ci/** 336570af302Sopenharmony_ci * @tc.name : pthread_mutex_lock_timeout_np_0010 337570af302Sopenharmony_ci * @tc.desc : test pthread_mutex_lock_timeout_np whith timeout by CLOCK_MONOTONIC 338570af302Sopenharmony_ci * @tc.level : Level 0 339570af302Sopenharmony_ci */ 340570af302Sopenharmony_cistatic void pthread_mutex_lock_timeout_np_0010(void) 341570af302Sopenharmony_ci{ 342570af302Sopenharmony_ci pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; 343570af302Sopenharmony_ci pthread_t tid; 344570af302Sopenharmony_ci TEST(pthread_create(&tid, NULL, PthreadLockTimeoutNPOut, (void*)&mtx) == 0); 345570af302Sopenharmony_ci 346570af302Sopenharmony_ci TEST(pthread_mutex_lock(&mtx) == 0); 347570af302Sopenharmony_ci Msleep(SLEEP_50_MS); 348570af302Sopenharmony_ci Msleep(SLEEP_100_MS); 349570af302Sopenharmony_ci TEST(pthread_mutex_unlock(&mtx) == 0); 350570af302Sopenharmony_ci 351570af302Sopenharmony_ci TEST(pthread_join(tid, NULL) == 0); 352570af302Sopenharmony_ci} 353570af302Sopenharmony_ci 354570af302Sopenharmony_ci/********************************************* Test case dividing line ***********************************************/ 355570af302Sopenharmony_ci 356570af302Sopenharmony_cistatic void *PthreadLockTimeoutNPNoOut(void *arg) 357570af302Sopenharmony_ci{ 358570af302Sopenharmony_ci pthread_mutex_t *mtx = (pthread_mutex_t*)arg; 359570af302Sopenharmony_ci unsigned ms = DELAY_TIME_100_MS; 360570af302Sopenharmony_ci struct timespec ts = {0}; 361570af302Sopenharmony_ci 362570af302Sopenharmony_ci Msleep(SLEEP_20_MS); 363570af302Sopenharmony_ci GetDelayedTimeByClockid(&ts, ms, CLOCK_MONOTONIC); 364570af302Sopenharmony_ci TEST(pthread_mutex_lock_timeout_np(mtx, ms) == 0); 365570af302Sopenharmony_ci return arg; 366570af302Sopenharmony_ci} 367570af302Sopenharmony_ci 368570af302Sopenharmony_ci/** 369570af302Sopenharmony_ci * @tc.name : pthread_mutex_lock_timeout_np_0020 370570af302Sopenharmony_ci * @tc.desc : test pthread_mutex_lock_timeout_np with no timeout by CLOCK_MONOTONIC 371570af302Sopenharmony_ci * @tc.level : Level 0 372570af302Sopenharmony_ci */ 373570af302Sopenharmony_cistatic void pthread_mutex_lock_timeout_np_0020(void) 374570af302Sopenharmony_ci{ 375570af302Sopenharmony_ci pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; 376570af302Sopenharmony_ci pthread_t tid; 377570af302Sopenharmony_ci TEST(pthread_create(&tid, NULL, PthreadLockTimeoutNPNoOut, (void*)&mtx) == 0); 378570af302Sopenharmony_ci 379570af302Sopenharmony_ci TEST(pthread_mutex_lock(&mtx) == 0); 380570af302Sopenharmony_ci Msleep(SLEEP_50_MS); 381570af302Sopenharmony_ci TEST(pthread_mutex_unlock(&mtx) == 0); 382570af302Sopenharmony_ci 383570af302Sopenharmony_ci TEST(pthread_join(tid, NULL) == 0); 384570af302Sopenharmony_ci} 385570af302Sopenharmony_ci 386570af302Sopenharmony_ciint main(void) 387570af302Sopenharmony_ci{ 388570af302Sopenharmony_ci pthread_mutex_clocklock_0010(); 389570af302Sopenharmony_ci pthread_mutex_clocklock_0020(); 390570af302Sopenharmony_ci pthread_mutex_clocklock_0030(); 391570af302Sopenharmony_ci pthread_mutex_clocklock_0040(); 392570af302Sopenharmony_ci pthread_mutex_clocklock_0050(); 393570af302Sopenharmony_ci pthread_mutex_clocklock_0060(); 394570af302Sopenharmony_ci pthread_mutex_timedlock_monotonic_np_0010(); 395570af302Sopenharmony_ci pthread_mutex_timedlock_monotonic_np_0020(); 396570af302Sopenharmony_ci pthread_mutex_timedlock_monotonic_np_0030(); 397570af302Sopenharmony_ci pthread_mutex_lock_timeout_np_0010(); 398570af302Sopenharmony_ci pthread_mutex_lock_timeout_np_0020(); 399570af302Sopenharmony_ci 400570af302Sopenharmony_ci return t_status; 401570af302Sopenharmony_ci}