static void test_scheduler_add_remove_processors(void) { rtems_status_code sc; rtems_id scheduler_id; sc = rtems_scheduler_ident(BLUE, &scheduler_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_scheduler_add_processor(invalid_id, 0); rtems_test_assert(sc == RTEMS_INVALID_ID); sc = rtems_scheduler_remove_processor(invalid_id, 0); rtems_test_assert(sc == RTEMS_INVALID_ID); sc = rtems_scheduler_add_processor(scheduler_id, 1); rtems_test_assert(sc == RTEMS_NOT_CONFIGURED); sc = rtems_scheduler_remove_processor(scheduler_id, 1); rtems_test_assert(sc == RTEMS_INVALID_NUMBER); sc = rtems_scheduler_add_processor(scheduler_id, 0); rtems_test_assert(sc == RTEMS_RESOURCE_IN_USE); sc = rtems_scheduler_remove_processor(scheduler_id, 0); rtems_test_assert(sc == RTEMS_RESOURCE_IN_USE); }
static void start_task( test_context *ctx, task_id id, rtems_task_entry entry, rtems_task_priority prio, rtems_name scheduler ) { rtems_status_code sc; rtems_id scheduler_id; sc = rtems_task_create( rtems_build_name('T', 'A', 'S', 'K'), prio, RTEMS_MINIMUM_STACK_SIZE, RTEMS_DEFAULT_MODES, RTEMS_DEFAULT_ATTRIBUTES, &ctx->tasks[id] ); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_scheduler_ident(scheduler, &scheduler_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_set_scheduler(ctx->tasks[id], scheduler_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_start(ctx->tasks[id], entry, id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); }
static void test(void) { test_context *ctx = &test_instance; rtems_status_code sc; rtems_id scheduler_b_id; rtems_id task_id; sc = rtems_scheduler_ident(SCHEDULER_B, &scheduler_b_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_create( SCHEDULER_B, 1, RTEMS_MINIMUM_STACK_SIZE, RTEMS_DEFAULT_MODES, RTEMS_DEFAULT_ATTRIBUTES, &task_id ); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_set_scheduler(task_id, scheduler_b_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_start(task_id, timer_task, (rtems_task_argument) ctx); rtems_test_assert(sc == RTEMS_SUCCESSFUL); delay_clock_tick(ctx); sc = rtems_task_delete(task_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); }
static void test_scheduler_ident(void) { rtems_status_code sc; rtems_id expected_id = rtems_build_id(7, 1, 1, 1); rtems_id scheduler_id; rtems_name name = BLUE; rtems_name invalid_name = RED; sc = rtems_scheduler_ident(name, NULL); rtems_test_assert(sc == RTEMS_INVALID_ADDRESS); sc = rtems_scheduler_ident(invalid_name, &scheduler_id); rtems_test_assert(sc == RTEMS_INVALID_NAME); scheduler_id = 0; sc = rtems_scheduler_ident(name, &scheduler_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); rtems_test_assert(scheduler_id == expected_id); }
static void test_scheduler_get_processors(void) { #if defined(__RTEMS_HAVE_SYS_CPUSET_H__) rtems_status_code sc; rtems_name name = BLUE; rtems_id scheduler_id; cpu_set_t cpusetone; cpu_set_t cpuset; size_t big = 2 * CHAR_BIT * sizeof(cpu_set_t); size_t cpusetbigsize = CPU_ALLOC_SIZE(big); cpu_set_t *cpusetbigone; cpu_set_t *cpusetbig; CPU_ZERO(&cpusetone); CPU_SET(0, &cpusetone); sc = rtems_scheduler_ident(name, &scheduler_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_scheduler_get_processor_set(scheduler_id, sizeof(cpuset), NULL); rtems_test_assert(sc == RTEMS_INVALID_ADDRESS); sc = rtems_scheduler_get_processor_set(invalid_id, sizeof(cpuset), &cpuset); rtems_test_assert(sc == RTEMS_INVALID_ID); sc = rtems_scheduler_get_processor_set(scheduler_id, 0, &cpuset); rtems_test_assert(sc == RTEMS_INVALID_NUMBER); sc = rtems_scheduler_get_processor_set(scheduler_id, sizeof(cpuset), &cpuset); rtems_test_assert(sc == RTEMS_SUCCESSFUL); rtems_test_assert(CPU_EQUAL(&cpuset, &cpusetone)); cpusetbigone = CPU_ALLOC(big); rtems_test_assert(cpusetbigone != NULL); cpusetbig = CPU_ALLOC(big); rtems_test_assert(cpusetbig != NULL); CPU_ZERO_S(cpusetbigsize, cpusetbigone); CPU_SET_S(0, cpusetbigsize, cpusetbigone); sc = rtems_scheduler_get_processor_set(scheduler_id, cpusetbigsize, cpusetbig); rtems_test_assert(sc == RTEMS_SUCCESSFUL); rtems_test_assert(CPU_EQUAL_S(cpusetbigsize, cpusetbig, cpusetbigone)); CPU_FREE(cpusetbig); CPU_FREE(cpusetbigone); #endif /* defined(__RTEMS_HAVE_SYS_CPUSET_H__) */ }
static void *thread_b(void *arg) { test_context *ctx; rtems_id scheduler_b_id; rtems_status_code sc; rtems_task_priority prio; int prio_ceiling; int eno; ctx = arg; rtems_test_assert(rtems_get_current_processor() == 0); sc = rtems_scheduler_ident(SCHED_B, &scheduler_b_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_set_priority(pthread_self(), RTEMS_CURRENT_PRIORITY, &prio); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_set_scheduler(pthread_self(), scheduler_b_id, prio); rtems_test_assert(sc == RTEMS_SUCCESSFUL); rtems_test_assert(rtems_get_current_processor() == 1); eno = pthread_mutex_init(&ctx->mtx_b, &ctx->mtx_attr); rtems_test_assert(eno == 0); eno = pthread_mutex_getprioceiling(&ctx->mtx_b, &prio_ceiling); rtems_test_assert(eno == 0); rtems_test_assert(prio_ceiling == 254); eno = pthread_mutex_lock(&ctx->mtx_b); rtems_test_assert(eno == 0); eno = pthread_mutex_unlock(&ctx->mtx_b); rtems_test_assert(eno == 0); eno = pthread_mutex_destroy(&ctx->mtx_b); rtems_test_assert(eno == 0); eno = pthread_mutex_getprioceiling(&ctx->mtx_a, &prio_ceiling); rtems_test_assert(eno == 0); rtems_test_assert(prio_ceiling == 126); eno = pthread_mutex_lock(&ctx->mtx_a); rtems_test_assert(eno == EINVAL); return ctx; }
static void test(void) { rtems_status_code sc; rtems_id task_id; rtems_id scheduler_id; rtems_id scheduler_a_id; rtems_id scheduler_b_id; rtems_id scheduler_c_id; rtems_task_priority prio; cpu_set_t cpuset; cpu_set_t first_cpu; cpu_set_t second_cpu; cpu_set_t all_cpus; cpu_set_t online_cpus; uint32_t cpu_count; rtems_test_assert(rtems_get_current_processor() == 0); cpu_count = rtems_get_processor_count(); main_task_id = rtems_task_self(); CPU_ZERO(&first_cpu); CPU_SET(0, &first_cpu); CPU_ZERO(&second_cpu); CPU_SET(1, &second_cpu); CPU_FILL(&all_cpus); CPU_ZERO(&online_cpus); CPU_SET(0, &online_cpus); if (cpu_count > 1) { CPU_SET(1, &online_cpus); } sc = rtems_scheduler_ident(SCHED_A, &scheduler_a_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); if (cpu_count > 1) { sc = rtems_scheduler_ident(SCHED_B, &scheduler_b_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); rtems_test_assert(scheduler_a_id != scheduler_b_id); } sc = rtems_scheduler_ident(SCHED_C, &scheduler_c_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_semaphore_create( rtems_build_name('C', 'M', 'T', 'X'), 1, RTEMS_BINARY_SEMAPHORE | RTEMS_PRIORITY | RTEMS_PRIORITY_CEILING, 1, &cmtx_id ); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_semaphore_create( rtems_build_name('I', 'M', 'T', 'X'), 1, RTEMS_BINARY_SEMAPHORE | RTEMS_PRIORITY | RTEMS_INHERIT_PRIORITY, 1, &imtx_id ); rtems_test_assert(sc == RTEMS_SUCCESSFUL); prio = 2; sc = rtems_semaphore_set_priority(cmtx_id, scheduler_a_id, prio, &prio); rtems_test_assert(sc == RTEMS_SUCCESSFUL); rtems_test_assert(prio == 1); if (cpu_count > 1) { prio = 1; sc = rtems_semaphore_set_priority(cmtx_id, scheduler_b_id, prio, &prio); rtems_test_assert(sc == RTEMS_NOT_DEFINED); rtems_test_assert(prio == 2); } CPU_ZERO(&cpuset); sc = rtems_scheduler_get_processor_set( scheduler_a_id, sizeof(cpuset), &cpuset ); rtems_test_assert(sc == RTEMS_SUCCESSFUL); rtems_test_assert(CPU_EQUAL(&cpuset, &first_cpu)); if (cpu_count > 1) { CPU_ZERO(&cpuset); sc = rtems_scheduler_get_processor_set( scheduler_b_id, sizeof(cpuset), &cpuset ); rtems_test_assert(sc == RTEMS_SUCCESSFUL); rtems_test_assert(CPU_EQUAL(&cpuset, &second_cpu)); } sc = rtems_task_create( rtems_build_name('T', 'A', 'S', 'K'), 1, RTEMS_MINIMUM_STACK_SIZE, RTEMS_DEFAULT_MODES, RTEMS_DEFAULT_ATTRIBUTES, &task_id ); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_get_scheduler(task_id, &scheduler_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); rtems_test_assert(scheduler_id == scheduler_a_id); CPU_ZERO(&cpuset); sc = rtems_task_get_affinity(task_id, sizeof(cpuset), &cpuset); rtems_test_assert(sc == RTEMS_SUCCESSFUL); rtems_test_assert(CPU_EQUAL(&cpuset, &online_cpus)); rtems_test_assert(sched_get_priority_min(SCHED_RR) == 1); rtems_test_assert(sched_get_priority_max(SCHED_RR) == 254); sc = rtems_task_set_scheduler(task_id, scheduler_c_id, 1); rtems_test_assert(sc == RTEMS_UNSATISFIED); sc = rtems_task_set_scheduler(task_id, scheduler_c_id + 1, 1); rtems_test_assert(sc == RTEMS_INVALID_ID); if (cpu_count > 1) { sc = rtems_task_set_scheduler(task_id, scheduler_b_id, 1); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_get_scheduler(task_id, &scheduler_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); rtems_test_assert(scheduler_id == scheduler_b_id); CPU_ZERO(&cpuset); sc = rtems_task_get_affinity(task_id, sizeof(cpuset), &cpuset); rtems_test_assert(sc == RTEMS_SUCCESSFUL); rtems_test_assert(CPU_EQUAL(&cpuset, &online_cpus)); sc = rtems_task_set_affinity(task_id, sizeof(all_cpus), &all_cpus); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_set_affinity(task_id, sizeof(first_cpu), &first_cpu); rtems_test_assert(sc == RTEMS_INVALID_NUMBER); sc = rtems_task_get_scheduler(task_id, &scheduler_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); rtems_test_assert(scheduler_id == scheduler_b_id); sc = rtems_task_set_affinity(task_id, sizeof(online_cpus), &online_cpus); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_set_affinity(task_id, sizeof(second_cpu), &second_cpu); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_set_scheduler(task_id, scheduler_a_id, 1); rtems_test_assert(sc == RTEMS_UNSATISFIED); sc = rtems_task_get_scheduler(task_id, &scheduler_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); rtems_test_assert(scheduler_id == scheduler_b_id); sc = rtems_semaphore_obtain(imtx_id, RTEMS_WAIT, RTEMS_NO_TIMEOUT); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_set_scheduler(task_id, scheduler_b_id, 1); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_start(task_id, task, 0); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_event_transient_receive(RTEMS_WAIT, RTEMS_NO_TIMEOUT); rtems_test_assert(sc == RTEMS_SUCCESSFUL); /* Ensure that the other task waits for the mutex owned by us */ sc = rtems_task_wake_after(2); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_set_scheduler(RTEMS_SELF, scheduler_b_id, 1); rtems_test_assert(sc == RTEMS_RESOURCE_IN_USE); sc = rtems_semaphore_release(imtx_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_event_transient_receive(RTEMS_WAIT, RTEMS_NO_TIMEOUT); rtems_test_assert(sc == RTEMS_SUCCESSFUL); } sc = rtems_task_delete(task_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_semaphore_delete(cmtx_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_semaphore_delete(imtx_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); test_scheduler_add_remove_processors(); }
static void test_scheduler_add_remove_processors(void) { rtems_status_code sc; rtems_id scheduler_a_id; rtems_id scheduler_c_id; sc = rtems_scheduler_ident(SCHED_A, &scheduler_a_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_scheduler_ident(SCHED_C, &scheduler_c_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_scheduler_add_processor(scheduler_c_id, 62); rtems_test_assert(sc == RTEMS_NOT_CONFIGURED); sc = rtems_scheduler_add_processor(scheduler_c_id, 63); rtems_test_assert(sc == RTEMS_INCORRECT_STATE); sc = rtems_scheduler_remove_processor(scheduler_c_id, 62); rtems_test_assert(sc == RTEMS_INVALID_NUMBER); sc = rtems_scheduler_remove_processor(scheduler_a_id, 0); rtems_test_assert(sc == RTEMS_RESOURCE_IN_USE); if (rtems_get_processor_count() > 1) { rtems_id scheduler_id; rtems_id scheduler_b_id; rtems_id task_id; cpu_set_t first_cpu; sc = rtems_scheduler_ident(SCHED_B, &scheduler_b_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_scheduler_remove_processor(scheduler_b_id, 1); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_scheduler_add_processor(scheduler_a_id, 1); rtems_test_assert(sc == RTEMS_SUCCESSFUL); rtems_test_assert(rtems_get_current_processor() == 0); sc = rtems_scheduler_remove_processor(scheduler_a_id, 0); rtems_test_assert(sc == RTEMS_SUCCESSFUL); rtems_test_assert(rtems_get_current_processor() == 1); CPU_ZERO(&first_cpu); CPU_SET(0, &first_cpu); sc = rtems_scheduler_ident_by_processor_set( sizeof(first_cpu), &first_cpu, &scheduler_id ); rtems_test_assert(sc == RTEMS_INCORRECT_STATE); sc = rtems_scheduler_add_processor(scheduler_a_id, 0); rtems_test_assert(sc == RTEMS_SUCCESSFUL); rtems_test_assert(rtems_get_current_processor() == 1); sc = rtems_task_create( rtems_build_name('T', 'A', 'S', 'K'), 2, RTEMS_MINIMUM_STACK_SIZE, RTEMS_DEFAULT_MODES, RTEMS_DEFAULT_ATTRIBUTES, &task_id ); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_start(task_id, sticky_task, 0); rtems_test_assert(sc == RTEMS_SUCCESSFUL); while (!ready) { /* Wait */ } sc = rtems_scheduler_remove_processor(scheduler_a_id, 1); rtems_test_assert(sc == RTEMS_SUCCESSFUL); rtems_test_assert(rtems_get_current_processor() == 0); sc = rtems_event_transient_send(task_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_event_transient_receive(RTEMS_WAIT, RTEMS_NO_TIMEOUT); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_delete(task_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_scheduler_add_processor(scheduler_b_id, 1); rtems_test_assert(sc == RTEMS_SUCCESSFUL); } }
static void test_task_get_set_scheduler(void) { rtems_status_code sc; rtems_id self_id = rtems_task_self(); rtems_name name = BLUE; rtems_id scheduler_id; rtems_id scheduler_by_name; rtems_id task_id; sc = rtems_scheduler_ident(name, &scheduler_by_name); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_get_scheduler(RTEMS_SELF, NULL); rtems_test_assert(sc == RTEMS_INVALID_ADDRESS); sc = rtems_task_get_scheduler(invalid_id, &scheduler_id); rtems_test_assert(sc == RTEMS_INVALID_ID); scheduler_id = 0; sc = rtems_task_get_scheduler(RTEMS_SELF, &scheduler_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); rtems_test_assert(scheduler_id == scheduler_by_name); scheduler_id = 0; sc = rtems_task_get_scheduler(self_id, &scheduler_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); rtems_test_assert(scheduler_id == scheduler_by_name); sc = rtems_task_set_scheduler(invalid_id, scheduler_id); rtems_test_assert(sc == RTEMS_INVALID_ID); sc = rtems_task_set_scheduler(self_id, invalid_id); rtems_test_assert(sc == RTEMS_INVALID_ID); sc = rtems_task_set_scheduler(self_id, scheduler_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_create( rtems_build_name('T', 'A', 'S', 'K'), 2, RTEMS_MINIMUM_STACK_SIZE, RTEMS_DEFAULT_MODES, RTEMS_DEFAULT_ATTRIBUTES, &task_id ); rtems_test_assert(sc == RTEMS_SUCCESSFUL); scheduler_id = 0; sc = rtems_task_get_scheduler(task_id, &scheduler_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); rtems_test_assert(scheduler_id == scheduler_by_name); sc = rtems_task_set_scheduler(task_id, scheduler_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_start(task_id, task, 0); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_set_scheduler(task_id, scheduler_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_delete(task_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); }
static void test(void) { rtems_status_code sc; rtems_id task_id; rtems_id scheduler_id; rtems_id scheduler_a_id; rtems_id scheduler_b_id; rtems_id scheduler_c_id; cpu_set_t cpuset; cpu_set_t first_cpu; cpu_set_t second_cpu; cpu_set_t all_cpus; main_task_id = rtems_task_self(); CPU_ZERO(&first_cpu); CPU_SET(0, &first_cpu); CPU_ZERO(&second_cpu); CPU_SET(1, &second_cpu); CPU_ZERO(&all_cpus); CPU_SET(0, &all_cpus); CPU_SET(1, &all_cpus); rtems_test_assert(rtems_get_current_processor() == 0); sc = rtems_scheduler_ident(SCHED_A, &scheduler_a_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_scheduler_ident(SCHED_B, &scheduler_b_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); rtems_test_assert(scheduler_a_id != scheduler_b_id); sc = rtems_scheduler_ident(SCHED_C, &scheduler_c_id); rtems_test_assert(sc == RTEMS_UNSATISFIED); CPU_ZERO(&cpuset); sc = rtems_scheduler_get_processor_set( scheduler_a_id, sizeof(cpuset), &cpuset ); rtems_test_assert(sc == RTEMS_SUCCESSFUL); rtems_test_assert(CPU_EQUAL(&cpuset, &first_cpu)); CPU_ZERO(&cpuset); sc = rtems_scheduler_get_processor_set( scheduler_b_id, sizeof(cpuset), &cpuset ); rtems_test_assert(sc == RTEMS_SUCCESSFUL); rtems_test_assert(CPU_EQUAL(&cpuset, &second_cpu)); sc = rtems_task_create( rtems_build_name('T', 'A', 'S', 'K'), 1, RTEMS_MINIMUM_STACK_SIZE, RTEMS_DEFAULT_MODES, RTEMS_DEFAULT_ATTRIBUTES, &task_id ); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_get_scheduler(task_id, &scheduler_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); rtems_test_assert(scheduler_id == scheduler_a_id); CPU_ZERO(&cpuset); sc = rtems_task_get_affinity(task_id, sizeof(cpuset), &cpuset); rtems_test_assert(sc == RTEMS_SUCCESSFUL); rtems_test_assert(CPU_EQUAL(&cpuset, &first_cpu)); sc = rtems_task_set_scheduler(task_id, scheduler_b_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_set_scheduler(task_id, scheduler_b_id + 1); rtems_test_assert(sc == RTEMS_INVALID_ID); sc = rtems_task_get_scheduler(task_id, &scheduler_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); rtems_test_assert(scheduler_id == scheduler_b_id); CPU_ZERO(&cpuset); sc = rtems_task_get_affinity(task_id, sizeof(cpuset), &cpuset); rtems_test_assert(sc == RTEMS_SUCCESSFUL); rtems_test_assert(CPU_EQUAL(&cpuset, &second_cpu)); sc = rtems_task_set_affinity(task_id, sizeof(all_cpus), &all_cpus); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_set_affinity(task_id, sizeof(first_cpu), &first_cpu); rtems_test_assert(sc == RTEMS_INVALID_NUMBER); sc = rtems_task_get_scheduler(task_id, &scheduler_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); rtems_test_assert(scheduler_id == scheduler_b_id); sc = rtems_task_set_affinity(task_id, sizeof(second_cpu), &second_cpu); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_get_scheduler(task_id, &scheduler_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); rtems_test_assert(scheduler_id == scheduler_b_id); sc = rtems_task_start(task_id, task, 0); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_set_scheduler(task_id, scheduler_b_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_event_transient_receive(RTEMS_WAIT, RTEMS_NO_TIMEOUT); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_delete(task_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); }
static void Init(rtems_task_argument arg) { test_context *ctx = &test_instance; rtems_status_code sc; rtems_resource_snapshot snapshot; uint32_t cpu_count = rtems_get_processor_count(); uint32_t cpu_index; TEST_BEGIN(); rtems_resource_snapshot_take(&snapshot); sc = rtems_barrier_create( rtems_build_name('B', 'A', 'R', 'I'), RTEMS_BARRIER_AUTOMATIC_RELEASE, cpu_count, &ctx->barrier_id ); rtems_test_assert(sc == RTEMS_SUCCESSFUL); for (cpu_index = 1; cpu_index < cpu_count; ++cpu_index) { rtems_id scheduler_id; sc = rtems_task_create( rtems_build_name('T', 'A', 'S', 'K'), 1, RTEMS_MINIMUM_STACK_SIZE, RTEMS_DEFAULT_MODES, RTEMS_DEFAULT_ATTRIBUTES, &ctx->task_id[cpu_index] ); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_scheduler_ident(SCHED_NAME(cpu_index), &scheduler_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_set_scheduler(ctx->task_id[cpu_index], scheduler_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_start(ctx->task_id[cpu_index], test_task, cpu_index); rtems_test_assert(sc == RTEMS_SUCCESSFUL); } tests(); barrier_wait(ctx); sc = rtems_barrier_delete(ctx->barrier_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); done(0); for (cpu_index = 1; cpu_index < cpu_count; ++cpu_index) { sc = rtems_task_delete(ctx->task_id[cpu_index]); rtems_test_assert(sc == RTEMS_SUCCESSFUL); rtems_test_assert(ctx->cpu_index[cpu_index] == cpu_index); done(cpu_index); } rtems_test_assert(rtems_resource_snapshot_check(&snapshot)); TEST_END(); rtems_test_exit(0); }
static void test(void) { rtems_status_code sc; rtems_id task_id; rtems_id scheduler_id; rtems_id scheduler_a_id; rtems_id scheduler_b_id; rtems_id scheduler_c_id; rtems_task_priority prio; cpu_set_t cpuset; cpu_set_t first_cpu; cpu_set_t second_cpu; cpu_set_t all_cpus; uint32_t cpu_count; main_task_id = rtems_task_self(); CPU_ZERO(&first_cpu); CPU_SET(0, &first_cpu); CPU_ZERO(&second_cpu); CPU_SET(1, &second_cpu); CPU_ZERO(&all_cpus); CPU_SET(0, &all_cpus); CPU_SET(1, &all_cpus); cpu_count = rtems_get_processor_count(); rtems_test_assert(rtems_get_current_processor() == 0); sc = rtems_scheduler_ident(SCHED_A, &scheduler_a_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); if (cpu_count > 1) { sc = rtems_scheduler_ident(SCHED_B, &scheduler_b_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); rtems_test_assert(scheduler_a_id != scheduler_b_id); } sc = rtems_scheduler_ident(SCHED_C, &scheduler_c_id); rtems_test_assert(sc == RTEMS_UNSATISFIED); sc = rtems_semaphore_create( SCHED_A, 1, RTEMS_BINARY_SEMAPHORE | RTEMS_PRIORITY | RTEMS_PRIORITY_CEILING, 1, &sema_id ); rtems_test_assert(sc == RTEMS_SUCCESSFUL); prio = 2; sc = rtems_semaphore_set_priority(sema_id, scheduler_a_id, prio, &prio); rtems_test_assert(sc == RTEMS_SUCCESSFUL); rtems_test_assert(prio == 1); if (cpu_count > 1) { prio = 1; sc = rtems_semaphore_set_priority(sema_id, scheduler_b_id, prio, &prio); rtems_test_assert(sc == RTEMS_NOT_DEFINED); rtems_test_assert(prio == 2); } CPU_ZERO(&cpuset); sc = rtems_scheduler_get_processor_set( scheduler_a_id, sizeof(cpuset), &cpuset ); rtems_test_assert(sc == RTEMS_SUCCESSFUL); rtems_test_assert(CPU_EQUAL(&cpuset, &first_cpu)); if (cpu_count > 1) { CPU_ZERO(&cpuset); sc = rtems_scheduler_get_processor_set( scheduler_b_id, sizeof(cpuset), &cpuset ); rtems_test_assert(sc == RTEMS_SUCCESSFUL); rtems_test_assert(CPU_EQUAL(&cpuset, &second_cpu)); } sc = rtems_task_create( rtems_build_name('T', 'A', 'S', 'K'), 1, RTEMS_MINIMUM_STACK_SIZE, RTEMS_DEFAULT_MODES, RTEMS_DEFAULT_ATTRIBUTES, &task_id ); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_get_scheduler(task_id, &scheduler_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); rtems_test_assert(scheduler_id == scheduler_a_id); CPU_ZERO(&cpuset); sc = rtems_task_get_affinity(task_id, sizeof(cpuset), &cpuset); rtems_test_assert(sc == RTEMS_SUCCESSFUL); rtems_test_assert(CPU_EQUAL(&cpuset, &first_cpu)); rtems_test_assert(sched_get_priority_min(SCHED_RR) == 1); rtems_test_assert(sched_get_priority_max(SCHED_RR) == 254); if (cpu_count > 1) { sc = rtems_task_set_scheduler(task_id, scheduler_b_id, 1); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_set_scheduler(task_id, scheduler_b_id + 1, 1); rtems_test_assert(sc == RTEMS_INVALID_ID); sc = rtems_task_get_scheduler(task_id, &scheduler_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); rtems_test_assert(scheduler_id == scheduler_b_id); CPU_ZERO(&cpuset); sc = rtems_task_get_affinity(task_id, sizeof(cpuset), &cpuset); rtems_test_assert(sc == RTEMS_SUCCESSFUL); rtems_test_assert(CPU_EQUAL(&cpuset, &second_cpu)); sc = rtems_task_set_affinity(task_id, sizeof(all_cpus), &all_cpus); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_set_affinity(task_id, sizeof(first_cpu), &first_cpu); rtems_test_assert(sc == RTEMS_INVALID_NUMBER); sc = rtems_task_get_scheduler(task_id, &scheduler_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); rtems_test_assert(scheduler_id == scheduler_b_id); sc = rtems_task_set_affinity(task_id, sizeof(second_cpu), &second_cpu); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_get_scheduler(task_id, &scheduler_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); rtems_test_assert(scheduler_id == scheduler_b_id); sc = rtems_task_start(task_id, task, 0); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_set_scheduler(task_id, scheduler_b_id, 1); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_event_transient_receive(RTEMS_WAIT, RTEMS_NO_TIMEOUT); rtems_test_assert(sc == RTEMS_SUCCESSFUL); } sc = rtems_task_delete(task_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_semaphore_delete(sema_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); }
static void test_task_get_set_scheduler(void) { rtems_status_code sc; rtems_id self_id = rtems_task_self(); rtems_name name = BLUE; rtems_id scheduler_id; rtems_id scheduler_by_name; rtems_id task_id; rtems_id mtx_id; sc = rtems_scheduler_ident(name, &scheduler_by_name); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_get_scheduler(RTEMS_SELF, NULL); rtems_test_assert(sc == RTEMS_INVALID_ADDRESS); sc = rtems_task_get_scheduler(invalid_id, &scheduler_id); rtems_test_assert(sc == RTEMS_INVALID_ID); scheduler_id = 0; sc = rtems_task_get_scheduler(RTEMS_SELF, &scheduler_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); rtems_test_assert(scheduler_id == scheduler_by_name); scheduler_id = 0; sc = rtems_task_get_scheduler(self_id, &scheduler_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); rtems_test_assert(scheduler_id == scheduler_by_name); sc = rtems_task_set_scheduler(invalid_id, scheduler_id, 1); rtems_test_assert(sc == RTEMS_INVALID_ID); sc = rtems_task_set_scheduler(self_id, invalid_id, 1); rtems_test_assert(sc == RTEMS_INVALID_ID); sc = rtems_task_set_scheduler(self_id, scheduler_id, UINT32_C(0x80000000)); rtems_test_assert(sc == RTEMS_INVALID_PRIORITY); sc = rtems_task_set_scheduler(self_id, scheduler_id, 1); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_semaphore_create( rtems_build_name(' ', 'M', 'T', 'X'), 0, RTEMS_BINARY_SEMAPHORE | RTEMS_PRIORITY | RTEMS_INHERIT_PRIORITY, 0, &mtx_id ); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_set_scheduler(self_id, scheduler_id, 1); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_semaphore_release(mtx_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); rtems_test_assert(set_prio(self_id, RTEMS_CURRENT_PRIORITY) == 1); sc = rtems_task_set_scheduler(self_id, scheduler_id, 2); rtems_test_assert(sc == RTEMS_SUCCESSFUL); rtems_test_assert(set_prio(self_id, RTEMS_CURRENT_PRIORITY) == 2); sc = rtems_task_set_scheduler(self_id, scheduler_id, 1); rtems_test_assert(sc == RTEMS_SUCCESSFUL); rtems_test_assert(set_prio(self_id, RTEMS_CURRENT_PRIORITY) == 1); sc = rtems_semaphore_delete(mtx_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_create( rtems_build_name('T', 'A', 'S', 'K'), 2, RTEMS_MINIMUM_STACK_SIZE, RTEMS_DEFAULT_MODES, RTEMS_DEFAULT_ATTRIBUTES, &task_id ); rtems_test_assert(sc == RTEMS_SUCCESSFUL); scheduler_id = 0; sc = rtems_task_get_scheduler(task_id, &scheduler_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); rtems_test_assert(scheduler_id == scheduler_by_name); sc = rtems_task_set_scheduler(task_id, scheduler_id, 2); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_start(task_id, forbidden_task, 0); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_set_scheduler(task_id, scheduler_id, 2); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_delete(task_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_create( rtems_build_name('T', 'A', 'S', 'K'), 2, RTEMS_MINIMUM_STACK_SIZE, RTEMS_DEFAULT_MODES, RTEMS_DEFAULT_ATTRIBUTES, &task_id ); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_start(task_id, restart_task, 0); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_suspend(self_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_delete(task_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_semaphore_create( rtems_build_name('S', 'E', 'M', 'A'), 0, RTEMS_COUNTING_SEMAPHORE, 0, &sema_id ); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_create( rtems_build_name('T', 'A', 'S', 'K'), 1, RTEMS_MINIMUM_STACK_SIZE, RTEMS_DEFAULT_MODES, RTEMS_DEFAULT_ATTRIBUTES, &task_id ); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_start(task_id, sema_task, 0); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_wake_after(RTEMS_YIELD_PROCESSOR); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_set_scheduler(task_id, scheduler_id, 1); rtems_test_assert(sc == RTEMS_RESOURCE_IN_USE); sc = rtems_semaphore_delete(sema_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); sc = rtems_task_delete(task_id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); }