2013-02-06 16:43:28 +01:00
|
|
|
/****************************************************************************
|
2021-06-10 07:51:27 +02:00
|
|
|
* apps/testing/ostest/restart.c
|
2013-02-06 16:43:28 +01:00
|
|
|
*
|
2021-06-10 07:51:27 +02:00
|
|
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
|
|
* contributor license agreements. See the NOTICE file distributed with
|
|
|
|
* this work for additional information regarding copyright ownership. The
|
|
|
|
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
|
|
|
* "License"); you may not use this file except in compliance with the
|
|
|
|
* License. You may obtain a copy of the License at
|
2013-02-06 16:43:28 +01:00
|
|
|
*
|
2021-06-10 07:51:27 +02:00
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
2013-02-06 16:43:28 +01:00
|
|
|
*
|
2021-06-10 07:51:27 +02:00
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
|
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
|
|
* License for the specific language governing permissions and limitations
|
|
|
|
* under the License.
|
2013-02-06 16:43:28 +01:00
|
|
|
*
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Included Files
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
#include <nuttx/config.h>
|
|
|
|
|
2023-03-16 03:35:15 +01:00
|
|
|
#include <assert.h>
|
|
|
|
#include <errno.h>
|
|
|
|
#include <sched.h>
|
|
|
|
#include <semaphore.h>
|
2013-02-06 16:43:28 +01:00
|
|
|
#include <stdbool.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
|
|
|
|
#include "ostest.h"
|
|
|
|
|
2023-11-14 11:46:17 +01:00
|
|
|
#ifndef CONFIG_BUILD_KERNEL
|
|
|
|
|
2013-02-06 16:43:28 +01:00
|
|
|
/****************************************************************************
|
|
|
|
* Pre-processor Definitions
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
#define PRIORITY 100
|
|
|
|
#define NARGS 3
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Private Data
|
|
|
|
****************************************************************************/
|
|
|
|
|
2021-06-10 11:56:16 +02:00
|
|
|
static char * const g_argv[NARGS + 1] =
|
2013-02-06 16:43:28 +01:00
|
|
|
{
|
|
|
|
"This is argument 1",
|
|
|
|
"Argument 2 here",
|
|
|
|
"Lastly, the 3rd argument",
|
|
|
|
NULL
|
|
|
|
};
|
|
|
|
|
2017-08-12 20:15:21 +02:00
|
|
|
#ifndef CONFIG_DISABLE_ENVIRON
|
2013-02-06 16:43:28 +01:00
|
|
|
static const char g_varname[] = "VarName";
|
|
|
|
static const char g_varvalue[] = "VarValue";
|
2017-08-12 20:15:21 +02:00
|
|
|
#endif
|
|
|
|
|
2022-10-09 10:30:55 +02:00
|
|
|
static uint8_t g_restartstep;
|
|
|
|
|
|
|
|
static sem_t g_sem;
|
2013-02-06 16:43:28 +01:00
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Private Functions
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
static int restart_main(int argc, char *argv[])
|
|
|
|
{
|
|
|
|
#ifndef CONFIG_DISABLE_ENVIRON
|
|
|
|
char *actual;
|
|
|
|
#endif
|
|
|
|
int i;
|
|
|
|
|
|
|
|
printf("restart_main: Started with argc=%d\n", argc);
|
|
|
|
|
|
|
|
/* Verify passed arguments */
|
|
|
|
|
|
|
|
if (argc != NARGS + 1)
|
|
|
|
{
|
|
|
|
printf("restart_main: ERROR: Expected argc=%d got argc=%d\n",
|
2021-06-10 11:56:16 +02:00
|
|
|
NARGS + 1, argc);
|
2022-10-15 16:36:29 +02:00
|
|
|
ASSERT(false);
|
2013-02-06 16:43:28 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0; i <= NARGS; i++)
|
|
|
|
{
|
|
|
|
printf("restart_main: argv[%d]=\"%s\"\n", i, argv[i]);
|
2021-06-10 11:56:16 +02:00
|
|
|
if (i > 0 && strcmp(argv[i], g_argv[i - 1]) != 0)
|
2013-02-06 16:43:28 +01:00
|
|
|
{
|
2021-06-10 11:56:16 +02:00
|
|
|
printf("restart_main: ERROR: "
|
|
|
|
"Expected argv[%d]=\"%s\" got \"%s\"\n",
|
|
|
|
i, argv[i], g_argv[i - 1]);
|
2022-10-15 16:36:29 +02:00
|
|
|
ASSERT(false);
|
2013-02-06 16:43:28 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifndef CONFIG_DISABLE_ENVIRON
|
|
|
|
actual = getenv(g_varname);
|
|
|
|
if (actual)
|
|
|
|
{
|
|
|
|
if (strcmp(actual, g_varvalue) == 0)
|
|
|
|
{
|
|
|
|
printf("restart_main: Variable=%s has value=%s\n", g_varname,
|
|
|
|
g_varvalue);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2021-06-10 11:56:16 +02:00
|
|
|
printf("restart_main: ERROR Variable=%s has the wrong value\n",
|
|
|
|
g_varname);
|
|
|
|
printf("restart_main: found=%s expected=%s\n",
|
|
|
|
actual, g_varvalue);
|
2022-10-15 16:36:29 +02:00
|
|
|
ASSERT(false);
|
2013-02-06 16:43:28 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
printf("restart_main: ERROR: Variable=%s has no value\n", g_varname);
|
2022-10-15 16:36:29 +02:00
|
|
|
ASSERT(false);
|
2013-02-06 16:43:28 +01:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* Were we restarted? */
|
|
|
|
|
2022-10-09 10:30:55 +02:00
|
|
|
switch (g_restartstep)
|
2013-02-06 16:43:28 +01:00
|
|
|
{
|
2022-10-09 10:30:55 +02:00
|
|
|
case 0:
|
|
|
|
for (; ; )
|
|
|
|
{
|
|
|
|
sleep(2);
|
|
|
|
printf("restart_main: I am still here\n");
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
if (sem_wait(&g_sem) != 0)
|
|
|
|
{
|
|
|
|
printf("restart_main: ERROR thread sem_wait failed\n");
|
2022-10-15 16:36:29 +02:00
|
|
|
ASSERT(false);
|
2022-10-09 10:30:55 +02:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
2013-02-06 16:43:28 +01:00
|
|
|
}
|
|
|
|
|
2016-03-23 01:14:08 +01:00
|
|
|
return 0; /* Won't get here unless we were restarted */
|
2013-02-06 16:43:28 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* Public Functions
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
void restart_test(void)
|
|
|
|
{
|
|
|
|
int ret;
|
|
|
|
|
2022-11-12 12:24:32 +01:00
|
|
|
g_restartstep = 0;
|
|
|
|
|
2013-02-06 16:43:28 +01:00
|
|
|
/* Start the children and wait for first one to complete */
|
|
|
|
|
|
|
|
printf("\nTest task_restart()\n");
|
|
|
|
|
|
|
|
/* Set up an environment variables */
|
|
|
|
|
|
|
|
#ifndef CONFIG_DISABLE_ENVIRON
|
|
|
|
printf("restart_main: setenv(%s, %s, TRUE)\n", g_varname, g_varvalue);
|
|
|
|
setenv(g_varname, g_varvalue, TRUE); /* Variable1=GoodValue1 */
|
|
|
|
#endif
|
|
|
|
|
2022-10-20 15:48:27 +02:00
|
|
|
/* Initialize global variables */
|
|
|
|
|
|
|
|
g_restartstep = 0;
|
2022-10-09 10:30:55 +02:00
|
|
|
sem_init(&g_sem, 0, 0);
|
|
|
|
|
2013-02-06 16:43:28 +01:00
|
|
|
/* Start the task */
|
|
|
|
|
2014-09-01 21:21:15 +02:00
|
|
|
ret = task_create("ostest", PRIORITY, STACKSIZE, restart_main, g_argv);
|
2013-02-06 16:43:28 +01:00
|
|
|
if (ret < 0)
|
|
|
|
{
|
|
|
|
printf("restart_main: ERROR Failed to start restart_main\n");
|
2022-10-15 16:36:29 +02:00
|
|
|
ASSERT(false);
|
2013-02-06 16:43:28 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
pid_t pid = ret;
|
|
|
|
|
|
|
|
printf("restart_main: Started restart_main at PID=%d\n", pid);
|
|
|
|
|
|
|
|
/* Wait a bit and restart the task */
|
|
|
|
|
|
|
|
sleep(5);
|
2022-10-09 10:30:55 +02:00
|
|
|
|
|
|
|
g_restartstep = 1;
|
|
|
|
|
|
|
|
ret = task_restart(pid);
|
|
|
|
if (ret < 0)
|
|
|
|
{
|
|
|
|
printf("restart_main: ERROR: task_restart failed\n");
|
2022-10-15 16:36:29 +02:00
|
|
|
ASSERT(false);
|
2022-10-09 10:30:55 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Start the task wait for a semaphore */
|
|
|
|
|
|
|
|
printf("restart_main: Started restart_main at PID=%d\n", pid);
|
|
|
|
|
|
|
|
/* Wait a bit and restart the task */
|
|
|
|
|
|
|
|
sleep(5);
|
|
|
|
|
|
|
|
g_restartstep = 2;
|
|
|
|
|
2013-02-06 16:43:28 +01:00
|
|
|
ret = task_restart(pid);
|
|
|
|
if (ret < 0)
|
|
|
|
{
|
|
|
|
printf("restart_main: ERROR: task_restart failed\n");
|
2022-10-15 16:36:29 +02:00
|
|
|
ASSERT(false);
|
2013-02-06 16:43:28 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
sleep(1);
|
|
|
|
}
|
|
|
|
|
2022-10-09 10:30:55 +02:00
|
|
|
sem_destroy(&g_sem);
|
|
|
|
|
2014-08-08 02:00:38 +02:00
|
|
|
printf("restart_main: Exiting\n");
|
2013-02-06 16:43:28 +01:00
|
|
|
}
|
2023-11-14 11:46:17 +01:00
|
|
|
|
|
|
|
#endif /* !CONFIG_BUILD_KERNEL */
|