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