forked from Imagelibrary/rtems
sptests/spscheduler01: Test POSIX set/get affinity
This commit is contained in:
@@ -17,11 +17,15 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define TEST_INIT
|
#define TEST_INIT
|
||||||
|
#define _GNU_SOURCE
|
||||||
|
|
||||||
#include <rtems.h>
|
#include <rtems.h>
|
||||||
#include <rtems/libcsupport.h>
|
#include <rtems/libcsupport.h>
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
|
||||||
#include "tmacros.h"
|
#include "tmacros.h"
|
||||||
|
|
||||||
@@ -31,12 +35,83 @@ const char rtems_test_name[] = "SPSCHEDULER 1";
|
|||||||
|
|
||||||
#define RED rtems_build_name('r', 'e', 'd', ' ')
|
#define RED rtems_build_name('r', 'e', 'd', ' ')
|
||||||
|
|
||||||
|
#define BIG_NUM_CPUS (2 * CHAR_BIT * sizeof(cpu_set_t))
|
||||||
|
|
||||||
static const rtems_id invalid_id = 1;
|
static const rtems_id invalid_id = 1;
|
||||||
|
|
||||||
static rtems_id master_id;
|
static rtems_id master_id;
|
||||||
|
|
||||||
static rtems_id sema_id;
|
static rtems_id sema_id;
|
||||||
|
|
||||||
|
static void assert_eno(rtems_status_code sc, int eno)
|
||||||
|
{
|
||||||
|
switch (sc) {
|
||||||
|
case RTEMS_SUCCESSFUL:
|
||||||
|
rtems_test_assert(eno == 0);
|
||||||
|
break;
|
||||||
|
case RTEMS_INVALID_ADDRESS:
|
||||||
|
rtems_test_assert(eno == EFAULT);
|
||||||
|
break;
|
||||||
|
case RTEMS_INVALID_ID:
|
||||||
|
rtems_test_assert(eno == ESRCH);
|
||||||
|
break;
|
||||||
|
case RTEMS_INVALID_NUMBER:
|
||||||
|
rtems_test_assert(eno == EINVAL);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
rtems_test_assert(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static rtems_status_code task_get_affinity(
|
||||||
|
rtems_id id,
|
||||||
|
size_t cpusetsize,
|
||||||
|
cpu_set_t *cpuset
|
||||||
|
)
|
||||||
|
{
|
||||||
|
rtems_status_code sc;
|
||||||
|
int eno;
|
||||||
|
cpu_set_t *cpusetbig;
|
||||||
|
|
||||||
|
sc = rtems_task_get_affinity(id, cpusetsize, cpuset);
|
||||||
|
|
||||||
|
if (cpuset != NULL) {
|
||||||
|
cpusetbig = CPU_ALLOC(BIG_NUM_CPUS);
|
||||||
|
rtems_test_assert(cpusetbig != NULL);
|
||||||
|
|
||||||
|
memcpy(cpusetbig, cpuset, cpusetsize);
|
||||||
|
} else {
|
||||||
|
cpusetbig = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
eno = pthread_getaffinity_np(id, cpusetsize, cpusetbig);
|
||||||
|
|
||||||
|
if (cpuset != NULL) {
|
||||||
|
rtems_test_assert(CPU_EQUAL_S(cpusetsize, cpusetbig, cpuset));
|
||||||
|
CPU_FREE(cpusetbig);
|
||||||
|
}
|
||||||
|
|
||||||
|
assert_eno(sc, eno);
|
||||||
|
|
||||||
|
return sc;
|
||||||
|
}
|
||||||
|
|
||||||
|
static rtems_status_code task_set_affinity(
|
||||||
|
rtems_id id,
|
||||||
|
size_t cpusetsize,
|
||||||
|
const cpu_set_t *cpuset
|
||||||
|
)
|
||||||
|
{
|
||||||
|
rtems_status_code sc;
|
||||||
|
int eno;
|
||||||
|
|
||||||
|
sc = rtems_task_set_affinity(id, cpusetsize, cpuset);
|
||||||
|
eno = pthread_setaffinity_np(id, cpusetsize, cpuset);
|
||||||
|
assert_eno(sc, eno);
|
||||||
|
|
||||||
|
return sc;
|
||||||
|
}
|
||||||
|
|
||||||
static void test_task_get_set_affinity(void)
|
static void test_task_get_set_affinity(void)
|
||||||
{
|
{
|
||||||
rtems_id self_id = rtems_task_self();
|
rtems_id self_id = rtems_task_self();
|
||||||
@@ -45,8 +120,7 @@ static void test_task_get_set_affinity(void)
|
|||||||
cpu_set_t cpusetone;
|
cpu_set_t cpusetone;
|
||||||
cpu_set_t cpusetall;
|
cpu_set_t cpusetall;
|
||||||
cpu_set_t cpuset;
|
cpu_set_t cpuset;
|
||||||
size_t big = 2 * CHAR_BIT * sizeof(cpu_set_t);
|
size_t cpusetbigsize = CPU_ALLOC_SIZE(BIG_NUM_CPUS);
|
||||||
size_t cpusetbigsize = CPU_ALLOC_SIZE(big);
|
|
||||||
cpu_set_t *cpusetbigone;
|
cpu_set_t *cpusetbigone;
|
||||||
cpu_set_t *cpusetbig;
|
cpu_set_t *cpusetbig;
|
||||||
|
|
||||||
@@ -65,66 +139,66 @@ static void test_task_get_set_affinity(void)
|
|||||||
);
|
);
|
||||||
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
|
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
|
||||||
|
|
||||||
sc = rtems_task_get_affinity(RTEMS_SELF, sizeof(cpuset), NULL);
|
sc = task_get_affinity(RTEMS_SELF, sizeof(cpuset), NULL);
|
||||||
rtems_test_assert(sc == RTEMS_INVALID_ADDRESS);
|
rtems_test_assert(sc == RTEMS_INVALID_ADDRESS);
|
||||||
|
|
||||||
sc = rtems_task_set_affinity(RTEMS_SELF, sizeof(cpuset), NULL);
|
sc = task_set_affinity(RTEMS_SELF, sizeof(cpuset), NULL);
|
||||||
rtems_test_assert(sc == RTEMS_INVALID_ADDRESS);
|
rtems_test_assert(sc == RTEMS_INVALID_ADDRESS);
|
||||||
|
|
||||||
sc = rtems_task_get_affinity(RTEMS_SELF, 0, &cpuset);
|
sc = task_get_affinity(RTEMS_SELF, 0, &cpuset);
|
||||||
rtems_test_assert(sc == RTEMS_INVALID_NUMBER);
|
rtems_test_assert(sc == RTEMS_INVALID_NUMBER);
|
||||||
|
|
||||||
sc = rtems_task_set_affinity(RTEMS_SELF, 0, &cpuset);
|
sc = task_set_affinity(RTEMS_SELF, 0, &cpuset);
|
||||||
rtems_test_assert(sc == RTEMS_INVALID_NUMBER);
|
rtems_test_assert(sc == RTEMS_INVALID_NUMBER);
|
||||||
|
|
||||||
sc = rtems_task_get_affinity(invalid_id, sizeof(cpuset), &cpuset);
|
sc = task_get_affinity(invalid_id, sizeof(cpuset), &cpuset);
|
||||||
rtems_test_assert(sc == RTEMS_INVALID_ID);
|
rtems_test_assert(sc == RTEMS_INVALID_ID);
|
||||||
|
|
||||||
sc = rtems_task_set_affinity(invalid_id, sizeof(cpuset), &cpuset);
|
sc = task_set_affinity(invalid_id, sizeof(cpuset), &cpuset);
|
||||||
rtems_test_assert(sc == RTEMS_INVALID_ID);
|
rtems_test_assert(sc == RTEMS_INVALID_ID);
|
||||||
|
|
||||||
sc = rtems_task_get_affinity(RTEMS_SELF, sizeof(cpuset), &cpuset);
|
sc = task_get_affinity(RTEMS_SELF, sizeof(cpuset), &cpuset);
|
||||||
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
|
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
|
||||||
|
|
||||||
rtems_test_assert(CPU_EQUAL(&cpuset, &cpusetone));
|
rtems_test_assert(CPU_EQUAL(&cpuset, &cpusetone));
|
||||||
|
|
||||||
sc = rtems_task_set_affinity(RTEMS_SELF, sizeof(cpuset), &cpuset);
|
sc = task_set_affinity(RTEMS_SELF, sizeof(cpuset), &cpuset);
|
||||||
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
|
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
|
||||||
|
|
||||||
sc = rtems_task_set_affinity(self_id, sizeof(cpuset), &cpuset);
|
sc = task_set_affinity(self_id, sizeof(cpuset), &cpuset);
|
||||||
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
|
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
|
||||||
|
|
||||||
sc = rtems_task_set_affinity(task_id, sizeof(cpuset), &cpuset);
|
sc = task_set_affinity(task_id, sizeof(cpuset), &cpuset);
|
||||||
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
|
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
|
||||||
|
|
||||||
sc = rtems_task_get_affinity(task_id, sizeof(cpuset), &cpuset);
|
sc = task_get_affinity(task_id, sizeof(cpuset), &cpuset);
|
||||||
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
|
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
|
||||||
|
|
||||||
rtems_test_assert(CPU_EQUAL(&cpuset, &cpusetone));
|
rtems_test_assert(CPU_EQUAL(&cpuset, &cpusetone));
|
||||||
|
|
||||||
sc = rtems_task_set_affinity(RTEMS_SELF, sizeof(cpusetall), &cpusetall);
|
sc = task_set_affinity(RTEMS_SELF, sizeof(cpusetall), &cpusetall);
|
||||||
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
|
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
|
||||||
|
|
||||||
sc = rtems_task_get_affinity(task_id, sizeof(cpuset), &cpuset);
|
sc = task_get_affinity(task_id, sizeof(cpuset), &cpuset);
|
||||||
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
|
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
|
||||||
|
|
||||||
rtems_test_assert(CPU_EQUAL(&cpuset, &cpusetone));
|
rtems_test_assert(CPU_EQUAL(&cpuset, &cpusetone));
|
||||||
|
|
||||||
cpusetbigone = CPU_ALLOC(big);
|
cpusetbigone = CPU_ALLOC(BIG_NUM_CPUS);
|
||||||
rtems_test_assert(cpusetbigone != NULL);
|
rtems_test_assert(cpusetbigone != NULL);
|
||||||
|
|
||||||
cpusetbig = CPU_ALLOC(big);
|
cpusetbig = CPU_ALLOC(BIG_NUM_CPUS);
|
||||||
rtems_test_assert(cpusetbig != NULL);
|
rtems_test_assert(cpusetbig != NULL);
|
||||||
|
|
||||||
CPU_ZERO_S(cpusetbigsize, cpusetbigone);
|
CPU_ZERO_S(cpusetbigsize, cpusetbigone);
|
||||||
CPU_SET_S(0, cpusetbigsize, cpusetbigone);
|
CPU_SET_S(0, cpusetbigsize, cpusetbigone);
|
||||||
|
|
||||||
sc = rtems_task_get_affinity(task_id, cpusetbigsize, cpusetbig);
|
sc = task_get_affinity(task_id, cpusetbigsize, cpusetbig);
|
||||||
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
|
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
|
||||||
|
|
||||||
rtems_test_assert(CPU_EQUAL_S(cpusetbigsize, cpusetbig, cpusetbigone));
|
rtems_test_assert(CPU_EQUAL_S(cpusetbigsize, cpusetbig, cpusetbigone));
|
||||||
|
|
||||||
sc = rtems_task_set_affinity(task_id, cpusetbigsize, cpusetbig);
|
sc = task_set_affinity(task_id, cpusetbigsize, cpusetbig);
|
||||||
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
|
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
|
||||||
|
|
||||||
sc = rtems_task_delete(task_id);
|
sc = rtems_task_delete(task_id);
|
||||||
@@ -408,8 +482,7 @@ static void test_scheduler_get_processors(void)
|
|||||||
rtems_id scheduler_id;
|
rtems_id scheduler_id;
|
||||||
cpu_set_t cpusetone;
|
cpu_set_t cpusetone;
|
||||||
cpu_set_t cpuset;
|
cpu_set_t cpuset;
|
||||||
size_t big = 2 * CHAR_BIT * sizeof(cpu_set_t);
|
size_t cpusetbigsize = CPU_ALLOC_SIZE(BIG_NUM_CPUS);
|
||||||
size_t cpusetbigsize = CPU_ALLOC_SIZE(big);
|
|
||||||
cpu_set_t *cpusetbigone;
|
cpu_set_t *cpusetbigone;
|
||||||
cpu_set_t *cpusetbig;
|
cpu_set_t *cpusetbig;
|
||||||
|
|
||||||
@@ -433,10 +506,10 @@ static void test_scheduler_get_processors(void)
|
|||||||
|
|
||||||
rtems_test_assert(CPU_EQUAL(&cpuset, &cpusetone));
|
rtems_test_assert(CPU_EQUAL(&cpuset, &cpusetone));
|
||||||
|
|
||||||
cpusetbigone = CPU_ALLOC(big);
|
cpusetbigone = CPU_ALLOC(BIG_NUM_CPUS);
|
||||||
rtems_test_assert(cpusetbigone != NULL);
|
rtems_test_assert(cpusetbigone != NULL);
|
||||||
|
|
||||||
cpusetbig = CPU_ALLOC(big);
|
cpusetbig = CPU_ALLOC(BIG_NUM_CPUS);
|
||||||
rtems_test_assert(cpusetbig != NULL);
|
rtems_test_assert(cpusetbig != NULL);
|
||||||
|
|
||||||
CPU_ZERO_S(cpusetbigsize, cpusetbigone);
|
CPU_ZERO_S(cpusetbigsize, cpusetbigone);
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ directives:
|
|||||||
|
|
||||||
- rtems_task_get_affinity()
|
- rtems_task_get_affinity()
|
||||||
- rtems_task_set_affinity()
|
- rtems_task_set_affinity()
|
||||||
|
- pthread_getaffinity_np()
|
||||||
|
- pthread_setaffinity_np()
|
||||||
- rtems_task_get_scheduler()
|
- rtems_task_get_scheduler()
|
||||||
- rtems_task_set_scheduler()
|
- rtems_task_set_scheduler()
|
||||||
- rtems_scheduler_ident()
|
- rtems_scheduler_ident()
|
||||||
|
|||||||
Reference in New Issue
Block a user