/**************************************************************************** * apps/testing/ostest/smp_call.c * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. The * ASF licenses this file to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. * ****************************************************************************/ /**************************************************************************** * Included Files ****************************************************************************/ #include #include #include #include #include /**************************************************************************** * Private Functions ****************************************************************************/ static int smp_call_func(void *arg) { FAR sem_t *psem = arg; sem_post(psem); return OK; } /**************************************************************************** * Public Functions ****************************************************************************/ void smp_call_test(void) { cpu_set_t cpuset; sem_t sem; int cpucnt; int cpu; int value; int status; printf("smp_call_test: Test start\n"); sem_init(&sem, 0, 0); for (cpu = 0; cpu < CONFIG_SMP_NCPUS; cpu++) { printf("smp_call_test: Call cpu %d, nowait\n", cpu); nxsched_smp_call_single(cpu, smp_call_func, &sem, false); status = sem_wait(&sem); if (status != 0) { printf("smp_call_test: Check smp call error\n"); ASSERT(false); } printf("smp_call_test: Call cpu %d, wait\n", cpu); nxsched_smp_call_single(cpu, smp_call_func, &sem, true); sem_getvalue(&sem, &value); if (value != 1) { printf("smp_call_test: Check smp call wait error\n"); ASSERT(false); } nxsem_reset(&sem, 0); } printf("smp_call_test: Call multi cpu, nowait\n"); sched_getaffinity(0, sizeof(cpu_set_t), &cpuset); cpucnt = CPU_COUNT(&cpuset); nxsched_smp_call(cpuset, smp_call_func, &sem, false); for (cpu = 0; cpu < cpucnt; cpu++) { status = sem_wait(&sem); if (status != 0) { printf("smp_call_test: Check smp call error\n"); ASSERT(false); } } printf("smp_call_test: Call multi cpu, wait\n"); nxsched_smp_call(cpuset, smp_call_func, &sem, true); sem_getvalue(&sem, &value); if (value != cpucnt) { printf("smp_call_test: Check smp call wait error\n"); ASSERT(false); } sem_destroy(&sem); printf("smp_call_test: Test success\n"); }