[LTP] [PATCH/RFC] sem_post/8-1: improve "child blocked on semaphore" detection
Cyril Hrubis
chrubis@suse.cz
Tue Mar 7 15:16:56 CET 2017
Hi!
> .../conformance/interfaces/sem_post/8-1.c | 6 ++-
> testcases/open_posix_testsuite/include/proc.h | 61 ++++++++++++++++++++++
> 2 files changed, 65 insertions(+), 2 deletions(-)
> create mode 100644 testcases/open_posix_testsuite/include/proc.h
>
> diff --git a/testcases/open_posix_testsuite/conformance/interfaces/sem_post/8-1.c b/testcases/open_posix_testsuite/conformance/interfaces/sem_post/8-1.c
> index 08e94639acaf..d41a7e47ea91 100644
> --- a/testcases/open_posix_testsuite/conformance/interfaces/sem_post/8-1.c
> +++ b/testcases/open_posix_testsuite/conformance/interfaces/sem_post/8-1.c
> @@ -44,6 +44,7 @@
> #include <sys/types.h>
> #include <sys/wait.h>
> #include <stdlib.h>
> +#include "proc.h"
>
> #define TEST "sem_post_8-1"
>
> @@ -184,7 +185,8 @@ int main(void)
> usleep(100);
> sem_getvalue(sem_1, &val);
> } while (val != 1);
> - usleep(100);
> + tst_process_state_wait3(c_1, 'S', 2000);
> + tst_process_state_wait3(c_2, 'S', 2000);
>
> c_3 = fork();
> switch (c_3) {
> @@ -204,7 +206,7 @@ int main(void)
> usleep(100);
> sem_getvalue(sem_1, &val);
> } while (val != 0);
> - usleep(100);
> + tst_process_state_wait3(c_3, 'S', 2000);
So sem_1 semaphore is used just as a counter and we are fixing race
before the children decrement its value and lock on the second
semaphore, right?
The approach here seems reasonable, acked.
> /* Ok, let's release the lock */
> fprintf(stderr, "P: release lock\n");
> diff --git a/testcases/open_posix_testsuite/include/proc.h b/testcases/open_posix_testsuite/include/proc.h
> new file mode 100644
> index 000000000000..d58fb13549bd
> --- /dev/null
> +++ b/testcases/open_posix_testsuite/include/proc.h
> @@ -0,0 +1,61 @@
> +/*
> + * Copyright (c) 2017 Linux Test Project
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms in version 2 of the GNU General Public License as
> + * published by the Free Software Foundation.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
> + * the GNU General Public License for more details.
> + */
> +
> +#ifdef __linux__
> +# include <errno.h>
> +# include <string.h>
> +int tst_process_state_wait3(pid_t pid, const char state,
> + unsigned long maxwait_ms)
> +{
> + char proc_path[128], cur_state;
> + int wait_step_ms = 10;
> + unsigned long waited_ms = 0;
> +
> + snprintf(proc_path, sizeof(proc_path), "/proc/%i/stat", pid);
> +
> + for (;;) {
> + FILE *f = fopen(proc_path, "r");
> +
> + if (!f) {
> + fprintf(stderr, "Failed to open '%s': %s\n",
> + proc_path, strerror(errno));
> + return 1;
> + }
> +
> + if (fscanf(f, "%*i %*s %c", &cur_state) != 1) {
> + fclose(f);
> + fprintf(stderr, "Failed to read '%s': %s\n",
> + proc_path, strerror(errno));
> + return 1;
> + }
> + fclose(f);
> +
> + if (state == cur_state)
> + return 0;
> +
> + usleep(wait_step_ms * 1000);
> + waited_ms += wait_step_ms;
> +
> + if (waited_ms >= maxwait_ms) {
> + fprintf(stderr, "Reached max wait time\n");
> + return 1;
> + }
> + }
> +}
> +#else
> +int tst_process_state_wait3(pid_t pid, const char state,
> + unsigned long maxwait_ms)
> +{
> + usleep(maxwait_ms * 1000);
return 0; here?
We don't handle it anyway but missing return would produce a warning...
> +}
> +#endif
> --
> 1.8.3.1
>
>
> --
> Mailing list info: https://lists.linux.it/listinfo/ltp
--
Cyril Hrubis
chrubis@suse.cz
More information about the ltp
mailing list