static int user_main()

in testing/ostest/ostest_main.c [214:604]


static int user_main(int argc, char *argv[])
{
  int i;

  /* Sample the memory usage now */

  usleep(HALF_SECOND_USEC);

  g_mmbefore = mallinfo();
  g_mmprevious = g_mmbefore;

  printf("\nuser_main: Begin argument test\n");
  printf("user_main: Started with argc=%d\n", argc);

  /* Verify passed arguments */

  if (argc != NARGS + 1)
    {
      printf("user_main: ERROR expected argc=%d got argc=%d\n",
             NARGS + 1, argc);
      ASSERT(false);
    }

  for (i = 0; i <= NARGS; i++)
    {
      printf("user_main: argv[%d]=\"%s\"\n", i, argv[i]);
    }

  for (i = 1; i <= NARGS; i++)
    {
      if (strcmp(argv[i], g_argv[i - 1]) != 0)
        {
          printf("user_main: ERROR argv[%d]:  "
                 "Expected \"%s\" found \"%s\"\n",
                 i, g_argv[i - 1], argv[i]);
          ASSERT(false);
        }
    }

  check_test_memory_usage();

  /* Test additional getopt(), getopt_long(), and getopt_long_only()
   * features.
   */

  printf("\nuser_main: getopt() test\n");
  getopt_test();
  check_test_memory_usage();

  /* If retention of child status is enable, then suppress it for this task.
   * This task may produce many, many children (especially if
   * CONFIG_TESTING_OSTEST_LOOPS) and it does not harvest their exit status.
   * As a result, the test may fail inappropriately unless retention of
   * child exit status is disabled.
   *
   * So basically, this tests that child status can be disabled, but cannot
   * verify that status is retained correctly.
   */

#if defined(CONFIG_SCHED_HAVE_PARENT) && defined(CONFIG_SCHED_CHILD_STATUS)
    {
      struct sigaction sa;
      int ret;

      sa.sa_handler = SIG_IGN;
      sa.sa_flags = SA_NOCLDWAIT;
      ret = sigaction(SIGCHLD, &sa, NULL);
      if (ret < 0)
        {
          printf("user_main: ERROR: sigaction failed: %d\n", errno);
          ASSERT(false);
        }
    }
#endif

#ifndef CONFIG_DISABLE_ENVIRON
  /* Check environment variables */

  show_environment(true, true, true);

  unsetenv(g_var1_name);
  show_environment(false, true, true);
  check_test_memory_usage();

  clearenv();
  show_environment(false, false, false);
  check_test_memory_usage();
#endif

#if CONFIG_TLS_NELEM > 0
  /* Test TLS */

  tls_test();
  check_test_memory_usage();
#endif

  /* Top of test loop */

#if CONFIG_TESTING_OSTEST_LOOPS > 1
  for (i = 0; i < CONFIG_TESTING_OSTEST_LOOPS; i++)
#elif CONFIG_TESTING_OSTEST_LOOPS == 0
  for (; ; )
#endif
    {
#ifndef CONFIG_STDIO_DISABLE_BUFFERING
      /* Checkout setvbuf */

      printf("\nuser_main: setvbuf test\n");
      setvbuf_test();
      check_test_memory_usage();
#endif

      /* Checkout /dev/null */

#ifdef CONFIG_DEV_NULL
      printf("\nuser_main: /dev/null test\n");
      dev_null_test();
      check_test_memory_usage();
#endif

#ifdef CONFIG_TESTING_OSTEST_AIO
      /* Check asynchronous I/O */

      printf("\nuser_main: AIO test\n");
      aio_test();
      check_test_memory_usage();
#endif

#if defined(CONFIG_ARCH_FPU) && !defined(CONFIG_TESTING_OSTEST_FPUTESTDISABLE)
      /* Check that the FPU is properly supported during context switching */

      printf("\nuser_main: FPU test\n");
      fpu_test();
      check_test_memory_usage();
#endif

      /* Checkout task_restart() */

      printf("\nuser_main: task_restart test\n");
      restart_test();
      check_test_memory_usage();

#ifdef CONFIG_SCHED_WAITPID
      /* Check waitpid() and friends */

      printf("\nuser_main: waitpid test\n");
      waitpid_test();
      check_test_memory_usage();
#endif

#if !defined(CONFIG_DISABLE_PTHREAD) && \
    (defined(CONFIG_SCHED_LPWORK) || defined(CONFIG_SCHED_HPWORK))
      /* Check work queues */

      printf("\nuser_main: wqueue test\n");
      wqueue_test();
      check_test_memory_usage();
#endif

#ifndef CONFIG_DISABLE_PTHREAD
      /* Verify pthreads and pthread mutex */

      printf("\nuser_main: mutex test\n");
      mutex_test();
      check_test_memory_usage();

      printf("\nuser_main: timed mutex test\n");
      timedmutex_test();
      check_test_memory_usage();
#endif

#if !defined(CONFIG_DISABLE_PTHREAD) && defined(CONFIG_PTHREAD_MUTEX_TYPES)
      /* Verify recursive mutexes */

      printf("\nuser_main: recursive mutex test\n");
      recursive_mutex_test();
      check_test_memory_usage();
#endif

#if !defined(CONFIG_DISABLE_PTHREAD) && CONFIG_TLS_NELEM > 0
      /* Verify pthread-specific data */

      printf("\nuser_main: pthread-specific data test\n");
      specific_test();
      check_test_memory_usage();
#endif

#ifndef CONFIG_DISABLE_PTHREAD
      /* Verify pthread cancellation */

      printf("\nuser_main: cancel test\n");
      cancel_test();
      check_test_memory_usage();

#ifndef CONFIG_PTHREAD_MUTEX_UNSAFE
      printf("\nuser_main: robust test\n");
      robust_test();
      check_test_memory_usage();
#endif
#endif

#ifndef CONFIG_DISABLE_PTHREAD
      /* Verify pthreads and semaphores */

      printf("\nuser_main: semaphore test\n");
      sem_test();
      check_test_memory_usage();

      printf("\nuser_main: timed semaphore test\n");
      semtimed_test();
      check_test_memory_usage();

#ifdef CONFIG_FS_NAMED_SEMAPHORES
      printf("\nuser_main: Named semaphore test\n");
      nsem_test();
      check_test_memory_usage();

#endif
#endif

#ifndef CONFIG_DISABLE_PTHREAD
      /* Verify pthreads and condition variables */

      printf("\nuser_main: condition variable test\n");
#ifdef CONFIG_PRIORITY_INHERITANCE
      printf("\n           Skipping, "
             "Test logic incompatible with priority inheritance\n");
#else
      cond_test();
      check_test_memory_usage();
#endif

#ifdef CONFIG_SCHED_WAITPID
      /* Verify pthread_exit() and pthread_self() */

      printf("\nuser_main: pthread_exit() test\n");
      pthread_exit_test();
      check_test_memory_usage();
#endif

      /* Verify pthreads rwlock interfaces */

      printf("\nuser_main: pthread_rwlock test\n");
      pthread_rwlock_test();
      check_test_memory_usage();

      printf("\nuser_main: pthread_rwlock_cancel test\n");
      pthread_rwlock_cancel_test();
      check_test_memory_usage();

#if CONFIG_PTHREAD_CLEANUP_STACKSIZE > 0
      /* Verify pthread cancellation cleanup handlers */

      printf("\nuser_main: pthread_cleanup test\n");
      pthread_cleanup_test();
      check_test_memory_usage();
#endif

      /* Verify pthreads and condition variable timed waits */

      printf("\nuser_main: timed wait test\n");
      timedwait_test();
      check_test_memory_usage();
#endif /* !CONFIG_DISABLE_PTHREAD */

#if !defined(CONFIG_DISABLE_MQUEUE) && !defined(CONFIG_DISABLE_PTHREAD)
      /* Verify pthreads and message queues */

      printf("\nuser_main: message queue test\n");
      mqueue_test();
      check_test_memory_usage();
#endif

#if !defined(CONFIG_DISABLE_MQUEUE) && !defined(CONFIG_DISABLE_PTHREAD)
      /* Verify pthreads and message queues */

      printf("\nuser_main: timed message queue test\n");
      timedmqueue_test();
      check_test_memory_usage();
#endif

      /* Verify that we can modify the signal mask */

      printf("\nuser_main: sigprocmask test\n");
      sigprocmask_test();
      check_test_memory_usage();

      /* Verify signal handlers */

      printf("\nuser_main: signal handler test\n");
      sighand_test();
      check_test_memory_usage();

      printf("\nuser_main: nested signal handler test\n");
      signest_test();
      check_test_memory_usage();

#if defined(CONFIG_SIG_SIGSTOP_ACTION) && defined(CONFIG_SIG_SIGKILL_ACTION)
      printf("\nuser_main: signal action test\n");
      suspend_test();
      check_test_memory_usage();
#endif

#ifndef CONFIG_DISABLE_POSIX_TIMERS
      /* Verify posix timers (with SIGEV_SIGNAL) */

      printf("\nuser_main: POSIX timer test\n");
      timer_test();
      check_test_memory_usage();

#ifdef CONFIG_SIG_EVTHREAD
      /* Verify posix timers (with SIGEV_THREAD) */

      printf("\nuser_main: SIGEV_THREAD timer test\n");
      sigev_thread_test();
      check_test_memory_usage();
#endif
#endif

#if !defined(CONFIG_DISABLE_PTHREAD) && CONFIG_RR_INTERVAL > 0
      /* Verify round robin scheduling */

      printf("\nuser_main: round-robin scheduler test\n");
      rr_test();
      check_test_memory_usage();
#endif

#if !defined(CONFIG_DISABLE_PTHREAD) && defined(CONFIG_SCHED_SPORADIC)
      /* Verify sporadic scheduling */

      printf("\nuser_main: sporadic scheduler test\n");
      sporadic_test();
      check_test_memory_usage();

      printf("\nuser_main: Dual sporadic thread test\n");
      sporadic2_test();
      check_test_memory_usage();
#endif

#ifndef CONFIG_DISABLE_PTHREAD
      /* Verify pthread barriers */

      printf("\nuser_main: barrier test\n");
      barrier_test();
      check_test_memory_usage();
#endif

#ifdef CONFIG_ARCH_SETJMP_H
      /* Verify setjmp/longjmp */

      printf("\nuser_main: setjmp test\n");
      setjmp_test();
      check_test_memory_usage();
#endif

#if defined(CONFIG_PRIORITY_INHERITANCE) && !defined(CONFIG_DISABLE_PTHREAD)
      /* Verify priority inheritance */

      printf("\nuser_main: priority inheritance test\n");
      priority_inheritance();
      check_test_memory_usage();
#endif /* CONFIG_PRIORITY_INHERITANCE && !CONFIG_DISABLE_PTHREAD */

#ifndef CONFIG_DISABLE_PTHREAD
      printf("\nuser_main: scheduler lock test\n");
      sched_lock_test();
      check_test_memory_usage();
#endif

#if defined(CONFIG_ARCH_HAVE_VFORK) && defined(CONFIG_SCHED_WAITPID)
      printf("\nuser_main: vfork() test\n");
      vfork_test();
#endif

      /* Compare memory usage at time ostest_main started until
       * user_main exits.  These should not be identical, but should
       * be similar enough that we can detect any serious OS memory
       * leaks.
       */

      usleep(HALF_SECOND_USEC);

      g_mmafter = mallinfo();

      printf("\nFinal memory usage:\n");
      show_memory_usage(&g_mmbefore, &g_mmafter);
    }

  printf("user_main: Exiting\n");
  return 0;
}