File indexing completed on 2025-05-11 08:24:48
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028 #ifdef HAVE_CONFIG_H
0029 #include "config.h"
0030 #endif
0031
0032 #include <rtems.h>
0033 #include <rtems/libcsupport.h>
0034
0035 #include "tmacros.h"
0036
0037 const char rtems_test_name[] = "SPMRSP 1";
0038
0039 typedef struct {
0040 rtems_id semaphore_id;
0041 rtems_id task_id;
0042 } test_mrsp_context;
0043
0044 static void create_not_defined(rtems_attribute attr)
0045 {
0046 rtems_status_code sc;
0047 rtems_id id;
0048
0049 sc = rtems_semaphore_create(
0050 rtems_build_name('M', 'R', 'S', 'P'),
0051 1,
0052 attr,
0053 0,
0054 &id
0055 );
0056 rtems_test_assert(sc == RTEMS_NOT_DEFINED);
0057 }
0058
0059 static void test_mrsp_create_errors(void)
0060 {
0061 rtems_status_code sc;
0062 rtems_id id;
0063
0064 puts("test MrsP create errors");
0065
0066 sc = rtems_semaphore_create(
0067 rtems_build_name('M', 'R', 'S', 'P'),
0068 1,
0069 RTEMS_BINARY_SEMAPHORE | RTEMS_PRIORITY
0070 | RTEMS_MULTIPROCESSOR_RESOURCE_SHARING,
0071 UINT32_MAX,
0072 &id
0073 );
0074 rtems_test_assert(sc == RTEMS_INVALID_PRIORITY);
0075
0076 create_not_defined(
0077 RTEMS_MULTIPROCESSOR_RESOURCE_SHARING
0078 | RTEMS_COUNTING_SEMAPHORE
0079 | RTEMS_PRIORITY
0080 );
0081
0082 create_not_defined(
0083 RTEMS_MULTIPROCESSOR_RESOURCE_SHARING
0084 | RTEMS_SIMPLE_BINARY_SEMAPHORE
0085 | RTEMS_PRIORITY
0086 );
0087
0088 create_not_defined(
0089 RTEMS_MULTIPROCESSOR_RESOURCE_SHARING
0090 | RTEMS_BINARY_SEMAPHORE
0091 | RTEMS_FIFO
0092 );
0093
0094 create_not_defined(
0095 RTEMS_MULTIPROCESSOR_RESOURCE_SHARING
0096 | RTEMS_INHERIT_PRIORITY
0097 | RTEMS_BINARY_SEMAPHORE
0098 | RTEMS_PRIORITY
0099 );
0100
0101 create_not_defined(
0102 RTEMS_MULTIPROCESSOR_RESOURCE_SHARING
0103 | RTEMS_PRIORITY_CEILING
0104 | RTEMS_BINARY_SEMAPHORE
0105 | RTEMS_PRIORITY
0106 );
0107
0108 create_not_defined(
0109 RTEMS_MULTIPROCESSOR_RESOURCE_SHARING
0110 | RTEMS_INHERIT_PRIORITY
0111 | RTEMS_PRIORITY_CEILING
0112 | RTEMS_BINARY_SEMAPHORE
0113 | RTEMS_PRIORITY
0114 );
0115 }
0116
0117 static void assert_prio(rtems_task_priority expected_prio)
0118 {
0119 rtems_status_code sc;
0120 rtems_task_priority prio;
0121
0122 sc = rtems_task_set_priority(RTEMS_SELF, RTEMS_CURRENT_PRIORITY, &prio);
0123 rtems_test_assert(sc == RTEMS_SUCCESSFUL);
0124 rtems_test_assert(prio == expected_prio);
0125 }
0126
0127 static void test_mrsp_obtain_release(void)
0128 {
0129 rtems_status_code sc;
0130 rtems_id id;
0131
0132 puts("test MrsP obtain and release");
0133
0134 sc = rtems_semaphore_create(
0135 rtems_build_name('M', 'R', 'S', 'P'),
0136 1,
0137 RTEMS_BINARY_SEMAPHORE | RTEMS_PRIORITY |
0138 RTEMS_MULTIPROCESSOR_RESOURCE_SHARING,
0139 1,
0140 &id
0141 );
0142 rtems_test_assert(sc == RTEMS_SUCCESSFUL);
0143
0144 assert_prio(2);
0145
0146 sc = rtems_semaphore_obtain(id, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
0147 rtems_test_assert(sc == RTEMS_SUCCESSFUL);
0148
0149 assert_prio(1);
0150
0151 sc = rtems_semaphore_delete(id);
0152 rtems_test_assert(sc == RTEMS_RESOURCE_IN_USE);
0153
0154 sc = rtems_semaphore_release(id);
0155 rtems_test_assert(sc == RTEMS_SUCCESSFUL);
0156
0157 assert_prio(2);
0158
0159 sc = rtems_semaphore_delete(id);
0160 rtems_test_assert(sc == RTEMS_SUCCESSFUL);
0161 }
0162
0163 static void test_mrsp_set_priority_errors(void)
0164 {
0165 rtems_status_code sc;
0166 rtems_id id;
0167 rtems_id scheduler_id;
0168 rtems_task_priority prio;
0169
0170 puts("test MrsP set priority errors");
0171
0172 sc = rtems_task_get_scheduler(RTEMS_SELF, &scheduler_id);
0173 rtems_test_assert(sc == RTEMS_SUCCESSFUL);
0174
0175 sc = rtems_semaphore_create(
0176 rtems_build_name('C', 'O', 'N', 'T'),
0177 0,
0178 RTEMS_COUNTING_SEMAPHORE,
0179 0,
0180 &id
0181 );
0182 rtems_test_assert(sc == RTEMS_SUCCESSFUL);
0183
0184 prio = 1;
0185 sc = rtems_semaphore_set_priority(RTEMS_ID_NONE, scheduler_id, prio, &prio);
0186 rtems_test_assert(sc == RTEMS_INVALID_ID);
0187
0188 prio = 1;
0189 sc = rtems_semaphore_set_priority(id, RTEMS_ID_NONE, prio, &prio);
0190 rtems_test_assert(sc == RTEMS_INVALID_ID);
0191
0192 prio = 0xffffffff;
0193 sc = rtems_semaphore_set_priority(id, scheduler_id, prio, &prio);
0194 rtems_test_assert(sc == RTEMS_INVALID_PRIORITY);
0195
0196 prio = 1;
0197 sc = rtems_semaphore_set_priority(id, scheduler_id, prio, NULL);
0198 rtems_test_assert(sc == RTEMS_INVALID_ADDRESS);
0199
0200 prio = 1;
0201 sc = rtems_semaphore_set_priority(id, scheduler_id, prio, &prio);
0202 rtems_test_assert(sc == RTEMS_NOT_DEFINED);
0203
0204 sc = rtems_semaphore_delete(id);
0205 rtems_test_assert(sc == RTEMS_SUCCESSFUL);
0206 }
0207
0208 static void test_mrsp_set_priority(void)
0209 {
0210 rtems_status_code sc;
0211 rtems_id id;
0212 rtems_id scheduler_id;
0213 rtems_task_priority prio;
0214
0215 puts("test MrsP set priority");
0216
0217 sc = rtems_task_get_scheduler(RTEMS_SELF, &scheduler_id);
0218 rtems_test_assert(sc == RTEMS_SUCCESSFUL);
0219
0220 sc = rtems_semaphore_create(
0221 rtems_build_name('M', 'R', 'S', 'P'),
0222 1,
0223 RTEMS_BINARY_SEMAPHORE | RTEMS_PRIORITY |
0224 RTEMS_MULTIPROCESSOR_RESOURCE_SHARING,
0225 1,
0226 &id
0227 );
0228 rtems_test_assert(sc == RTEMS_SUCCESSFUL);
0229
0230 prio = RTEMS_CURRENT_PRIORITY;
0231 sc = rtems_semaphore_set_priority(id, scheduler_id, prio, &prio);
0232 rtems_test_assert(sc == RTEMS_SUCCESSFUL);
0233 rtems_test_assert(prio == 1);
0234
0235 prio = 1;
0236 sc = rtems_semaphore_set_priority(id, scheduler_id, prio, &prio);
0237 rtems_test_assert(sc == RTEMS_SUCCESSFUL);
0238 rtems_test_assert(prio == 1);
0239
0240 prio = 2;
0241 sc = rtems_semaphore_set_priority(id, scheduler_id, prio, &prio);
0242 rtems_test_assert(sc == RTEMS_SUCCESSFUL);
0243 rtems_test_assert(prio == 1);
0244
0245 prio = RTEMS_CURRENT_PRIORITY;
0246 sc = rtems_semaphore_set_priority(id, scheduler_id, prio, &prio);
0247 rtems_test_assert(sc == RTEMS_SUCCESSFUL);
0248 rtems_test_assert(prio == 2);
0249
0250 sc = rtems_semaphore_delete(id);
0251 rtems_test_assert(sc == RTEMS_SUCCESSFUL);
0252 }
0253
0254 static void test_mrsp_task(rtems_task_argument arg)
0255 {
0256 test_mrsp_context *ctx = (test_mrsp_context *) arg;
0257 rtems_status_code sc;
0258
0259 sc = rtems_semaphore_release(ctx->semaphore_id);
0260 rtems_test_assert(sc == RTEMS_NOT_OWNER_OF_RESOURCE);
0261
0262 sc = rtems_semaphore_obtain(ctx->semaphore_id, RTEMS_NO_WAIT, 0);
0263 rtems_test_assert(sc == RTEMS_UNSATISFIED);
0264
0265 sc = rtems_semaphore_obtain(ctx->semaphore_id, RTEMS_WAIT, 1);
0266 rtems_test_assert(sc == RTEMS_TIMEOUT);
0267
0268 sc = rtems_event_transient_send(ctx->task_id);
0269 rtems_test_assert(sc == RTEMS_SUCCESSFUL);
0270
0271 rtems_task_exit();
0272 rtems_test_assert(0);
0273 }
0274
0275 static void test_mrsp_timeout_and_not_owner_of_resource(void)
0276 {
0277 rtems_status_code sc;
0278 rtems_id id;
0279 rtems_id task_id;
0280 test_mrsp_context ctx;
0281
0282 puts("test MrsP timeout and not owner of resource");
0283
0284 sc = rtems_semaphore_create(
0285 rtems_build_name('M', 'R', 'S', 'P'),
0286 1,
0287 RTEMS_BINARY_SEMAPHORE | RTEMS_PRIORITY |
0288 RTEMS_MULTIPROCESSOR_RESOURCE_SHARING,
0289 1,
0290 &id
0291 );
0292 rtems_test_assert(sc == RTEMS_SUCCESSFUL);
0293
0294 sc = rtems_semaphore_obtain(id, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
0295 rtems_test_assert(sc == RTEMS_SUCCESSFUL);
0296
0297 sc = rtems_task_create(
0298 rtems_build_name('M', 'R', 'S', 'P'),
0299 1,
0300 RTEMS_MINIMUM_STACK_SIZE,
0301 RTEMS_DEFAULT_MODES,
0302 RTEMS_DEFAULT_ATTRIBUTES,
0303 &task_id
0304 );
0305 rtems_test_assert(sc == RTEMS_SUCCESSFUL);
0306
0307 ctx.semaphore_id = id;
0308 ctx.task_id = rtems_task_self();
0309
0310 sc = rtems_task_start(task_id, test_mrsp_task, (rtems_task_argument) &ctx);
0311 rtems_test_assert(sc == RTEMS_SUCCESSFUL);
0312
0313 sc = rtems_event_transient_receive(RTEMS_WAIT, RTEMS_NO_TIMEOUT);
0314 rtems_test_assert(sc == RTEMS_SUCCESSFUL);
0315
0316 sc = rtems_semaphore_release(id);
0317 rtems_test_assert(sc == RTEMS_SUCCESSFUL);
0318
0319 sc = rtems_semaphore_delete(id);
0320 rtems_test_assert(sc == RTEMS_SUCCESSFUL);
0321 }
0322
0323 static void Init(rtems_task_argument arg)
0324 {
0325 rtems_resource_snapshot snapshot;
0326
0327 TEST_BEGIN();
0328
0329 rtems_resource_snapshot_take(&snapshot);
0330
0331 test_mrsp_create_errors();
0332 test_mrsp_obtain_release();
0333 test_mrsp_set_priority_errors();
0334 test_mrsp_set_priority();
0335 test_mrsp_timeout_and_not_owner_of_resource();
0336
0337 rtems_test_assert(rtems_resource_snapshot_check(&snapshot));
0338
0339 TEST_END();
0340 rtems_test_exit(0);
0341 }
0342
0343 #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
0344 #define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER
0345
0346 #define CONFIGURE_MAXIMUM_TASKS 2
0347 #define CONFIGURE_MAXIMUM_SEMAPHORES 1
0348
0349 #define CONFIGURE_INIT_TASK_PRIORITY 2
0350
0351 #define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
0352
0353 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE
0354
0355 #define CONFIGURE_INIT
0356
0357 #include <rtems/confdefs.h>