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.jo...@embedded-brains.de> wrote:

    From: Matt Joyce <matthew.jo...@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@rtems.org
    http://lists.rtems.org/mailman/listinfo/devel

--
embedded brains GmbH
Herr Matthew JOYCE
Dornierstr. 4
82178 Puchheim
Germany
_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel

Reply via email to