[LTP] [v7,2/2] semop04: Refactor with new API
Richard Palethorpe
rpalethorpe@suse.de
Fri Sep 1 09:38:52 CEST 2023
Hello,
Andrea Cervesato via ltp <ltp@lists.linux.it> writes:
> Hi!
>
> On 8/29/23 13:18, Wei Gao via ltp wrote:
>> Signed-off-by: Wei Gao <wegao@suse.com>
>> ---
>> testcases/kernel/syscalls/ipc/semop/semop04.c | 158 +++++-------------
>> 1 file changed, 42 insertions(+), 116 deletions(-)
>>
>> diff --git a/testcases/kernel/syscalls/ipc/semop/semop04.c b/testcases/kernel/syscalls/ipc/semop/semop04.c
>> index 582624d60..96f4b8fb8 100644
>> --- a/testcases/kernel/syscalls/ipc/semop/semop04.c
>> +++ b/testcases/kernel/syscalls/ipc/semop/semop04.c
>> @@ -1,164 +1,90 @@
>> +// SPDX-License-Identifier: GPL-2.0-or-later
>> /*
>> - *
>> - * Copyright (c) International Business Machines Corp., 2001
>> - *
>> - * This program is free software; you can redistribute it and/or modify
>> - * it under the terms of the GNU General Public License as published by
>> - * the Free Software Foundation; either version 2 of the License, or
>> - * (at your option) any later version.
>> - *
>> - * 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.
>> - *
>> - * You should have received a copy of the GNU General Public License
>> - * along with this program; if not, write to the Free Software
>> - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
>> + * Copyright (c) International Business Machines Corp., 2001
>> + * Copyright (C) 2003-2023 Linux Test Project, Inc.
>> + * Author: 2001 Paul Larson <plars@us.ibm.com>
>> + * Modified: 2001 Manoj Iyer <manjo@ausin.ibm.com>
>> */
>> -/*
>> - * FILE : sem01.c
>> - * DESCRIPTION : Creates a semaphore and two processes. The processes
>> - * each go through a loop where they semdown, delay for a
>> - * random amount of time, and semup, so they will almost
>> - * always be fighting for control of the semaphore.
>> - * HISTORY:
>> - * 01/15/2001 Paul Larson (plars@us.ibm.com)
>> - * -written
>> - * 11/09/2001 Manoj Iyer (manjo@ausin.ibm.com)
>> - * Modified.
>> - * - Removed compiler warnings.
>> - * added exit to the end of function main()
>> +/*\
>> + * [Description]
>> *
>> + * Creates a semaphore and two processes. The processes
>> + * each go through a loop where they semdown, delay for a
>> + * random amount of time, and semup, so they will almost
>> + * always be fighting for control of the semaphore.
>> */
>> #include <unistd.h>
>> #include <stdlib.h>
>> #include <stdio.h>
>> -#include <errno.h>
>> #include <sys/types.h>
>> -#include <sys/wait.h>
>> #include <sys/ipc.h>
>> #include "lapi/sem.h"
>> +#include "tst_test.h"
>> +#include "tst_safe_sysv_ipc.h"
>> -int verbose = 0;
>> -int loops = 100;
>> -int errors = 0;
>> +#define LOOPS 1000
>> -int semup(int semid)
>> +static void semup(int semid)
>> {
>> struct sembuf semops;
>> +
>> semops.sem_num = 0;
>> semops.sem_op = 1;
>> semops.sem_flg = SEM_UNDO;
>> - if (semop(semid, &semops, 1) == -1) {
>> - perror("semup");
>> - errors++;
>> - return 1;
>> - }
>> - return 0;
>> +
>> + SAFE_SEMOP(semid, &semops, 1);
>> }
>> -int semdown(int semid)
>> +static void semdown(int semid)
>> {
>> struct sembuf semops;
>> +
>> semops.sem_num = 0;
>> semops.sem_op = -1;
>> semops.sem_flg = SEM_UNDO;
>> - if (semop(semid, &semops, 1) == -1) {
>> - perror("semdown");
>> - errors++;
>> - return 1;
>> - }
>> - return 0;
>> -}
>> -void delayloop()
>> -{
>> - int delay;
>> - delay = 1 + ((100.0 * rand()) / RAND_MAX);
>> - if (verbose)
>> - printf("in delay function for %d microseconds\n", delay);
>> - usleep(delay);
>> + SAFE_SEMOP(semid, &semops, 1);
>> }
>> -void mainloop(int semid)
>> +static void mainloop(int semid)
>> {
>> int i;
>> - for (i = 0; i < loops; i++) {
>> - if (semdown(semid)) {
>> - printf("semdown failed\n");
>> - }
>> - if (verbose)
>> - printf("sem is down\n");
>> - delayloop();
>> - if (semup(semid)) {
>> - printf("semup failed\n");
>> - }
>> - if (verbose)
>> - printf("sem is up\n");
>> +
>> + for (i = 0; i < LOOPS; i++) {
>> + semdown(semid);
>> + usleep(1 + ((100.0 * rand()) / RAND_MAX));
>> + semup(semid);
>> }
>> }
>> -int main(int argc, char *argv[])
>> +static void run(void)
>> {
>> - int semid, opt;
>> + int semid;
>> union semun semunion;
>> - extern char *optarg;
>> pid_t pid;
>> - int chstat;
>> -
>> - while ((opt = getopt(argc, argv, "l:vh")) != EOF) {
>> - switch ((char)opt) {
>> - case 'l':
>> - loops = atoi(optarg);
>> - break;
>> - case 'v':
>> - verbose = 1;
>> - break;
>> - case 'h':
>> - default:
>> - printf("Usage: -l loops [-v]\n");
>> - exit(1);
>> - }
>> - }
>> /* set up the semaphore */
>> - if ((semid = semget((key_t) 9142, 1, 0666 | IPC_CREAT)) < 0) {
>> - printf("error in semget()\n");
>> - exit(-1);
>> - }
>> + semid = SAFE_SEMGET((key_t) 9142, 1, 0666 | IPC_CREAT);
>> +
>> semunion.val = 1;
>> - if (semctl(semid, 0, SETVAL, semunion) == -1) {
>> - printf("error in semctl\n");
>> - }
>> - if ((pid = fork()) < 0) {
>> - printf("fork error\n");
>> - exit(-1);
>> - }
>> + SAFE_SEMCTL(semid, 0, SETVAL, semunion);
>> +
>> + pid = SAFE_FORK();
>> +
>> if (pid) {
>> - /* parent */
>> srand(pid);
> I'm wondering if this is an error from the previous test as well. We
> are using mainloop() function that is using rand() inside both child
> and parent. So srand() should be called before parent and child, in
> order to have random seed initialized for both of them. I would also
> use srand(time(0)).
Perhaps and also the value passed to srand should be printed for
reproducing failures. (or just use the same value every time).
Setting to changes requested.
--
Thank you,
Richard.
More information about the ltp
mailing list