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