1 /* 2 * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved. 3 * Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without modification, 6 * are permitted provided that the following conditions are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright notice, this list of 9 * conditions and the following disclaimer. 10 * 11 * 2. Redistributions in binary form must reproduce the above copyright notice, this list 12 * of conditions and the following disclaimer in the documentation and/or other materials 13 * provided with the distribution. 14 * 15 * 3. Neither the name of the copyright holder nor the names of its contributors may be used 16 * to endorse or promote products derived from this software without specific prior written 17 * permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 21 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 24 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 25 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 26 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 27 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 28 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 29 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 */ 31 #ifndef _IT_POSIX_PTHREAD_H 32 #define _IT_POSIX_PTHREAD_H 33 34 #include "sched.h" 35 #include "signal.h" 36 #include "semaphore.h" 37 #include "sched.h" 38 #include "osTest.h" 39 #include "pthread.h" 40 #include "limits.h" 41 #include "unistd.h" 42 #include "mqueue.h" 43 #include "signal.h" 44 #include "sys/time.h" 45 46 #ifndef VERBOSE 47 #define VERBOSE 1 48 #endif 49 50 /* Some routines are part of the XSI Extensions */ 51 52 #define LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE (0x6000) 53 #define LOS_HwiCreate(ID, prio, mode, Func, arg) (-1) 54 #define HalIrqMask(ID) 55 #define TEST_TEST_HwiDelete(ID, NULL) 56 #define TEST_HwiTrigger(HWI_NUM_TEST) 57 #define LOS_TaskLock() 58 #define LOS_TaskUnlock() 59 #define LOS_MS2Tick(ms) ((ms) / 10) 60 #define OS_TASK_PRIORITY_HIGHEST 0 61 #define OS_TASK_PRIORITY_LOWEST 31 62 63 #define PTHREAD_NO_ERROR 0 64 #define PTHREAD_IS_ERROR (-1) 65 #define PTHREAD_SIGNAL_SUPPORT 0 /* 0 means that not support the signal */ 66 #define PTHREAD_PRIORITY_TEST 20 67 #define PTHREAD_DEFAULT_STACK_SIZE (LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE) 68 #define PTHREAD_KEY_NUM 10 69 #define THREAD_NUM 3 70 #define PTHREAD_TIMEOUT (THREAD_NUM * 2) 71 #define PTHREAD_INTHREAD_TEST 0 /* Control going to or is already for Thread */ 72 #define PTHREAD_INMAIN_TEST 1 /* Control going to or is already for Main */ 73 #define INVALID_PSHARED_VALUE (-100) 74 #define NUM_OF_CONDATTR 10 75 #define RUNTIME 5 76 #define PTHREAD_THREADS_NUM 3 77 #define TCOUNT 5 // Number of single-threaded polling 78 #define COUNT_LIMIT 7 // The number of times the signal is sent 79 #define HIGH_PRIORITY 5 80 #define LOW_PRIORITY 10 81 #define PTHREAD_EXIT_VALUE ((void *)100) /* The return code of the thread when using pthread_exit(). */ 82 83 #define PTHREAD_EXISTED_NUM TASK_EXISTED_NUM 84 #define PTHREAD_EXISTED_SEM_NUM SEM_EXISTED_NUM 85 86 /* We are testing conformance to IEEE Std 1003.1, 2003 Edition */ 87 #define _POSIX_C_SOURCE 200112L 88 89 #define uart_printf_func printf 90 91 /* The value below shall be >= to the # of CPU on the test architecture */ 92 #define NCPU (4) 93 94 #define PRIORITY_OTHER (-1) 95 #define PRIORITY_FIFO 20 96 #define PRIORITY_RR 20 97 98 #define PTHREAD_TEST_BUG printf 99 100 #define CASE(det, expl, scp, spa, sco, sta, gua, ssi, desc, res) \ 101 { \ 102 { 0 }, det, expl, scp, spa, sco, sta, gua, ssi, desc, NULL, res, \ 103 { \ 104 0 \ 105 } \ 106 } 107 #define CASE_POS(det, expl, scp, spa, sco, sta, gua, ssi, desc) CASE(det, expl, scp, spa, sco, sta, gua, ssi, desc, 0) 108 #define CASE_NEG(det, expl, scp, spa, sco, sta, gua, ssi, desc) CASE(det, expl, scp, spa, sco, sta, gua, ssi, desc, 1) 109 #define CASE_UNK(det, expl, scp, spa, sco, sta, gua, ssi, desc) CASE(det, expl, scp, spa, sco, sta, gua, ssi, desc, 2) 110 111 struct params { 112 INT32 policy; 113 INT32 priority; 114 char *policy_label; 115 INT32 status; 116 }; 117 118 typedef struct { 119 /* 120 * Object to hold the given configuration, 121 * and which will be used to create the threads 122 */ 123 pthread_attr_t ta; 124 125 /* General parameters */ 126 /* 0 => joinable; 1 => detached */ 127 INT32 detached; 128 129 /* Scheduling parameters */ 130 /* 131 * 0 => sched policy is inherited; 132 * 1 => sched policy from the attr param 133 */ 134 INT32 explicitsched; 135 /* 0 => default; 1=> SCHED_FIFO; 2=> SCHED_RR */ 136 INT32 schedpolicy; 137 /* 138 * 0 => default sched param; 139 * 1 => max value for sched param; 140 * -1 => min value for sched param 141 */ 142 INT32 schedparam; 143 /* 144 * 0 => default contension scope; 145 * 1 => alternative contension scope 146 */ 147 INT32 altscope; 148 149 /* Stack parameters */ 150 /* 0 => system manages the stack; 1 => stack is provided */ 151 INT32 altstack; 152 /* 153 * 0 => default guardsize; 154 * 1=> guardsize is 0; 155 * 2=> guard is 1 page 156 * -- this setting only affect system stacks (not user's). 157 */ 158 INT32 guard; 159 /* 160 * 0 => default stack size; 161 * 1 => stack size specified (min value) 162 * -- ignored when stack is provided 163 */ 164 INT32 altsize; 165 166 /* Additionnal information */ 167 /* object description */ 168 char *descr; 169 /* Stores the stack start when an alternate stack is required */ 170 void *bottom; 171 /* 172 * This thread creation is expected to: 173 * 0 => succeed; 1 => fail; 2 => unknown 174 */ 175 INT32 result; 176 /* 177 * This semaphore is used to signal the end of 178 * the detached threads execution 179 */ 180 sem_t sem; 181 } __scenario; 182 183 #define NSCENAR 10 // (sizeof(scenarii)/sizeof(scenarii[0])) 184 185 extern __scenario g_scenarii[]; 186 187 extern pthread_key_t g_key; 188 extern pthread_key_t g_key1; 189 extern pthread_key_t g_key2; 190 extern pthread_key_t g_pthreadKeyTest[PTHREAD_KEY_NUM]; 191 extern pthread_t g_newTh; 192 extern pthread_t g_newTh2; 193 extern UINT32 g_taskMaxNum; 194 extern pthread_once_t g_onceControl; 195 extern pthread_cond_t g_pthreadCondTest1; 196 extern pthread_mutex_t g_pthreadMutexTest1; 197 extern pthread_mutex_t g_pthreadMutexTest2; 198 extern INT32 g_startNum; 199 extern INT32 g_wakenNum; 200 extern INT32 g_t1Start; 201 extern INT32 g_signaled; 202 extern INT32 g_wokenUp; 203 extern INT32 g_lowDone; 204 extern INT32 g_pthreadSem; 205 extern INT32 g_pthreadScopeValue; 206 extern INT32 g_pthreadSchedInherit; 207 extern INT32 g_pthreadSchedPolicy; 208 209 extern sem_t g_pthreadSem1; 210 extern sem_t g_pthreadSem2; 211 212 extern pthread_t g_pthreadTestTh; 213 214 extern INT32 g_iCunitErrCode; 215 extern INT32 g_iCunitErrLineNo; 216 217 #ifdef LOSCFG_AARCH64 218 #define PTHREAD_STACK_MIN_TEST (PTHREAD_STACK_MIN * 3) 219 #else 220 #define PTHREAD_STACK_MIN_TEST PTHREAD_STACK_MIN 221 #endif 222 223 extern pthread_t g_Test_new_th; 224 225 struct testdata { 226 pthread_mutex_t mutex; 227 pthread_cond_t cond; 228 }; 229 extern struct testdata g_td; 230 231 extern int map_errno(UINT32 err); 232 extern void posix_signal_start(void); 233 234 VOID ScenarInit(VOID); 235 VOID ScenarFini(VOID); 236 pthread_t TestPthreadSelf(void); 237 238 extern UINT32 PosixPthreadInit(pthread_attr_t *attr, INT32 pri); 239 240 #if defined(LOSCFG_USER_TEST_SMOKE) 241 VOID ItPosixPthread003(VOID); 242 VOID ItPosixPthread004(VOID); 243 VOID ItPosixPthread005(VOID); 244 VOID ItPosixPthread006(VOID); 245 VOID IT_POSIX_PTHREAD_009(VOID); 246 VOID ItPosixPthread018(VOID); 247 VOID ItPosixPthread019(VOID); 248 VOID ItPosixPthread020(VOID); 249 VOID ItPosixPthread021(VOID); 250 VOID ItPosixPthread022(VOID); 251 #endif 252 253 #if defined(LOSCFG_USER_TEST_FULL) 254 VOID ItPosixPthread001(VOID); 255 VOID ItPosixPthread002(VOID); 256 VOID ItPosixPthread007(VOID); 257 VOID IT_POSIX_PTHREAD_008(VOID); 258 VOID ItPosixPthread010(VOID); 259 VOID ItPosixPthread011(VOID); 260 VOID ItPosixPthread013(VOID); 261 VOID ItPosixPthread023(VOID); 262 VOID ItPosixPthread025(VOID); 263 VOID ItPosixPthread026(VOID); 264 VOID ItPosixPthread027(VOID); 265 VOID ItPosixPthread028(VOID); 266 VOID ItPosixPthread029(VOID); 267 VOID ItPosixPthread030(VOID); 268 VOID ItPosixPthread031(VOID); 269 VOID IT_POSIX_PTHREAD_032(VOID); 270 VOID IT_POSIX_PTHREAD_033(VOID); 271 VOID ItPosixPthread034(VOID); 272 VOID ItPosixPthread035(VOID); 273 VOID ItPosixPthread039(VOID); 274 VOID ItPosixPthread040(VOID); 275 VOID IT_POSIX_PTHREAD_041(VOID); 276 VOID ItPosixPthread042(VOID); 277 VOID ItPosixPthread044(VOID); 278 VOID ItPosixPthread045(VOID); 279 VOID ItPosixPthread046(VOID); 280 VOID IT_POSIX_PTHREAD_047(VOID); 281 VOID IT_POSIX_PTHREAD_048(VOID); 282 VOID IT_POSIX_PTHREAD_049(VOID); 283 VOID IT_POSIX_PTHREAD_050(VOID); 284 VOID ItPosixPthread051(VOID); 285 VOID ItPosixPthread052(VOID); 286 VOID ItPosixPthread053(VOID); 287 VOID ItPosixPthread054(VOID); 288 VOID ItPosixPthread055(VOID); 289 VOID IT_POSIX_PTHREAD_056(VOID); 290 VOID ItPosixPthread057(VOID); 291 VOID IT_POSIX_PTHREAD_058(VOID); 292 VOID ItPosixPthread059(VOID); 293 VOID ItPosixPthread060(VOID); 294 VOID ItPosixPthread061(VOID); 295 VOID ItPosixPthread062(VOID); 296 VOID ItPosixPthread063(VOID); 297 VOID ItPosixPthread064(VOID); 298 VOID ItPosixPthread066(VOID); 299 VOID IT_POSIX_PTHREAD_068(VOID); 300 VOID ItPosixPthread069(VOID); 301 VOID ItPosixPthread070(VOID); 302 VOID ItPosixPthread071(VOID); 303 VOID ItPosixPthread072(VOID); 304 VOID ItPosixPthread073(VOID); 305 VOID ItPosixPthread074(VOID); 306 VOID IT_POSIX_PTHREAD_075(VOID); 307 VOID ItPosixPthread078(VOID); 308 VOID ItPosixPthread079(VOID); 309 VOID ItPosixPthread080(VOID); 310 VOID ItPosixPthread081(VOID); 311 VOID ItPosixPthread082(VOID); 312 VOID ItPosixPthread083(VOID); 313 VOID ItPosixPthread084(VOID); 314 VOID ItPosixPthread085(VOID); 315 VOID ItPosixPthread087(VOID); 316 VOID ItPosixPthread088(VOID); 317 VOID ItPosixPthread089(VOID); 318 VOID ItPosixPthread090(VOID); 319 VOID ItPosixPthread091(VOID); 320 VOID ItPosixPthread092(VOID); 321 VOID ItPosixPthread094(VOID); 322 VOID ItPosixPthread095(VOID); 323 VOID IT_POSIX_PTHREAD_098(VOID); 324 VOID IT_POSIX_PTHREAD_101(VOID); 325 VOID IT_POSIX_PTHREAD_102(VOID); 326 VOID IT_POSIX_PTHREAD_103(VOID); 327 VOID IT_POSIX_PTHREAD_105(VOID); 328 VOID ItPosixPthread106(VOID); 329 VOID ItPosixPthread107(VOID); 330 VOID IT_POSIX_PTHREAD_108(VOID); 331 VOID IT_POSIX_PTHREAD_110(VOID); 332 VOID IT_POSIX_PTHREAD_112(VOID); 333 VOID ItPosixPthread116(VOID); 334 VOID ItPosixPthread121(VOID); 335 VOID ItPosixPthread123(VOID); 336 VOID ItPosixPthread124(VOID); 337 VOID ItPosixPthread125(VOID); 338 VOID ItPosixPthread127(VOID); 339 VOID IT_POSIX_PTHREAD_128(VOID); 340 VOID ItPosixPthread129(VOID); 341 VOID ItPosixPthread132(VOID); 342 VOID ItPosixPthread133(VOID); 343 VOID ItPosixPthread134(VOID); 344 VOID ItPosixPthread136(VOID); 345 VOID ItPosixPthread138(VOID); 346 VOID ItPosixPthread141(VOID); 347 VOID ItPosixPthread142(VOID); 348 VOID ItPosixPthread144(VOID); 349 VOID IT_POSIX_PTHREAD_150(VOID); 350 VOID ItPosixPthread152(VOID); 351 VOID ItPosixPthread154(VOID); 352 VOID ItPosixPthread166(VOID); 353 VOID ItPosixPthread167(VOID); 354 VOID ItPosixPthread173(VOID); 355 VOID ItPosixPthread175(VOID); 356 VOID ItPosixPthread176(VOID); 357 VOID ItPosixPthread177(VOID); 358 VOID ItPosixPthread182(VOID); 359 VOID ItPosixPthread185(VOID); 360 VOID ItPosixPthread186(VOID); 361 VOID ItPosixPthread187(VOID); 362 VOID ItPosixPthread188(VOID); 363 VOID ItPosixPthread193(VOID); 364 VOID ItPosixPthread194(VOID); 365 VOID IT_POSIX_PTHREAD_197(VOID); 366 VOID IT_POSIX_PTHREAD_198(VOID); 367 VOID ItPosixPthread200(VOID); 368 VOID ItPosixPthread203(VOID); 369 VOID ItPosixPthread204(VOID); 370 VOID ItPosixPthread205(VOID); 371 VOID ItPosixPthread206(VOID); 372 VOID IT_POSIX_PTHREAD_208(VOID); 373 VOID ItPosixPthread209(VOID); 374 VOID IT_POSIX_PTHREAD_211(VOID); 375 VOID ItPosixPthread213(VOID); 376 VOID IT_POSIX_PTHREAD_214(VOID); 377 VOID IT_POSIX_PTHREAD_215(VOID); 378 VOID ItPosixPthread217(VOID); 379 VOID ItPosixPthread218(VOID); 380 VOID ItPosixPthread219(VOID); 381 VOID ItPosixPthread221(VOID); 382 VOID ItPosixPthread224(VOID); 383 VOID ItPosixPthread226(VOID); 384 VOID ItPosixPthread233(VOID); 385 VOID IT_POSIX_PTHREAD_237(VOID); 386 VOID ItPosixPthread238(VOID); 387 VOID ItPosixPthread239(VOID); 388 VOID ItPosixPthread240(VOID); 389 VOID ItPosixPthread241(VOID); 390 VOID IT_POSIX_PTHREAD_246(VOID); 391 #endif 392 393 #if defined(LOSCFG_USER_TEST_PRESSURE) 394 VOID ItPosixPthread065(VOID); 395 #endif 396 #if defined(LOSCFG_USER_TEST_LLT) 397 VOID LltPosixPthread001(VOID); 398 VOID LltPosixPthread002(VOID); 399 VOID LltPosixPthread003(VOID); 400 VOID LltPosixPthread004(VOID); 401 VOID ItPosixPthread012(VOID); 402 VOID ItPosixPthread014(VOID); 403 VOID ItPosixPthread015(VOID); 404 VOID ItPosixPthread016(VOID); 405 VOID ItPosixPthread017(VOID); 406 VOID ItPosixPthread024(VOID); 407 VOID ItPosixPthread036(VOID); 408 VOID ItPosixPthread037(VOID); 409 VOID ItPosixPthread038(VOID); 410 VOID ItPosixPthread043(VOID); 411 VOID ItPosixPthread067(VOID); 412 VOID ItPosixPthread076(VOID); 413 VOID ItPosixPthread077(VOID); 414 VOID ItPosixPthread086(VOID); 415 VOID ItPosixPthread090(VOID); 416 VOID ItPosixPthread093(VOID); 417 VOID ItPosixPthread096(VOID); 418 VOID ItPosixPthread097(VOID); 419 VOID ItPosixPthread099(VOID); 420 VOID ItPosixPthread100(VOID); 421 VOID ItPosixPthread104(VOID); 422 VOID ItPosixPthread109(VOID); 423 VOID ItPosixPthread111(VOID); 424 VOID ItPosixPthread113(VOID); 425 VOID ItPosixPthread114(VOID); 426 VOID ItPosixPthread115(VOID); 427 VOID ItPosixPthread169(VOID); 428 VOID ItPosixPthread170(VOID); 429 VOID ItPosixPthread172(VOID); 430 VOID ItPosixPthread179(VOID); 431 VOID ItPosixPthread180(VOID); 432 VOID ItPosixPthread181(VOID); 433 VOID ItPosixPthread184(VOID); 434 VOID ItPosixPthread190(VOID); 435 VOID ItPosixPthread191(VOID); 436 VOID ItPosixPthread199(VOID); 437 VOID ItPosixPthread201(VOID); 438 VOID ItPosixPthread202(VOID); 439 #endif 440 441 #endif /* _IT_POSIX_PTHREAD_H */ 442