Back to home page

LXR

 
 

    


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

0001 /* SPDX-License-Identifier: BSD-2-Clause */
0002 
0003 /*
0004  * Copyright (c) 2013 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 "tmacros.h"
0033 
0034 #include <stdlib.h>
0035 
0036 /* Use assert() not rtems_test_assert() since it uses exit() */
0037 #include <assert.h>
0038 
0039 #include <rtems.h>
0040 
0041 const char rtems_test_name[] = "EXIT 1";
0042 
0043 #define EXIT_STATUS 123
0044 
0045 static int counter;
0046 
0047 static void atexit_0(void)
0048 {
0049   assert(counter == 0);
0050   ++counter;
0051 }
0052 
0053 static void atexit_1(void)
0054 {
0055   assert(counter == 1);
0056   ++counter;
0057 }
0058 
0059 static void atexit_2(void)
0060 {
0061   assert(counter == 2);
0062   ++counter;
0063 }
0064 
0065 static void fatal_extension(
0066   rtems_fatal_source source,
0067   bool always_set_to_false,
0068   rtems_fatal_code error
0069 )
0070 {
0071   if (
0072     source == RTEMS_FATAL_SOURCE_EXIT
0073       && !always_set_to_false
0074       && error == EXIT_STATUS
0075       && counter == 3
0076   ) {
0077     TEST_END();
0078   }
0079 }
0080 
0081 static void exit_task(rtems_task_argument arg)
0082 {
0083   int rv;
0084 
0085   rv = atexit(atexit_2);
0086   assert(rv == 0);
0087 
0088   rv = atexit(atexit_1);
0089   assert(rv == 0);
0090 
0091   rv = atexit(atexit_0);
0092   assert(rv == 0);
0093 
0094   exit(EXIT_STATUS);
0095 }
0096 
0097 static void Init(rtems_task_argument arg)
0098 {
0099   rtems_status_code sc;
0100   rtems_id id;
0101 
0102   TEST_BEGIN();
0103 
0104   sc = rtems_task_create(
0105     rtems_build_name('E', 'X', 'I', 'T'),
0106     RTEMS_MINIMUM_PRIORITY,
0107     RTEMS_MINIMUM_STACK_SIZE,
0108     RTEMS_DEFAULT_MODES,
0109     RTEMS_DEFAULT_ATTRIBUTES,
0110     &id
0111   );
0112   assert(sc == RTEMS_SUCCESSFUL);
0113 
0114   sc = rtems_task_start(id, exit_task, 0);
0115   assert(sc == RTEMS_SUCCESSFUL);
0116 
0117   rtems_task_exit();
0118 }
0119 
0120 #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
0121 #define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER
0122 
0123 #define CONFIGURE_INITIAL_EXTENSIONS \
0124   { .fatal = fatal_extension }, \
0125   RTEMS_TEST_INITIAL_EXTENSION
0126 
0127 #define CONFIGURE_MAXIMUM_TASKS 2
0128 
0129 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE
0130 
0131 #define CONFIGURE_INIT
0132 
0133 #include <rtems/confdefs.h>