[PATCH v2 1/1] newlib01: Check exit procs for global FILE obj
Matthew Joyce
matthew.joyce at embedded-brains.de
Tue Mar 29 13:20:21 UTC 2022
Hi Dr. Joel,
I just sent an update which addresses these issues.
Thanks!
Sincerely,
Matt
On 28.03.22 23:13, Joel Sherrill wrote:
> I don't see anything obviously wrong but I don't have any idea what
> the test is actually trying to exercise.
>
> How about some comments and is there a doc file in this test directory
> that needs updating?
>
> --joel
>
> On Mon, Mar 28, 2022 at 4:04 AM Matthew Joyce
> <matthew.joyce at embedded-brains.de> wrote:
>
> From: Matt Joyce <matthew.joyce at embedded-brains.de>
>
> ---
> testsuites/libtests/newlib01/init.c | 110
> ++++++++++++++++++++++------
> 1 file changed, 88 insertions(+), 22 deletions(-)
>
> diff --git a/testsuites/libtests/newlib01/init.c
> b/testsuites/libtests/newlib01/init.c
> index c58154023b..bba187e8e2 100644
> --- a/testsuites/libtests/newlib01/init.c
> +++ b/testsuites/libtests/newlib01/init.c
> @@ -28,6 +28,8 @@ const char rtems_test_name[] = "NEWLIB 1";
>
> static const char file_path[] = "/file";
>
> +static const char file_path2[] = "/file2";
> +
> typedef enum {
> INIT,
> OPEN,
> @@ -39,6 +41,8 @@ typedef struct {
> rtems_id main_task_id;
> rtems_id worker_task_id;
> test_state current;
> + FILE *glob_file_stream;
> + int glob_fd;
> } test_context;
>
> static test_context test_instance;
> @@ -59,7 +63,7 @@ static void wait(void)
> rtems_test_assert(sc == RTEMS_SUCCESSFUL);
> }
>
> -static void worker_task(rtems_task_argument arg)
> +static void thread_specific_worker(rtems_task_argument arg)
> {
> test_context *ctx = &test_instance;
> struct _reent *reent = _REENT;
> @@ -90,6 +94,30 @@ static void worker_task(rtems_task_argument arg)
> rtems_test_assert(0);
> }
>
> +static void global_file_object_worker(rtems_task_argument arg)
> +{
> + test_context *ctx = &test_instance;
> + FILE *fp;
> + char buf[1] = { 'y' };
> + size_t n;
> + int fd;
> +
> + fp = ctx->glob_file_stream = fopen(&file_path2[0], "w");
> + rtems_test_assert(fp != NULL);
> +
> + /* Get file descriptor of new global file stream, store it in
> text context */
> + fd = fileno(fp);
> + rtems_test_assert(fd != -1);
> + ctx->glob_fd = fd;
> +
> + n = fwrite(&buf[0], sizeof(buf), 1, fp);
> + rtems_test_assert(n == 1);
> +
> + wake_up_main(ctx);
> +
> + rtems_test_assert(0);
> +}
> +
> static int handler_open(
> rtems_libio_t *iop,
> const char *path,
> @@ -250,9 +278,34 @@ static const IMFS_node_control node_control =
> IMFS_GENERIC_INITIALIZER(
> IMFS_node_destroy_default
> );
>
> -static void test_thread_specific_close(test_context *ctx)
> +static void task_create_and_delete_helper(
> + test_context *ctx,
> + rtems_task_entry entry
> +)
> {
> rtems_status_code sc;
> +
> + sc = rtems_task_create(
> + rtems_build_name('W', 'O', 'R', 'K'),
> + 2,
> + RTEMS_MINIMUM_STACK_SIZE,
> + RTEMS_DEFAULT_MODES,
> + RTEMS_DEFAULT_ATTRIBUTES,
> + &ctx->worker_task_id
> + );
> + rtems_test_assert(sc == RTEMS_SUCCESSFUL);
> +
> + sc = rtems_task_start(ctx->worker_task_id, entry, 0);
> + rtems_test_assert(sc == RTEMS_SUCCESSFUL);
> +
> + wait();
> +
> + sc = rtems_task_delete(ctx->worker_task_id);
> + rtems_test_assert(sc == RTEMS_SUCCESSFUL);
> +}
> +
> +static void test_thread_specific_close(test_context *ctx)
> +{
> int rv;
> rtems_resource_snapshot snapshot;
>
> @@ -266,23 +319,7 @@ static void
> test_thread_specific_close(test_context *ctx)
> );
> rtems_test_assert(rv == 0);
>
> - sc = rtems_task_create(
> - rtems_build_name('W', 'O', 'R', 'K'),
> - 2,
> - RTEMS_MINIMUM_STACK_SIZE,
> - RTEMS_DEFAULT_MODES,
> - RTEMS_DEFAULT_ATTRIBUTES,
> - &ctx->worker_task_id
> - );
> - rtems_test_assert(sc == RTEMS_SUCCESSFUL);
> -
> - sc = rtems_task_start(ctx->worker_task_id, worker_task, 0);
> - rtems_test_assert(sc == RTEMS_SUCCESSFUL);
> -
> - wait();
> -
> - sc = rtems_task_delete(ctx->worker_task_id);
> - rtems_test_assert(sc == RTEMS_SUCCESSFUL);
> + task_create_and_delete_helper(ctx, thread_specific_worker);
>
> rv = unlink(&file_path[0]);
> rtems_test_assert(rv == 0);
> @@ -290,6 +327,11 @@ static void
> test_thread_specific_close(test_context *ctx)
> rtems_test_assert(rtems_resource_snapshot_check(&snapshot));
> }
>
> +static void test_global_file_object_close(test_context *ctx)
> +{
> + task_create_and_delete_helper(ctx, global_file_object_worker);
> +}
> +
> /*
> * This exit handler will be called last among the functions
> registered with
> * atexit(). Check that stdio file descriptors are closed. The
> Newlib cleanup
> @@ -298,6 +340,7 @@ static void
> test_thread_specific_close(test_context *ctx)
> */
> static void check_after_libio_exit(void)
> {
> + test_context *ctx = &test_instance;
> struct stat unused;
> int rv;
>
> @@ -319,6 +362,11 @@ static void check_after_libio_exit(void)
> rtems_test_assert(stdin->_flags != 0);
> rtems_test_assert(stdout->_flags != 0);
> rtems_test_assert(stderr->_flags != 0);
> +
> + /* Global file tests. Global fd still open at this point. */
> + rv = fstat(ctx->glob_fd, &unused);
> + rtems_test_assert(rv == 0);
> + rtems_test_assert(ctx->glob_file_stream->_flags != 0);
> }
>
> static void register_exit_handler_before_libio_exit(void)
> @@ -342,7 +390,7 @@
> RTEMS_SYSINIT_ITEM(register_exit_handler_before_libio_exit,
> * cleanup procedures have been called. Therefore, stdio file
> descriptors
> * should be open and stdio FILE object flags should be non-zero.
> */
> -static void test_exit_handling(void)
> +static void test_exit_handling(test_context *ctx)
> {
> struct stat unused;
> int rv;
> @@ -360,6 +408,14 @@ static void test_exit_handling(void)
> rtems_test_assert(stdout->_flags != 0);
> rtems_test_assert(stderr->_flags != 0);
>
> + /*
> + * Global file descriptor should still be open; global FILE
> object flags
> + * should still be non-zero.
> + */
> + rv = fstat(ctx->glob_fd, &unused);
> + rtems_test_assert(rv == 0);
> + rtems_test_assert(ctx->glob_file_stream->_flags != 0);
> +
> /* Run exit handlers and Newlib cleanup procedures */
> exit(0);
> }
> @@ -380,7 +436,8 @@ static void Init(rtems_task_argument arg)
> rtems_test_assert(rv == 0);
>
> test_thread_specific_close(ctx);
> - test_exit_handling();
> + test_global_file_object_close(ctx);
> + test_exit_handling(ctx);
> }
>
> static void fatal_extension(
> @@ -400,6 +457,7 @@ static void fatal_extension(
> */
> struct stat unused;
> int rv;
> + test_context *ctx = &test_instance;
>
> errno = 0;
> rv = fstat(0, &unused);
> @@ -419,6 +477,14 @@ static void fatal_extension(
> rtems_test_assert(stdin->_flags == 0);
> rtems_test_assert(stdout->_flags == 0);
> rtems_test_assert(stderr->_flags == 0);
> +
> + /* Global file tests */
> + errno = 0;
> + rv = fstat(ctx->glob_fd, &unused);
> + rtems_test_assert(rv == -1);
> + rtems_test_assert(errno == EBADF);
> + rtems_test_assert(ctx->glob_file_stream->_flags == 0);
> +
> TEST_END();
> }
> }
> @@ -426,7 +492,7 @@ static void fatal_extension(
> #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
> #define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER
>
> -#define CONFIGURE_MAXIMUM_FILE_DESCRIPTORS 4
> +#define CONFIGURE_MAXIMUM_FILE_DESCRIPTORS 5
>
> #define CONFIGURE_MAXIMUM_TASKS 2
>
> --
> 2.31.1
>
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel
>
--
embedded brains GmbH
Herr Matthew JOYCE
Dornierstr. 4
82178 Puchheim
Germany
More information about the devel
mailing list