Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:24:48

0001 /* SPDX-License-Identifier: BSD-2-Clause */
0002 
0003 /*
0004  * Copyright (c) 2014 embedded brains GmbH & Co. KG
0005  *
0006  * Redistribution and use in source and binary forms, with or without
0007  * modification, are permitted provided that the following conditions
0008  * are met:
0009  * 1. Redistributions of source code must retain the above copyright
0010  *    notice, this list of conditions and the following disclaimer.
0011  * 2. Redistributions in binary form must reproduce the above copyright
0012  *    notice, this list of conditions and the following disclaimer in the
0013  *    documentation and/or other materials provided with the distribution.
0014  *
0015  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0016  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0017  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0018  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
0019  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0020  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0021  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0022  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0023  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0024  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0025  * POSSIBILITY OF SUCH DAMAGE.
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>