1f08c3bdfSopenharmony_ci/******************************************************************************
2f08c3bdfSopenharmony_ci *
3f08c3bdfSopenharmony_ci *	 Copyright © International Business Machines	Corp., 2005, 2008
4f08c3bdfSopenharmony_ci *
5f08c3bdfSopenharmony_ci *	 This program is free software;	you can redistribute it and/or modify
6f08c3bdfSopenharmony_ci *	 it under the terms of the GNU General Public License as published by
7f08c3bdfSopenharmony_ci *	 the Free Software Foundation; either version 2 of the License, or
8f08c3bdfSopenharmony_ci *	 (at your option) any later version.
9f08c3bdfSopenharmony_ci *
10f08c3bdfSopenharmony_ci *	 This program is distributed in the hope that it will be useful,
11f08c3bdfSopenharmony_ci *	 but WITHOUT ANY WARRANTY;	without even the implied warranty of
12f08c3bdfSopenharmony_ci *	 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	See
13f08c3bdfSopenharmony_ci *	 the GNU General Public License for more details.
14f08c3bdfSopenharmony_ci *
15f08c3bdfSopenharmony_ci *	 You should have received a copy of the GNU General Public License
16f08c3bdfSopenharmony_ci *	 along with this program;	if not, write to the Free Software
17f08c3bdfSopenharmony_ci *	 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18f08c3bdfSopenharmony_ci *
19f08c3bdfSopenharmony_ci * NAME
20f08c3bdfSopenharmony_ci *	testpi-3.c
21f08c3bdfSopenharmony_ci *
22f08c3bdfSopenharmony_ci * DESCRIPTION
23f08c3bdfSopenharmony_ci *
24f08c3bdfSopenharmony_ci *
25f08c3bdfSopenharmony_ci * USAGE:
26f08c3bdfSopenharmony_ci *	Use run_auto.sh script in current directory to build and run test.
27f08c3bdfSopenharmony_ci *
28f08c3bdfSopenharmony_ci * AUTHOR
29f08c3bdfSopenharmony_ci *
30f08c3bdfSopenharmony_ci *
31f08c3bdfSopenharmony_ci * HISTORY
32f08c3bdfSopenharmony_ci *
33f08c3bdfSopenharmony_ci *
34f08c3bdfSopenharmony_ci *****************************************************************************/
35f08c3bdfSopenharmony_ci
36f08c3bdfSopenharmony_ci#include <stdio.h>
37f08c3bdfSopenharmony_ci#include <stdlib.h>
38f08c3bdfSopenharmony_ci#include <string.h>
39f08c3bdfSopenharmony_ci#include <sched.h>
40f08c3bdfSopenharmony_ci#include <pthread.h>
41f08c3bdfSopenharmony_ci#include <sys/types.h>
42f08c3bdfSopenharmony_ci#include <sys/syscall.h>
43f08c3bdfSopenharmony_ci#include <unistd.h>
44f08c3bdfSopenharmony_ci#include <librttest.h>
45f08c3bdfSopenharmony_ci
46f08c3bdfSopenharmony_civoid usage(void)
47f08c3bdfSopenharmony_ci{
48f08c3bdfSopenharmony_ci	rt_help();
49f08c3bdfSopenharmony_ci	printf("testpi-3 specific options:\n");
50f08c3bdfSopenharmony_ci}
51f08c3bdfSopenharmony_ci
52f08c3bdfSopenharmony_ciint parse_args(int c, char *v)
53f08c3bdfSopenharmony_ci{
54f08c3bdfSopenharmony_ci
55f08c3bdfSopenharmony_ci	int handled = 1;
56f08c3bdfSopenharmony_ci	switch (c) {
57f08c3bdfSopenharmony_ci	case 'h':
58f08c3bdfSopenharmony_ci		usage();
59f08c3bdfSopenharmony_ci		exit(0);
60f08c3bdfSopenharmony_ci	default:
61f08c3bdfSopenharmony_ci		handled = 0;
62f08c3bdfSopenharmony_ci		break;
63f08c3bdfSopenharmony_ci	}
64f08c3bdfSopenharmony_ci	return handled;
65f08c3bdfSopenharmony_ci}
66f08c3bdfSopenharmony_ci
67f08c3bdfSopenharmony_ciint gettid(void)
68f08c3bdfSopenharmony_ci{
69f08c3bdfSopenharmony_ci	return syscall(__NR_gettid);
70f08c3bdfSopenharmony_ci}
71f08c3bdfSopenharmony_ci
72f08c3bdfSopenharmony_citypedef void *(*entrypoint_t) (void *);
73f08c3bdfSopenharmony_ci
74f08c3bdfSopenharmony_ci#define THREAD_STOP		1
75f08c3bdfSopenharmony_ci
76f08c3bdfSopenharmony_cipthread_mutex_t glob_mutex;
77f08c3bdfSopenharmony_ci
78f08c3bdfSopenharmony_ci/*typedef struct thread {
79f08c3bdfSopenharmony_ci	int priority;
80f08c3bdfSopenharmony_ci	int policy;
81f08c3bdfSopenharmony_ci	entrypoint_t func;
82f08c3bdfSopenharmony_ci	pthread_attr_t attr;
83f08c3bdfSopenharmony_ci	pthread_t handle;
84f08c3bdfSopenharmony_ci	pthread_mutex_t mutex;
85f08c3bdfSopenharmony_ci	pthread_cond_t cond;
86f08c3bdfSopenharmony_ci	int flags;
87f08c3bdfSopenharmony_ci	int count;
88f08c3bdfSopenharmony_ci} Thread;*/
89f08c3bdfSopenharmony_ci
90f08c3bdfSopenharmony_citypedef struct thread Thread;
91f08c3bdfSopenharmony_ci
92f08c3bdfSopenharmony_ciThread arg1, arg2, arg3, arg4, arg5;
93f08c3bdfSopenharmony_ci
94f08c3bdfSopenharmony_ciint strartThread(Thread * thr);
95f08c3bdfSopenharmony_civoid stopThread(Thread * thr);
96f08c3bdfSopenharmony_civoid joinThread(Thread * thr);
97f08c3bdfSopenharmony_ci
98f08c3bdfSopenharmony_civoid *func_nonrt(void *arg)
99f08c3bdfSopenharmony_ci{
100f08c3bdfSopenharmony_ci	Thread *pthr = (Thread *) arg;
101f08c3bdfSopenharmony_ci	int rc, i, j, policy, tid = gettid();
102f08c3bdfSopenharmony_ci	struct sched_param schedp;
103f08c3bdfSopenharmony_ci	cpu_set_t mask;
104f08c3bdfSopenharmony_ci	CPU_ZERO(&mask);
105f08c3bdfSopenharmony_ci	CPU_SET(0, &mask);
106f08c3bdfSopenharmony_ci
107f08c3bdfSopenharmony_ci	rc = sched_setaffinity(0, sizeof(mask), &mask);
108f08c3bdfSopenharmony_ci	if (rc < 0) {
109f08c3bdfSopenharmony_ci		printf("Thread %d: Can't set affinity: %d %s\n", tid, rc,
110f08c3bdfSopenharmony_ci		       strerror(rc));
111f08c3bdfSopenharmony_ci		exit(-1);
112f08c3bdfSopenharmony_ci	}
113f08c3bdfSopenharmony_ci	rc = sched_getaffinity(0, sizeof(mask), &mask);
114f08c3bdfSopenharmony_ci
115f08c3bdfSopenharmony_ci	printf("Thread started %d on CPU %ld\n", pthr->priority,
116f08c3bdfSopenharmony_ci	       (long)mask.__bits[0]);
117f08c3bdfSopenharmony_ci	pthread_getschedparam(pthr->pthread, &policy, &schedp);
118f08c3bdfSopenharmony_ci	printf("Thread running %d\n", pthr->priority);
119f08c3bdfSopenharmony_ci
120f08c3bdfSopenharmony_ci	while (1) {
121f08c3bdfSopenharmony_ci		pthread_mutex_lock(&glob_mutex);
122f08c3bdfSopenharmony_ci		printf
123f08c3bdfSopenharmony_ci		    ("Thread %d at start pthread pol %d pri %d - Got global lock\n",
124f08c3bdfSopenharmony_ci		     pthr->priority, policy, schedp.sched_priority);
125f08c3bdfSopenharmony_ci		sleep(2);
126f08c3bdfSopenharmony_ci		for (i = 0; i < 10000; i++) {
127f08c3bdfSopenharmony_ci			if ((i % 100) == 0) {
128f08c3bdfSopenharmony_ci				sched_getparam(tid, &schedp);
129f08c3bdfSopenharmony_ci				policy = sched_getscheduler(tid);
130f08c3bdfSopenharmony_ci				printf("Thread %d(%d) loop %d pthread pol %d "
131f08c3bdfSopenharmony_ci				       "pri %d\n", tid, pthr->priority, i,
132f08c3bdfSopenharmony_ci				       policy, schedp.sched_priority);
133f08c3bdfSopenharmony_ci				fflush(NULL);
134f08c3bdfSopenharmony_ci			}
135f08c3bdfSopenharmony_ci			pthr->id++;
136f08c3bdfSopenharmony_ci			for (j = 0; j < 5000; j++) {
137f08c3bdfSopenharmony_ci				pthread_mutex_lock(&(pthr->mutex));
138f08c3bdfSopenharmony_ci				pthread_mutex_unlock(&(pthr->mutex));
139f08c3bdfSopenharmony_ci			}
140f08c3bdfSopenharmony_ci		}
141f08c3bdfSopenharmony_ci		pthread_mutex_unlock(&glob_mutex);
142f08c3bdfSopenharmony_ci		sched_yield();
143f08c3bdfSopenharmony_ci	}
144f08c3bdfSopenharmony_ci	return NULL;
145f08c3bdfSopenharmony_ci}
146f08c3bdfSopenharmony_ci
147f08c3bdfSopenharmony_civoid *func_rt(void *arg)
148f08c3bdfSopenharmony_ci{
149f08c3bdfSopenharmony_ci	Thread *pthr = (Thread *) arg;
150f08c3bdfSopenharmony_ci	int rc, i, j, policy, tid = gettid();
151f08c3bdfSopenharmony_ci	struct sched_param schedp;
152f08c3bdfSopenharmony_ci	cpu_set_t mask;
153f08c3bdfSopenharmony_ci	CPU_ZERO(&mask);
154f08c3bdfSopenharmony_ci	CPU_SET(0, &mask);
155f08c3bdfSopenharmony_ci
156f08c3bdfSopenharmony_ci	rc = sched_setaffinity(0, sizeof(mask), &mask);
157f08c3bdfSopenharmony_ci	if (rc < 0) {
158f08c3bdfSopenharmony_ci		printf("Thread %d: Can't set affinity: %d %s\n", tid, rc,
159f08c3bdfSopenharmony_ci		       strerror(rc));
160f08c3bdfSopenharmony_ci		exit(-1);
161f08c3bdfSopenharmony_ci	}
162f08c3bdfSopenharmony_ci	rc = sched_getaffinity(0, sizeof(mask), &mask);
163f08c3bdfSopenharmony_ci
164f08c3bdfSopenharmony_ci	printf("Thread started %d on CPU %ld\n", pthr->priority,
165f08c3bdfSopenharmony_ci	       (long)mask.__bits[0]);
166f08c3bdfSopenharmony_ci	pthread_getschedparam(pthr->pthread, &policy, &schedp);
167f08c3bdfSopenharmony_ci
168f08c3bdfSopenharmony_ci	while (1) {
169f08c3bdfSopenharmony_ci		sleep(2);
170f08c3bdfSopenharmony_ci		printf("Thread running %d\n", pthr->priority);
171f08c3bdfSopenharmony_ci		pthread_mutex_lock(&glob_mutex);
172f08c3bdfSopenharmony_ci		printf
173f08c3bdfSopenharmony_ci		    ("Thread %d at start pthread pol %d pri %d - Got global lock\n",
174f08c3bdfSopenharmony_ci		     pthr->priority, policy, schedp.sched_priority);
175f08c3bdfSopenharmony_ci
176f08c3bdfSopenharmony_ci		/* we just use the mutex as something to slow things down */
177f08c3bdfSopenharmony_ci		/* say who we are and then do nothing for a while.      The aim
178f08c3bdfSopenharmony_ci		 * of this is to show that high priority threads make more
179f08c3bdfSopenharmony_ci		 * progress than lower priority threads..
180f08c3bdfSopenharmony_ci		 */
181f08c3bdfSopenharmony_ci		for (i = 0; i < 1000; i++) {
182f08c3bdfSopenharmony_ci			if (i % 100 == 0) {
183f08c3bdfSopenharmony_ci				sched_getparam(tid, &schedp);
184f08c3bdfSopenharmony_ci				policy = sched_getscheduler(tid);
185f08c3bdfSopenharmony_ci				printf
186f08c3bdfSopenharmony_ci				    ("Thread %d(%d) loop %d pthread pol %d pri %d\n",
187f08c3bdfSopenharmony_ci				     tid, pthr->priority, i, policy,
188f08c3bdfSopenharmony_ci				     schedp.sched_priority);
189f08c3bdfSopenharmony_ci				fflush(NULL);
190f08c3bdfSopenharmony_ci			}
191f08c3bdfSopenharmony_ci			pthr->id++;
192f08c3bdfSopenharmony_ci			for (j = 0; j < 5000; j++) {
193f08c3bdfSopenharmony_ci				pthread_mutex_lock(&(pthr->mutex));
194f08c3bdfSopenharmony_ci				pthread_mutex_unlock(&(pthr->mutex));
195f08c3bdfSopenharmony_ci			}
196f08c3bdfSopenharmony_ci		}
197f08c3bdfSopenharmony_ci		pthread_mutex_unlock(&glob_mutex);
198f08c3bdfSopenharmony_ci		sleep(2);
199f08c3bdfSopenharmony_ci	}
200f08c3bdfSopenharmony_ci	return NULL;
201f08c3bdfSopenharmony_ci}
202f08c3bdfSopenharmony_ci
203f08c3bdfSopenharmony_civoid *func_noise(void *arg)
204f08c3bdfSopenharmony_ci{
205f08c3bdfSopenharmony_ci	Thread *pthr = (Thread *) arg;
206f08c3bdfSopenharmony_ci	int rc, i, j, policy, tid = gettid();
207f08c3bdfSopenharmony_ci	struct sched_param schedp;
208f08c3bdfSopenharmony_ci	cpu_set_t mask;
209f08c3bdfSopenharmony_ci	CPU_ZERO(&mask);
210f08c3bdfSopenharmony_ci	CPU_SET(0, &mask);
211f08c3bdfSopenharmony_ci
212f08c3bdfSopenharmony_ci	rc = sched_setaffinity(0, sizeof(mask), &mask);
213f08c3bdfSopenharmony_ci	if (rc < 0) {
214f08c3bdfSopenharmony_ci		printf("Thread %d: Can't set affinity: %d %s\n", tid, rc,
215f08c3bdfSopenharmony_ci		       strerror(rc));
216f08c3bdfSopenharmony_ci		exit(-1);
217f08c3bdfSopenharmony_ci	}
218f08c3bdfSopenharmony_ci	rc = sched_getaffinity(0, sizeof(mask), &mask);
219f08c3bdfSopenharmony_ci
220f08c3bdfSopenharmony_ci	printf("Noise Thread started %d on CPU %ld\n", pthr->priority,
221f08c3bdfSopenharmony_ci	       (long)mask.__bits[0]);
222f08c3bdfSopenharmony_ci	pthread_getschedparam(pthr->pthread, &policy, &schedp);
223f08c3bdfSopenharmony_ci
224f08c3bdfSopenharmony_ci	while (1) {
225f08c3bdfSopenharmony_ci		sleep(1);
226f08c3bdfSopenharmony_ci		printf("Noise Thread running %d\n", pthr->priority);
227f08c3bdfSopenharmony_ci
228f08c3bdfSopenharmony_ci		for (i = 0; i < 10000; i++) {
229f08c3bdfSopenharmony_ci			if ((i % 100) == 0) {
230f08c3bdfSopenharmony_ci				sched_getparam(tid, &schedp);
231f08c3bdfSopenharmony_ci				policy = sched_getscheduler(tid);
232f08c3bdfSopenharmony_ci				printf
233f08c3bdfSopenharmony_ci				    ("Noise Thread %d(%d) loop %d pthread pol %d pri %d\n",
234f08c3bdfSopenharmony_ci				     tid, pthr->priority, i, policy,
235f08c3bdfSopenharmony_ci				     schedp.sched_priority);
236f08c3bdfSopenharmony_ci				fflush(NULL);
237f08c3bdfSopenharmony_ci			}
238f08c3bdfSopenharmony_ci			pthr->id++;
239f08c3bdfSopenharmony_ci			for (j = 0; j < 5000; j++) {
240f08c3bdfSopenharmony_ci				pthread_mutex_lock(&(pthr->mutex));
241f08c3bdfSopenharmony_ci				pthread_mutex_unlock(&(pthr->mutex));
242f08c3bdfSopenharmony_ci			}
243f08c3bdfSopenharmony_ci		}
244f08c3bdfSopenharmony_ci		sched_yield();
245f08c3bdfSopenharmony_ci	}
246f08c3bdfSopenharmony_ci	return NULL;
247f08c3bdfSopenharmony_ci}
248f08c3bdfSopenharmony_ci
249f08c3bdfSopenharmony_ciint startThread(Thread * thrd)
250f08c3bdfSopenharmony_ci{
251f08c3bdfSopenharmony_ci	struct sched_param schedp;
252f08c3bdfSopenharmony_ci	pthread_condattr_t condattr;
253f08c3bdfSopenharmony_ci	int retc, policy, inherit;
254f08c3bdfSopenharmony_ci
255f08c3bdfSopenharmony_ci	printf("Start thread priority %d\n", thrd->priority);
256f08c3bdfSopenharmony_ci	if (pthread_attr_init(&(thrd->attr)) != 0) {
257f08c3bdfSopenharmony_ci		printf("Attr init failed");
258f08c3bdfSopenharmony_ci		exit(2);
259f08c3bdfSopenharmony_ci	}
260f08c3bdfSopenharmony_ci	thrd->flags = 0;
261f08c3bdfSopenharmony_ci	memset(&schedp, 0, sizeof(schedp));
262f08c3bdfSopenharmony_ci	schedp.sched_priority = thrd->priority;
263f08c3bdfSopenharmony_ci	policy = thrd->policy;
264f08c3bdfSopenharmony_ci
265f08c3bdfSopenharmony_ci	if (pthread_attr_setschedpolicy(&(thrd->attr), policy) != 0) {
266f08c3bdfSopenharmony_ci		printf("Can't set policy %d\n", policy);
267f08c3bdfSopenharmony_ci	}
268f08c3bdfSopenharmony_ci	if (pthread_attr_getschedpolicy(&(thrd->attr), &policy) != 0) {
269f08c3bdfSopenharmony_ci		printf("Can't get policy\n");
270f08c3bdfSopenharmony_ci	} else {
271f08c3bdfSopenharmony_ci		printf("Policy in attribs is %d\n", policy);
272f08c3bdfSopenharmony_ci	}
273f08c3bdfSopenharmony_ci	if (pthread_attr_setschedparam(&(thrd->attr), &schedp) != 0) {
274f08c3bdfSopenharmony_ci		printf("Can't set params");
275f08c3bdfSopenharmony_ci	}
276f08c3bdfSopenharmony_ci	if (pthread_attr_getschedparam(&(thrd->attr), &schedp) != 0) {
277f08c3bdfSopenharmony_ci		printf("Can't get params");
278f08c3bdfSopenharmony_ci	} else {
279f08c3bdfSopenharmony_ci		printf("Priority in attribs is %d\n", schedp.sched_priority);
280f08c3bdfSopenharmony_ci	}
281f08c3bdfSopenharmony_ci	if (pthread_attr_setinheritsched(&(thrd->attr), PTHREAD_EXPLICIT_SCHED)
282f08c3bdfSopenharmony_ci	    != 0) {
283f08c3bdfSopenharmony_ci		printf("Can't set inheritsched\n");
284f08c3bdfSopenharmony_ci	}
285f08c3bdfSopenharmony_ci	if (pthread_attr_getinheritsched(&(thrd->attr), &inherit) != 0) {
286f08c3bdfSopenharmony_ci		printf("Can't get inheritsched\n");
287f08c3bdfSopenharmony_ci	} else {
288f08c3bdfSopenharmony_ci		printf("inherit sched in attribs is %d\n", inherit);
289f08c3bdfSopenharmony_ci	}
290f08c3bdfSopenharmony_ci	if ((retc = pthread_mutex_init(&(thrd->mutex), NULL)) != 0) {
291f08c3bdfSopenharmony_ci		printf("Failed to init mutex: %d\n", retc);
292f08c3bdfSopenharmony_ci	}
293f08c3bdfSopenharmony_ci	if (pthread_condattr_init(&condattr) != 0) {
294f08c3bdfSopenharmony_ci		printf("Failed to init condattr\n");
295f08c3bdfSopenharmony_ci	}
296f08c3bdfSopenharmony_ci	if (pthread_cond_init(&(thrd->cond), &condattr) != 0) {
297f08c3bdfSopenharmony_ci		printf("Failed to init cond\n");
298f08c3bdfSopenharmony_ci	}
299f08c3bdfSopenharmony_ci	retc =
300f08c3bdfSopenharmony_ci	    pthread_create(&(thrd->pthread), &(thrd->attr), thrd->func, thrd);
301f08c3bdfSopenharmony_ci	printf("Create returns %d\n\n", retc);
302f08c3bdfSopenharmony_ci	return retc;
303f08c3bdfSopenharmony_ci}
304f08c3bdfSopenharmony_ci
305f08c3bdfSopenharmony_civoid stopThread(Thread * thr)
306f08c3bdfSopenharmony_ci{
307f08c3bdfSopenharmony_ci	thr->flags += THREAD_STOP;
308f08c3bdfSopenharmony_ci	joinThread(thr);
309f08c3bdfSopenharmony_ci}
310f08c3bdfSopenharmony_ci
311f08c3bdfSopenharmony_civoid joinThread(Thread * thr)
312f08c3bdfSopenharmony_ci{
313f08c3bdfSopenharmony_ci	void *ret = NULL;
314f08c3bdfSopenharmony_ci	if (pthread_join(thr->pthread, &ret) != 0) {
315f08c3bdfSopenharmony_ci		printf("Join failed\n");
316f08c3bdfSopenharmony_ci	}
317f08c3bdfSopenharmony_ci	printf("Join gave %p\n", ret);
318f08c3bdfSopenharmony_ci}
319f08c3bdfSopenharmony_ci
320f08c3bdfSopenharmony_ci/*
321f08c3bdfSopenharmony_ci * Test pthread creation at different thread priorities.
322f08c3bdfSopenharmony_ci */
323f08c3bdfSopenharmony_ciint main(int argc, char *argv[])
324f08c3bdfSopenharmony_ci{
325f08c3bdfSopenharmony_ci	int i, retc, nopi = 0;
326f08c3bdfSopenharmony_ci	cpu_set_t mask;
327f08c3bdfSopenharmony_ci	CPU_ZERO(&mask);
328f08c3bdfSopenharmony_ci	CPU_SET(0, &mask);
329f08c3bdfSopenharmony_ci	setup();
330f08c3bdfSopenharmony_ci
331f08c3bdfSopenharmony_ci	rt_init("h", parse_args, argc, argv);
332f08c3bdfSopenharmony_ci
333f08c3bdfSopenharmony_ci	retc = sched_setaffinity(0, sizeof(mask), &mask);
334f08c3bdfSopenharmony_ci	if (retc < 0) {
335f08c3bdfSopenharmony_ci		printf("Main Thread: Can't set affinity: %d %s\n", retc,
336f08c3bdfSopenharmony_ci		       strerror(retc));
337f08c3bdfSopenharmony_ci		exit(1);
338f08c3bdfSopenharmony_ci	}
339f08c3bdfSopenharmony_ci	retc = sched_getaffinity(0, sizeof(mask), &mask);
340f08c3bdfSopenharmony_ci
341f08c3bdfSopenharmony_ci	/*
342f08c3bdfSopenharmony_ci	 * XXX: Have you ever heard of structures with c89/c99?
343f08c3bdfSopenharmony_ci	 * Inline assignment is a beautiful thing.
344f08c3bdfSopenharmony_ci	 */
345f08c3bdfSopenharmony_ci	arg1.policy = SCHED_OTHER;
346f08c3bdfSopenharmony_ci	arg1.priority = 0;
347f08c3bdfSopenharmony_ci	arg1.func = func_nonrt;
348f08c3bdfSopenharmony_ci	arg2.policy = SCHED_RR;
349f08c3bdfSopenharmony_ci	arg2.priority = 20;
350f08c3bdfSopenharmony_ci	arg2.func = func_rt;
351f08c3bdfSopenharmony_ci	arg3.policy = SCHED_RR;
352f08c3bdfSopenharmony_ci	arg3.priority = 30;
353f08c3bdfSopenharmony_ci	arg3.func = func_rt;
354f08c3bdfSopenharmony_ci	arg4.policy = SCHED_RR;
355f08c3bdfSopenharmony_ci	arg4.priority = 40;
356f08c3bdfSopenharmony_ci	arg4.func = func_rt;
357f08c3bdfSopenharmony_ci	arg5.policy = SCHED_RR;
358f08c3bdfSopenharmony_ci	arg5.priority = 40;
359f08c3bdfSopenharmony_ci	arg5.func = func_noise;
360f08c3bdfSopenharmony_ci
361f08c3bdfSopenharmony_ci	for (i = 0; i < argc; i++) {
362f08c3bdfSopenharmony_ci		if (strcmp(argv[i], "nopi") == 0)
363f08c3bdfSopenharmony_ci			nopi = 1;
364f08c3bdfSopenharmony_ci	}
365f08c3bdfSopenharmony_ci
366f08c3bdfSopenharmony_ci	printf("Start %s\n", argv[0]);
367f08c3bdfSopenharmony_ci
368f08c3bdfSopenharmony_ci#if HAS_PRIORITY_INHERIT
369f08c3bdfSopenharmony_ci	if (!nopi) {
370f08c3bdfSopenharmony_ci		pthread_mutexattr_t mutexattr;
371f08c3bdfSopenharmony_ci		int protocol;
372f08c3bdfSopenharmony_ci
373f08c3bdfSopenharmony_ci		if (pthread_mutexattr_init(&mutexattr) != 0) {
374f08c3bdfSopenharmony_ci			printf("Failed to init mutexattr\n");
375f08c3bdfSopenharmony_ci		};
376f08c3bdfSopenharmony_ci		if (pthread_mutexattr_setprotocol
377f08c3bdfSopenharmony_ci		    (&mutexattr, PTHREAD_PRIO_INHERIT) != 0) {
378f08c3bdfSopenharmony_ci			printf("Can't set protocol prio inherit\n");
379f08c3bdfSopenharmony_ci		}
380f08c3bdfSopenharmony_ci		if (pthread_mutexattr_getprotocol(&mutexattr, &protocol) != 0) {
381f08c3bdfSopenharmony_ci			printf("Can't get mutexattr protocol\n");
382f08c3bdfSopenharmony_ci		} else {
383f08c3bdfSopenharmony_ci			printf("protocol in mutexattr is %d\n", protocol);
384f08c3bdfSopenharmony_ci		}
385f08c3bdfSopenharmony_ci		if ((retc = pthread_mutex_init(&glob_mutex, &mutexattr)) != 0) {
386f08c3bdfSopenharmony_ci			printf("Failed to init mutex: %d\n", retc);
387f08c3bdfSopenharmony_ci		}
388f08c3bdfSopenharmony_ci	}
389f08c3bdfSopenharmony_ci#endif
390f08c3bdfSopenharmony_ci
391f08c3bdfSopenharmony_ci	startThread(&arg1);
392f08c3bdfSopenharmony_ci	startThread(&arg2);
393f08c3bdfSopenharmony_ci	startThread(&arg3);
394f08c3bdfSopenharmony_ci	startThread(&arg4);
395f08c3bdfSopenharmony_ci	startThread(&arg5);
396f08c3bdfSopenharmony_ci
397f08c3bdfSopenharmony_ci	sleep(10);
398f08c3bdfSopenharmony_ci
399f08c3bdfSopenharmony_ci	printf("Stopping threads\n");
400f08c3bdfSopenharmony_ci	stopThread(&arg1);
401f08c3bdfSopenharmony_ci	stopThread(&arg2);
402f08c3bdfSopenharmony_ci	stopThread(&arg3);
403f08c3bdfSopenharmony_ci	stopThread(&arg4);
404f08c3bdfSopenharmony_ci	stopThread(&arg5);
405f08c3bdfSopenharmony_ci
406f08c3bdfSopenharmony_ci	printf("Thread counts %d %d %d %d %d\n", arg1.id, arg2.id, arg3.id,
407f08c3bdfSopenharmony_ci	       arg4.id, arg5.id);
408f08c3bdfSopenharmony_ci	printf("Done\n");
409f08c3bdfSopenharmony_ci
410f08c3bdfSopenharmony_ci	return 0;
411f08c3bdfSopenharmony_ci}
412