From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 82EB2C433EF for ; Mon, 13 Sep 2021 10:00:46 +0000 (UTC) Received: from picard.linux.it (picard.linux.it [213.254.12.146]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 36C0A60EC0 for ; Mon, 13 Sep 2021 10:00:44 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 36C0A60EC0 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.cz Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=lists.linux.it Received: from picard.linux.it (localhost [IPv6:::1]) by picard.linux.it (Postfix) with ESMTP id 8F4793C9270 for ; Mon, 13 Sep 2021 12:00:42 +0200 (CEST) Received: from in-2.smtp.seeweb.it (in-2.smtp.seeweb.it [217.194.8.2]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by picard.linux.it (Postfix) with ESMTPS id C9C3C3C1D81 for ; Mon, 13 Sep 2021 12:00:31 +0200 (CEST) Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by in-2.smtp.seeweb.it (Postfix) with ESMTPS id 936F5600328 for ; Mon, 13 Sep 2021 12:00:29 +0200 (CEST) Received: from imap1.suse-dmz.suse.de (imap1.suse-dmz.suse.de [192.168.254.73]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out1.suse.de (Postfix) with ESMTPS id C5E3C21F7D; Mon, 13 Sep 2021 10:00:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.cz; s=susede2_rsa; t=1631527228; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding; bh=a/7qqQOjcrLBShuXIZFAXNLmblTNh1eP9W2k8F6Cy1k=; b=DZk3WuBUB/X3eSaR+5RaozoUh/tNd7gegNVvQ4+YB3rYCNp5BWV4LguAWrt/kseISkC/Fk OzZiJJm2ovXcpM90ymi7f7FeFC59n+VK6FZbzfj4Kz2f/plt+uif+8U6cGhGlw6UtjuISd 0/RIGM51nbJhHM1FDYmYW1BFxbj55LM= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.cz; s=susede2_ed25519; t=1631527228; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding; bh=a/7qqQOjcrLBShuXIZFAXNLmblTNh1eP9W2k8F6Cy1k=; b=skacokZpiSYpGwl3J0+o2fWiY3hhSAICj8KnZLpXXTkTOiI2WohSXzN0Z6sOc/Nt9wDV+p ysN0lqAICGByE2Dg== Received: from imap1.suse-dmz.suse.de (imap1.suse-dmz.suse.de [192.168.254.73]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap1.suse-dmz.suse.de (Postfix) with ESMTPS id 8F28513659; Mon, 13 Sep 2021 10:00:28 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap1.suse-dmz.suse.de with ESMTPSA id TSN/ITwhP2GsKwAAGKfGzw (envelope-from ); Mon, 13 Sep 2021 10:00:28 +0000 From: Petr Vorel To: ltp@lists.linux.it Date: Mon, 13 Sep 2021 12:00:22 +0200 Message-ID: <20210913100022.14501-1-pvorel@suse.cz> X-Mailer: git-send-email 2.33.0 MIME-Version: 1.0 X-Virus-Scanned: clamav-milter 0.102.4 at in-2.smtp.seeweb.it X-Virus-Status: Clean Subject: [LTP] [RFC PATCH 1/1] sched: Remove process.c X-BeenThere: ltp@lists.linux.it X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux Test Project List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ltp-bounces+ltp=archiver.kernel.org@lists.linux.it Sender: "ltp" Message-ID: <20210913100022.5JV1Sez-HXFJbfaiZW65-J6DzKKvkFcqIAWtdFKXQ9U@z> Test was removed as buggy from the runtest file nearly 20 years ago in: 576f1ee56 ("Removed a test that was not correctly running.") Test is probably obsolete, not using even legacy API, non-zero exit: $ ./process -d 8 -b 2 -t 1; echo $? total number of process to be created nodesum (511) is greater than the allowed SEMMSL value (250) reseting the value of nodesum to SEMMSL Terminated 143 + leaving very high load after being terminated. Reported-by: Li Wang Signed-off-by: Petr Vorel --- Hi, alternative approach to trying to cleanup the testsuite a bit [1]. Kind regards, Petr [1] https://patchwork.ozlabs.org/project/ltp/list/?series=261770&state=* .../kernel/sched/process_stress/.gitignore | 1 - .../kernel/sched/process_stress/Makefile | 29 - .../kernel/sched/process_stress/process.c | 1270 ----------------- 3 files changed, 1300 deletions(-) delete mode 100644 testcases/kernel/sched/process_stress/.gitignore delete mode 100644 testcases/kernel/sched/process_stress/Makefile delete mode 100644 testcases/kernel/sched/process_stress/process.c diff --git a/testcases/kernel/sched/process_stress/.gitignore b/testcases/kernel/sched/process_stress/.gitignore deleted file mode 100644 index b2d4946e6..000000000 --- a/testcases/kernel/sched/process_stress/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/process diff --git a/testcases/kernel/sched/process_stress/Makefile b/testcases/kernel/sched/process_stress/Makefile deleted file mode 100644 index 011017c65..000000000 --- a/testcases/kernel/sched/process_stress/Makefile +++ /dev/null @@ -1,29 +0,0 @@ -# -# kernel/sched/process_test testcases Makefile. -# -# Copyright (C) 2009, Cisco Systems Inc. -# -# 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. -# -# Ngie Cooper, July 2009 -# - -top_srcdir ?= ../../../.. - -include $(top_srcdir)/include/mk/env_pre.mk - -CPPFLAGS += -D_LINUX - -include $(top_srcdir)/include/mk/generic_leaf_target.mk diff --git a/testcases/kernel/sched/process_stress/process.c b/testcases/kernel/sched/process_stress/process.c deleted file mode 100644 index a5ff80987..000000000 --- a/testcases/kernel/sched/process_stress/process.c +++ /dev/null @@ -1,1270 +0,0 @@ -/* - * - * 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 - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifndef _LINUX - /* LINUX INCLUDES */ -#include -#include -#else -#include -#include -#include -#endif -#include -#include -#include -#include -#include -#include -#include "lapi/sem.h" - -/* indexes into environment variable array */ -#define ADBG 0 -#define BNDX 1 -#define DNDX 2 -#define TNDX 3 -#define MAXBVAL 70 -#define MAXDVAL 11 -#define SLOTDIR "./slot/" - -#ifdef _LINUX - /* LINUX #defnes */ -#ifndef TRUE -#define TRUE 1 -#endif -#ifndef FALSE -#define FALSE 0 -#endif -#endif - -#if defined _LINUX && defined DEBUG -#define prtln() printf("At line number: %d\n", __LINE__); \ - fflush(NULL) -#define dprt(fmt, args...) printf(fmt, ## args) -#else -#define prtln() -#define dprt(fmt, args...) -#endif - -/* aliases for environment variable entries */ -#define AUSDEBUG (*edat[ADBG].eval.vint) /* debug value */ -#define BVAL (*edat[BNDX].eval.vint) /* # of childern per parent */ -#define DVAL (*edat[DNDX].eval.vint) /* depth of process tree */ -#define TVAL (*edat[TNDX].eval.vint) /* timer value */ - -#ifdef _LINUX -typedef long mtyp_t; -#endif - -/* structure of information stored about each process in shared memory */ -typedef struct proc_info { -#ifdef __64LDT__ - pid_t pid; /* process id */ - pid_t ppid; /* parent process id */ -#else - int pid; /* process id */ - int ppid; /* parent process id */ -#endif - int msg; /* parent process id */ - int err; /* error indicator */ - int *list; /* pointer to list of parent and sibling slot locations */ -} Pinfo; - -typedef struct messagebuf { - mtyp_t mtyp; /* message type */ - char mtext[80]; /* message text */ -} Msgbuf; - -union semun semarg; - -/* structure of all environment variable used by program */ -struct envstruct { - char *env_name; - union { - char *chptr; - int *vint; - } eval; -} envdata[] = { - { - "AUSDBG", { - "0"}}, { - "BVAL", { - "3"}}, { - "DVAL", { - "2"}}, { - "FORCE", { - "0"}}, { - "TVAL", { - "1"}}, { - "", { - ""}} -}; - -char *errfile; /* pointer to errfile name */ - -int msgid; /* message queue for leaf nodes */ -int msgerr; /* message queue for errors */ -int nodesum; /* total number of process to be created */ -int sem_count; /* counter semaphore */ -int sem_lock; /* locks access to counter semaphore */ -int shmid; /* global shared memory id varible */ -int procgrp; /* process group id */ - -timer_t timer; /* timer structure */ - -Pinfo *shmaddr; /* Start address of shared memory */ - -#ifndef _LINUX -FILE *errfp = stderr; /* error file pointer, probably not necessary */ -FILE *debugfp = stderr; /* debug file pointer, used if AUSDEBUG set */ -#else -#define errfp stderr -#define debugfp stderr -#endif - -struct envstruct *edat = envdata; /* pointer to environment data */ - -/* external function declarations */ -extern int killpg(int procgrp, int sig); -extern timer_t gettimerid(int Timer_type, int Notify_type); -extern int reltimerid(timer_t timer); - -/* internal function declarations */ -void cleanup(int sig, int code, struct sigcontext *scp); -void nextofkin(int sig, int code, struct sigcontext *scp); -void doit(void); -void debugout(char *fmt, ...); -int getenv_val(void); -void messenger(void); -void nextofkin(int sig, int code, struct sigcontext *scp); -int notify(int slot); -void parse_args(int argc, char *argv[]); -void print_shm(void); -Pinfo *put_proc_info(int tval); -void rm_msgqueue(void); -void rm_semseg(void); -void rm_shmseg(void); -int semoper(int slot, int smid, int opval); -int send_message(int id, mtyp_t type, char *text); -void set_timer(void); -void set_signals(void *sighandler()); -void setup_msgqueue(void); -void setup_semaphores(void); -void setup_shm(void); -void severe(char *fmt, ...); -Pinfo *shmgetseg(void); -int spawn(int val); -unsigned long sumit(int B, int D); - -/* - * Prints out the data structures in shared memory. - */ -void print_shm(void) -{ - extern int nodesum; /* total number of nodes created */ - extern Pinfo *shmaddr; /* shared memory pointer */ - extern int shmid; /* shared memory id */ - - Pinfo *pinfo; /* pointer to process info in shared memory */ - int *listp; /* pointer to sibling info in shared memory */ - int i, j; /* counters */ - struct shmid_ds buf; - - if (shmctl(shmid, IPC_STAT, &buf)) - return; - - for (pinfo = shmaddr, i = 0; i < nodesum; i++, pinfo++) { - fprintf(errfp, - "slot: %-4d pid: %-6d ppid: %-6d msg: %-2d err: %-2d lst:", - i, pinfo->pid, pinfo->ppid, pinfo->msg, pinfo->err); - for (j = 0, listp = pinfo->list; j < BVAL; j++, listp++) - fprintf(errfp, " %d", *listp); - fprintf(errfp, "\n"); - } -} - -/* - * Generalized send routine. Sends a message on message queue. - */ -int send_message(int id, mtyp_t type, char *text) -{ - int rc; - - Msgbuf sndbuf; - - strcpy(sndbuf.mtext, text); - sndbuf.mtyp = type; - while (TRUE) { - rc = msgsnd(id, &sndbuf, sizeof(struct messagebuf), IPC_NOWAIT); - if (rc == -1 && errno == EAGAIN) { - debugout("msgqueue %d of mtyp %d not ready to send\n", - msgid, type); - errno = 0; - } else - return (rc); - } -} - -/* - * Sends error message to initial parent (messenger).i - */ -void severe(char *fmt, ...) -{ - va_list args; - int rc; - char mtext[80]; - extern int msgerr; - - va_start(args, fmt); - vsprintf(mtext, fmt, args); - va_end(args); - - rc = send_message(msgerr, 2, mtext); - if (rc == -1) { - perror("cannot send message to msgerr"); - exit(1); - } -} - -/* - * if AUSDEBUG set will print information to file associated with slot number. - */ -void debugout(char *fmt, ...) -{ - va_list args; - - if (AUSDEBUG) { - va_start(args, fmt); - vfprintf(debugfp, fmt, args); - va_end(args); - } -} - -/* - * Remove message queues. - */ -void rm_msgqueue(void) -{ - extern int msgid; - - /* remove message queue id. */ - if (msgctl(msgid, IPC_RMID, NULL) && errno != EINVAL) { - fprintf(errfp, "msgctl failed msgid: errno %d\n", errno); - perror("msgctl failed"); - } - - /* remove message queue id. */ - if (msgctl(msgerr, IPC_RMID, NULL) && errno != EINVAL) { - fprintf(errfp, "msgctl failed msgerr: errno %d\n", errno); - perror("msgctl failed"); - } -} - -/* - * Remove shared memory segment. - */ -void rm_shmseg(void) -{ - extern int shmid; /* Global shared memory id */ - extern Pinfo *shmaddr; /* Global shared memory address */ - - /* remove shared memory id (and shared memory segment). */ - if (shmctl(shmid, IPC_RMID, NULL) && errno != EINVAL) { - fprintf(errfp, "shmctl failed: errno %d\n", errno); - perror("shmctl failed"); - } -} - -/* - * Remove semaphores. - */ -void rm_semseg(void) -{ - extern int sem_lock; - extern int sem_count; - - /* remove sem_lock semaphore id */ - semarg.val = 0; /* to fix problem with 4th arg of semctl in 64 bits MARIOG */ - if (semctl(sem_lock, 0, IPC_RMID, semarg.val) && errno != EINVAL) { - fprintf(errfp, "semctl failed: errno %d\n", errno); - perror("semctl failed"); - } - /* remove sem_count semaphore id. */ - semarg.val = 0; /* to fix problem with 4th arg of semctl in 64 bits MARIOG */ - if (semctl(sem_count, 0, IPC_RMID, semarg.val) && errno != EINVAL) { - fprintf(errfp, "semctl failed: errno %d\n", errno); - perror("semctl failed"); - } -} - -/* - * Routine to clean up shared memory and return exit status (CHILD handler). - */ -void cleanup(int sig, int code, struct sigcontext *scp) -{ - int rc; - char mtext[80]; - - killpg(procgrp, SIGTERM); - sprintf(mtext, "%d", sig); - rc = send_message(msgerr, 3, mtext); - if (rc == -1) { - severe("msgsnd failed: %d msgid %d mtyp %d mtext %d\n", - errno, msgerr, 3, mtext); - } -} - -/* - * Routine to clean up shared memory and return exit status (PARENT handler). - */ -void nextofkin(int sig, int code, struct sigcontext *scp) -{ - int rc; - char mtext[80]; - - sprintf(mtext, "%d", sig); - rc = send_message(msgerr, 3, mtext); - if (rc == -1) { - severe("msgsnd failed: %d msgid %d mtyp %d mtext %d\n", - errno, msgerr, 3, mtext); - } -#ifndef _LINUX - reltimerid(timer); -#endif - exit(1); -} - -/* given breadth and depth of a tree, sum up total number of nodes created */ -unsigned long sumit(int B, int D) -{ - int i; - int exp = 1; /* exponent of breadth */ - unsigned long sum = 1; /* running sum of nodes */ - - for (sum = 1, i = 1; i <= D; i++) { - exp = B * exp; - sum += (int)exp; - } - return (sum); -} - -/* Finds correct slot for current process in shared memory and stores - * information about process in it. - */ -Pinfo *put_proc_info(int tval) -{ - extern int nodesum; - extern Pinfo *shmaddr; - - int sibslot = 0; /* sibling slot number */ - int *listp; /* ptr to sibling info for current proc */ - Pinfo *smp; /* ptr to current process data slot */ - - smp = shmaddr + tval; - smp->pid = getpid(); - smp->ppid = getppid(); - smp->err = 0; - smp->msg = 0; - - /* if very first process (slot 0), dont fill in info about siblings - * and parent. Sibling and parent info is irrevelant in this case. - */ - if (!tval) - return (smp); - - /* find parent of current process and store slot location */ - smp->list = (int *)(Pinfo *) (shmaddr + nodesum) + (BVAL * tval); - *smp->list = (tval - 1) / BVAL; - listp = smp->list + 1; - - /* calculate and store sibling slot numbers of current process */ - for (sibslot = *smp->list * BVAL + 1; listp < smp->list + BVAL; - sibslot++) { - if (tval != sibslot) - *(listp++) = sibslot; - } - return (smp); -} - -/* This routine sends a message from the current process to all of her - * siblings and then waits to receive responses from them. A timer is - * set so that if a message is lost or not received for some reason - * we can exit gracefully. - */ -int notify(int slot) -{ - extern int msgid; - extern Pinfo *shmaddr; - - int i; - int rc; - int tslot; - int *listp = (shmaddr + slot)->list; - int cldcnt = 1; - int ndx = 0; -#ifdef __64LDT__ - pid_t pid = 0; -#else - int pid = 0; -#endif - char mtext[80]; - - Msgbuf rcvbuf; - - for (i = 1, listp++; i < BVAL; i++, listp++) { - sprintf(mtext, "%d %d %d", i, slot, (shmaddr + slot)->pid); - rc = send_message(msgid, (mtyp_t) * listp, mtext); - if (rc == -1) { - severe - ("notify: send_message Failed: %d msgid %d mtyp %d mtext %d\n", - errno, msgid, *listp, mtext); - exit(1); - } - } - - while (cldcnt < BVAL) { - rc = msgrcv(msgid, &rcvbuf, sizeof(struct messagebuf), slot, 0); - if (rc == -1) { - switch (errno) { - case EAGAIN: - printf("msgqueue %d not ready to receive\n", - msgid); - fflush(stdout); - errno = 0; - break; - case ENOMSG: - printf("msgqueue %d no message\n", msgid); - fflush(stdout); - errno = 0; - break; - default: - perror("msgrcv failed"); - severe("msgrcv failed, errno: %d\n", errno); - exit(1); - } - } else { - sscanf(rcvbuf.mtext, "%d %d %d", &ndx, &tslot, &pid); - if (*((shmaddr + tslot)->list + ndx) == slot && - (shmaddr + tslot)->pid == pid) { - debugout - ("MSGRCV:slot: %d ndx: %d tslot: %d pid: %d\n", - slot, ndx, tslot, pid); - (shmaddr + slot)->msg++; - cldcnt++; - } else { - (shmaddr + slot)->err--; - debugout - ("MSGRCV: slot: %d ndx: %d tslot: %d pid: %d\n", - slot, ndx, tslot, pid); - } - } - } - return 0; -} - -/* - * Calculates semaphore number and sets semaphore (lock). - */ -int semoper(int slot, int smid, int opval) -{ - int pslot; /* parent slot */ - struct sembuf smop; /* semaphore operator */ - - pslot = (slot - 1) / BVAL; /* calculate parent node */ - smop.sem_num = pslot; - smop.sem_op = opval; - smop.sem_flg = 0; - semop(smid, &smop, 1); - return (pslot); -} - -/* - * This is the meat and potatoes of the program. Spawn creates a tree - * of processes with Dval depth and Bval breadth. Each parent will spawn - * Bval children. Each child will store information about themselves - * in shared memory. The leaf nodes will communicate the existence - * of one another through message queues, once each leaf node has - * received communication from all of her siblings she will reduce - * the semaphore count and exit. Meanwhile all parents are waiting - * to hear from their children through the use of semaphores. When - * the semaphore count reaches zero then the parent knows all the - * children have talked to one another. Locking of the connter semaphore - * is provided by the use of another (binary) semaphore. - */ -int spawn(int val) -{ - extern int sem_count; /* used to keep track of childern */ - extern int sem_lock; /* used to lock access to sem_count semaphore */ - - int i; /* Breadth counter */ - static int level = 0; /* level counter */ - int lvlflg = 0; /* level toggle, limits parental spawning - to one generation */ - int pslot = 0; -#ifdef __64LDT__ - pid_t pid; /* pid of child process */ -#else - int pid; /* pid of child process */ -#endif - Pinfo *pinfo; /* pointer to process information in shared mem */ - int semval; /* value of semaphore ( equals BVAL initially */ - static int tval = 1; /* tree node value of child. */ - - char foo[1024]; - - level++; - - for (i = 1; i <= BVAL; i++) { - tval = (val * BVAL) + i; - if (!lvlflg) { - pid = fork(); - if (!pid) { /* CHILD */ - if (AUSDEBUG) { - sprintf(foo, "%sslot%d", SLOTDIR, tval); - debugfp = fopen(foo, "a+"); - } - pinfo = put_proc_info(tval); - - debugout - ("pid: %-6d ppid: %-6d lev: %-2d i: %-2d val: %-3d\n", - pinfo->pid, pinfo->ppid, level, i, tval); - - set_timer(); /* set up signal handlers and initialize pgrp */ - if (level < DVAL) { - if (spawn(tval) == -1) { - pslot = - semoper(tval, sem_lock, -1); - semarg.val = 0; /* to fix problem with 4th arg of semctl in 64 bits MARIOG */ - semval = - semctl(sem_count, pslot, - GETVAL, semarg); - semarg.val = --semval; /* to fix problem with 4th arg of semctl in 64 bits MARIOG */ - semctl(sem_count, pslot, SETVAL, - semarg); - semarg.val = 1; /* to fix problem with 4th arg of semctl in 64 bits MARIOG */ - semctl(sem_lock, pslot, SETVAL, - semarg); - } - lvlflg++; - } else { /* leaf node */ - notify(tval); - return (-1); - } - } -#ifdef __64LDT__ - else if (pid > 0 && i >= BVAL) { /* PARENT */ -#else - else if (pid > (pid_t) 0 && i >= BVAL) { /* PARENT */ -#endif - pslot = semoper(tval, sem_count, 0); - pslot = semoper(pslot, sem_lock, -1); - semarg.val = 0; /* to fix problem with 4th arg of semctl in 64 bits MARIOG */ - semval = - semctl(sem_count, pslot, GETVAL, semarg); - semarg.val = --semval; /* to fix problem with 4th arg of semctl in 64 bits MARIOG */ - semctl(sem_count, pslot, SETVAL, semarg); - semarg.val = 1; /* to fix problem with 4th arg of semctl in 64 bits MARIOG */ - semctl(sem_lock, pslot, SETVAL, semarg); - (shmaddr + val)->msg++; - } -#ifdef __64LDT__ - else if (pid < (pid_t) 0) { -#else - else if (pid < 0) { -#endif - perror("spawn: fork failed"); - severe - ("spawn: fork failed, exiting with errno %d\n", - errno); - exit(1); - } else - (shmaddr + val)->msg++; - } - } - return (pslot); -} - -/* - * Allocate message queues. - */ -void setup_msgqueue(void) -{ - extern int msgid; - extern int msgerr; - - msgid = msgget(IPC_PRIVATE, - IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR | S_IRGRP | - S_IWGRP); - if (msgid == -1) { - perror("msgget msgid failed"); - fprintf(stderr, " SEVERE : msgget msgid failed: errno %d\n", - errno); - exit(1); - } - - msgerr = msgget(IPC_PRIVATE, - IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR | S_IRGRP | - S_IWGRP); - if (msgerr == -1) { - perror("msgget msgerr failed"); - fprintf(stderr, " SEVERE : msgget msgerr failed: errno %d\n", - errno); - exit(1); - } -} - -/* - * Set up and initialize all semaphores - */ -void setup_semaphores(void) -{ - extern int sem_count; - extern int sem_lock; - - int i; - int rc; - - prtln(); - sem_lock = semget(IPC_PRIVATE, nodesum - 1, - IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR | S_IRGRP | - S_IWGRP); - dprt("nodesum = %d, sem_lock = %d\n", nodesum, sem_lock); - - prtln(); - if (sem_lock == -1) { - perror("semget failed for sem_lock"); - fprintf(stderr, - " SEVERE : semget failed for sem_lock, errno: %d\n", - errno); - rm_shmseg(); - exit(1); - } - - prtln(); - sem_count = semget(IPC_PRIVATE, nodesum - 1, - IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR | S_IRGRP | - S_IWGRP); - - if (sem_count == -1) { - perror("semget failed for sem_count"); - fprintf(stderr, - " SEVERE : semget failed for sem_count, errno: %d\n", - errno); - rm_shmseg(); - exit(1); - } - prtln(); - - for (i = 0; i < (nodesum - 1); i++) { - semarg.val = 1; /* to fix problem with 4th arg of semctl in 64 bits MARIOG */ - rc = semctl(sem_lock, i, SETVAL, semarg); - prtln(); - if (rc == -1) { - perror("semctl failed for sem_lock failed"); - fprintf(stderr, - " SEVERE : semctl failed for sem_lock, errno: %d\n", - errno); - rm_shmseg(); - exit(1); - } - - semarg.val = BVAL; /* to fix problem with 4th arg of semctl in 64 bits MARIOG */ - rc = semctl(sem_count, i, SETVAL, semarg); - prtln(); - if (rc == -1) { - perror("semctl failed for sem_lock failed"); - fprintf(stderr, - " SEVERE : semctl failed for sem_lock, errno: %d\n", - errno); - rm_shmseg(); - exit(1); - } - } -} - -/* - * Set up and allocate shared memory. - */ -void setup_shm(void) -{ - extern int nodesum; /* global shared memory id */ - extern int shmid; /* global shared memory id */ - extern Pinfo *shmaddr; - - int i, j; /* counters */ - Pinfo *shmad = NULL; /* ptr to start of shared memory. */ - Pinfo *pinfo = NULL; /* ptr to struct in shared memory. */ - - debugout("size = %d, size (in hex) = %#x nodes: %d\n", - sizeof(Pinfo) * nodesum + (nodesum * BVAL * sizeof(int)), - sizeof(Pinfo) * nodesum + (nodesum * BVAL * sizeof(int)), - nodesum); - - /* Get shared memory id */ - shmid = shmget(IPC_PRIVATE, - sizeof(Pinfo) * nodesum + (nodesum * BVAL * sizeof(int)), - IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR | S_IRGRP | - S_IWGRP); - if (shmid < 0) { - perror("shmget failed"); - fprintf(stderr, " SEVERE : shmget failed: errno %d\n", errno); - exit(1); - } - - /* allocate shared memory */ - - if ((shmad = shmat(shmid, (char *)shmad, 0)) == MAP_FAILED) { - printf("SEVERE : shmat failed\n"); - exit(1); - } else { - shmctl(shmid, IPC_RMID, NULL); - } - - /* set all fields in shared memory to -1 */ - for (pinfo = shmad, i = 0; i < nodesum; i++, pinfo++) { -#ifdef __64LDT__ - pinfo->pid = (pid_t) - 1; - pinfo->ppid = (pid_t) - 1; -#else - pinfo->pid = -1; - pinfo->ppid = -1; -#endif - pinfo->msg = -1; - pinfo->err = -1; - - /* Changed 10/9/97 */ - /* pinfo->list = (int *)((ulong)shmad + nodesum * sizeof(Pinfo) - + (sizeof(int) * BVAL * i)); */ - pinfo->list = - (int *)((long)shmad + nodesum * sizeof(Pinfo) + - (sizeof(int) * BVAL * i)); - for (j = 0; j < BVAL; j++) - *(pinfo->list + j) = -1; - } - shmaddr = shmad; -} - -/* - * Set up Signal handler and which signals to catch - */ -void set_signals(void *sighandler()) -{ - int i; - int rc; - - struct sigaction action; - - /* list of signals we want to catch */ - static struct signalinfo { - int signum; - char *signame; - } siginfo[] = { - { - SIGHUP, "SIGHUP"}, { - SIGINT, "SIGINT"}, { - SIGQUIT, "SIGQUIT"}, { - SIGABRT, "SIGABRT"}, { - SIGBUS, "SIGBUS"}, { - SIGSEGV, "SIGSEGV"}, { - SIGALRM, "SIGALRM"}, { - SIGUSR1, "SIGUSR1"}, { - SIGUSR2, "SIGUSR2"}, { - -1, "ENDSIG"} - }; - - char tmpstr[1024]; - - action.sa_handler = (void *)sighandler; - -#ifdef _LINUX - sigfillset(&action.sa_mask); -#else - SIGINITSET(action.sa_mask); -#endif - action.sa_flags = 0; - - /* Set the signal handler up */ -#ifdef _LINUX - sigaddset(&action.sa_mask, SIGTERM); -#else - SIGADDSET(action.sa_mask, SIGTERM); -#endif - for (i = 0; siginfo[i].signum != -1; i++) { -#ifdef _LINUX - sigaddset(&action.sa_mask, siginfo[i].signum); -#else - SIGADDSET(action.sa_mask, siginfo[i].signum); -#endif - rc = sigaction(siginfo[i].signum, &action, NULL); - if (rc == -1) { - sprintf(tmpstr, "sigaction: %s\n", siginfo[i].signame); - perror(tmpstr); - fprintf(stderr, - " SEVERE : Could not set %s signal action, errno=%d.", - siginfo[i].signame, errno); - exit(1); - } - } -} - -/* -* Get and set a timer for current process. -*/ -#ifndef _LINUX -void set_timer(void) -{ - struct itimerstruc_t itimer, old_itimer; - - if ((timer = gettimerid(TIMERID_REAL, DELIVERY_SIGNALS)) == -1) { - perror("gettimerid"); - fprintf(stderr, " SEVERE : Could not get timer id, errno=%d.", - errno); - exit(1); - } - - /* - * Start the timer. - */ - itimer.it_interval.tv_nsec = 0; - itimer.it_interval.tv_sec = 0; - itimer.it_value.tv_nsec = 0; - itimer.it_value.tv_sec = (time_t) (TVAL * 60.0); - if (incinterval(timer, &itimer, &old_itimer) == -1) { - perror("incinterval"); - fprintf(stderr, - " SEVERE : Could not set timer interval, errno=%d.", - errno); - (void)reltimerid(timer); - exit(1); - } -} -#else - -void set_timer(void) -{ - struct itimerval itimer; - - memset(&itimer, 0, sizeof(struct itimerval)); - /* - * Start the timer. - */ - itimer.it_interval.tv_usec = 0; - itimer.it_interval.tv_sec = 0; - itimer.it_value.tv_usec = 0; - itimer.it_value.tv_sec = (time_t) (TVAL * 60.0); - - if (setitimer(ITIMER_REAL, &itimer, NULL)) { - perror("setitimer"); - exit(1); - } -} -#endif - -/* - * parse_args - * - * Parse command line arguments. Any errors cause the program to exit - * at this point. - */ -void parse_args(int argc, char *argv[]) -{ - int i; - int opt, errflag = 0; - int dflag = 0, bflag = 0, fflag = 0, tflag = 0; - extern int optind; - extern char *optarg; - - /* DVAL: 0 1 2 3 4 5 6 7 8 9 10 11 */ - int limits[] = { -1, -1, MAXBVAL, 17, 8, 5, 4, 3, 2, 2, 2, 2 }; - - while ((opt = getopt(argc, argv, "b:d:ft:D?")) != EOF) { - switch (opt) { - case 'b': - if (bflag) - errflag++; - else { - bflag++; - errno = 0; - BVAL = atoi(optarg); - if (errno) { - perror("atoi"); - fprintf(stderr, - " ERROR : atoi - errno %d.", - errno); - errflag++; - } - } - break; - case 'd': - if (dflag) - errflag++; - else { - dflag++; - errno = 0; - DVAL = atoi(optarg); - if (errno) { - perror("atoi"); - fprintf(stderr, - " ERROR : atoi - errno %d.", - errno); - errflag++; - } - } - break; - case 'f': - fflag = 1; - break; - case 'D': - AUSDEBUG = 1; - break; - case 't': - if (tflag) - errflag++; - else { - tflag++; - errno = 0; - TVAL = atoi(optarg); - if (!TVAL || errno) { - perror("atoi"); - fprintf(stderr, - " ERROR : atoi - errno %d.", - errno); - errflag++; - } - } - break; - case '?': - errflag++; - break; - } - } - - if (BVAL < 2) { - errflag++; - fprintf(stderr, "The value of b must be greater than 1\n"); - } else if (DVAL < 2) { - errflag++; - fprintf(stderr, "The depth value must be greater than 1\n"); - } else if (!fflag && (DVAL > MAXDVAL)) { -/* || BVAL > limits[DVAL])) { */ - fprintf(stderr, "\tExceeded process creation limits. \ -\n\tParameters will generate %lu processes. \n\tThe preset limits are as \ -follows:\n\t\tdepth\tbreadth\ttotal\n", sumit(BVAL, DVAL)); - for (i = 2; i <= MAXDVAL; i++) - fprintf(stderr, "\t\t %-3d\t %-5d\t%-5lu\n", i, - limits[i], sumit(limits[i], i)); - exit(1); - } - - if (errflag) { - fprintf(stderr, - "usage: %s [-b number] [-d number] [-t number] \n", - argv[0]); - fprintf(stderr, "where:\n"); - fprintf(stderr, - "\t-b number\tnumber of children each parent will spawn ( > 1)\n"); - fprintf(stderr, "\t-d number\tdepth of process tree ( > 1)\n"); - fprintf(stderr, "\t-t\t\tset timeout value\n"); - fprintf(stderr, " SEVERE : Command line parameter error.\n"); - exit(1); - } -} - -/* - * Initializes environment variables, using defaults if not set in env. - */ -int getenv_val(void) -{ - char *c; /* character pointer */ - struct envstruct *envd = envdata; /* pointer to environment data */ - - union { - int *vint; - char *chptr; - } val; - - /* - * Loop through envdata, set default first then set environment - * variable value if present. - */ - for (; *envd->env_name != '\0'; envd++) { - if ((val.chptr = getenv(envd->env_name)) == NULL) - val.chptr = envd->eval.chptr; - - c = val.chptr; - while (isdigit(*c)) - c++; - - if (*c == '\0') { - (envd->eval.vint) = malloc(sizeof(int)); - *(envd->eval.vint) = atoi(val.chptr); - } else { - envd->eval.chptr = malloc(strlen(val.chptr) + 1); - strcpy(envd->eval.chptr, val.chptr); - } - } - return 0; -} - -/* - * Prints all errors coming from the children and terminates execution if - * an error execption is received. In addition messenger() is sent the - * process group id of the children so it can terminate all children. - * This routine uses message queues to receive all communications. - */ -void messenger(void) -{ /* AKA Assassin */ - Msgbuf rcvbuf; - - int discrim = 0; - int rc; /* generic return code var */ - int sig = -1; /* type of signal received */ - extern int msgerr; /* message queue used to send error messages */ - extern int procgrp; /* process group of children (used to kill them) */ - - /* - * Infinite loop used to receive error messages from children and - * to terminate process tree. - */ - while (TRUE) { - rc = msgrcv(msgerr, &rcvbuf, sizeof(struct messagebuf), 0, 0); - if (rc == -1) { - switch (errno) { - case EAGAIN: - printf("msgqueue %d not ready to receive\n", - msgid); - fflush(stdout); - errno = 0; - break; - case ENOMSG: - printf("msgqueue %d no message\n", msgid); - fflush(stdout); - errno = 0; - break; - default: - perror("msgrcv failed"); - fprintf(stderr, - " SEVERE : messenger - msgrcv failed, errno: %d\n", - errno); - errno = 0; - break; - } - } else { - switch ((int)rcvbuf.mtyp) { - case 1: /* type 1: we received the process group id */ - sscanf(rcvbuf.mtext, "%d", &procgrp); - break; - - case 2: /* type 2: we received an error */ - fprintf(stderr, " SEVERE : %s ", rcvbuf.mtext); - /* rcvbuf.mtext type %s ou %d ??? */ - break; - - case 3: /* type 3: somebody got a signal, now we terminate */ - sscanf(rcvbuf.mtext, "%d", &sig); - - switch (sig) { - case SIGALRM: - /* a process is hung, we will terminate */ - killpg(procgrp, sig); - fprintf(errfp, - "ALERT! ALERT! WE HAVE TIMED OUT\n"); - fprintf(stderr, - " SEVERE : SIGALRM: A process timed out, we failed\n"); - shmaddr->err++; - break; - - case SIGUSR1: - /* Special: means everything went ok */ - discrim = 1; - break; - - default: - /* somebody sent a signal, we will terminate */ - killpg(procgrp, sig); - fprintf(errfp, - "We received signal %d\n", sig); - fprintf(stderr, - " SEVERE : signal %d received, A proc was killed\n", - sig); - break; - } - /* clean up and exit with status */ - rm_msgqueue(); - rm_semseg(); - if (AUSDEBUG) - print_shm(); - prtln(); - rm_shmseg(); - prtln(); - if (discrim) { - prtln(); - printf("Test exiting with SUCCESS\n"); - exit(0); - } - exit(1); - - break; - } - } - } -} - -/* - * This routine spawns off the first child (node 0) of the process tree. - * This child set up the signal handler for all of the children and also - * sets up a process group so that all children can be terminated easily. - * The child then calls spawn which creates the process tree. After spawn - * has returned the child contacts the parent and the parent exits. - * The parent sets her own signal handler and then calls messenger. - */ -void doit(void) -{ - pid_t pid; /* process id */ - int rc; - char mtext[80]; /* message text */ - extern int msgerr; - extern int procgrp; - - pid = fork(); -#ifdef __64LDT__ - if (pid == (pid_t) 0) { -#else - if (pid == 0) { -#endif - /* set the process group so we can terminate all children */ - set_signals((void *)nextofkin); /* set up signal handlers and initialize pgrp */ -#ifndef _LINUX - procgrp = setpgrp(0, 0); -#else - procgrp = setpgrp(); -#endif - if (AUSDEBUG) { - fprintf(stderr, "process group: %d\n", procgrp); - fflush(stderr); - } - if (procgrp == -1) { - perror("setpgid failed"); - fprintf(stderr, " SEVERE : setpgid failed, errno: %d\n", - errno); - exit(1); - } - sprintf(mtext, "%d", procgrp); - rc = send_message(msgerr, 1, mtext); - if (rc == -1) { - perror("send_message failed"); - fprintf(stderr, - " SEVERE : send_message failed, errno: %d\n", - errno); - exit(1); - } - - put_proc_info(0); /* store process info for this (root) process */ - spawn(0); - if (shmaddr->pid == getpid()) { - sprintf(mtext, "%d", SIGUSR1); - rc = send_message(msgerr, 3, mtext); - if (rc == -1) { - severe - ("msgsnd failed: %d msgid %d mtyp %d mtext %d\n", - errno, msgerr, 3, mtext); - exit(1); - - } - } - exit(0); - } -#ifdef __64LDT__ - else if (pid > (pid_t) 0) { -#else - else if (pid > 0) { -#endif - set_signals((void *)cleanup); /* set up signal handlers and initialize pgrp */ - messenger(); /* receives and acts upon messages */ - exit(1); - } else { - perror("fork failed"); - fprintf(stderr, - " SEVERE : fork failed, exiting with errno %d\n", - errno); - exit(1); - } -} - -/* main */ -int main(int argc, char *argv[]) -{ - extern Pinfo *shmaddr; /* start address of shared memory */ - - prtln(); - getenv_val(); /* Get and initialize all environment variables */ - prtln(); - - if (argc < 2) { - fprintf(stderr, - "usage: %s [-b number] [-d number] [-t number] \n", - argv[0]); - fprintf(stderr, "where:\n"); - fprintf(stderr, - "\t-b number\tnumber of children each parent will spawn ( > 1)\n"); - fprintf(stderr, "\t-d number\tdepth of process tree ( > 1)\n"); - fprintf(stderr, "\t-t\t\tset timeout value\n"); - fprintf(stderr, " SEVERE : Command line parameter error.\n"); - exit(1); - } - - parse_args(argc, argv); /* Get all command line arguments */ - dprt("value of BVAL = %d, value of DVAL = %d\n", BVAL, DVAL); - nodesum = sumit(BVAL, DVAL); -#ifdef _LINUX - if (nodesum > 250) { - printf("total number of process to be created " - "nodesum (%d) is greater\n than the allowed " - "SEMMSL value (250)\n", nodesum); - printf("reseting the value of nodesum to SEMMSL\n"); - nodesum = 250; - } -#endif - - dprt("value of nodesum is initiallized to: %d\n", nodesum); - - prtln(); - setup_shm(); /* Set up, allocate and initialize shared memory */ - prtln(); - setup_semaphores(); /* Set up, allocate and initialize semaphores */ - prtln(); - setup_msgqueue(); /* Set up, allocate and initialize message queues */ - prtln(); - - doit(); /* spawn off processes */ - prtln(); - return 0; - -} -- 2.33.0 -- Mailing list info: https://lists.linux.it/listinfo/ltp