10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * CDDL HEADER START
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * The contents of this file are subject to the terms of the
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Common Development and Distribution License (the "License").
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * You may not use this file except in compliance with the License.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * or http://www.opensolaris.org/os/licensing.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * See the License for the specific language governing permissions
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * and limitations under the License.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * When distributing Covered Code, include this CDDL HEADER in each
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * If applicable, add the following below this CDDL HEADER, with the
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * fields enclosed by brackets "[]" replaced with your own identifying
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * information: Portions Copyright [yyyy] [name of copyright owner]
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * CDDL HEADER END
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Use is subject to license terms.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * parallel.cc
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Deal with the parallel processing
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Included files
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <errno.h> /* errno */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <fcntl.h>
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <mk/defs.h>
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <mksh/dosys.h> /* redirect_io() */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <mksh/macro.h> /* expand_value() */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <mksh/misc.h> /* getmem() */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <sys/signal.h>
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <sys/stat.h>
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <sys/types.h>
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <sys/utsname.h>
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <sys/wait.h>
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <unistd.h>
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <netdb.h>
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <libintl.h>
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Defined macros
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#define MAXRULES 100
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * This const should be in avo_dms/include/AvoDmakeCommand.h
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweconst int local_host_mask = 0x20;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * typedefs & structs
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Static variables
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic Boolean just_did_subtree = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic char local_host[MAXNAMELEN] = "";
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic char user_name[MAXNAMELEN] = "";
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic int pmake_max_jobs = 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic pid_t process_running = -1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic Running *running_tail = &running_list;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic Name subtree_conflict;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic Name subtree_conflict2;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * File table of contents
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic void delete_running_struct(Running rp);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic Boolean dependency_conflict(Name target);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic Doname distribute_process(char **commands, Property line);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic void doname_subtree(Name target, Boolean do_get, Boolean implicit);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic void dump_out_file(char *filename, Boolean err);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic void finish_doname(Running rp);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic void maybe_reread_make_state(void);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic void process_next(void);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic void reset_conditionals(int cnt, Name *targets, Property *locals);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic pid_t run_rule_commands(char *host, char **commands);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic Property *set_conditionals(int cnt, Name *targets);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic void store_conditionals(Running rp);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * execute_parallel(line, waitflg)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * DMake 2.x:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * parallel mode: spawns a parallel process to execute the command group.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Return value:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * The result of the execution
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Parameters:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * line The command group to execute
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard LoweDoname
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweexecute_parallel(Property line, Boolean waitflg, Boolean local)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe int argcnt;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe int cmd_options = 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe char *commands[MAXRULES + 5];
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe char *cp;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Name dmake_name;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Name dmake_value;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe int ignore;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Name make_machines_name;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe char **p;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Property prop;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Doname result = build_ok;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Cmd_line rule;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean silent_flag;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Name target = line->body.line.target;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean wrote_state_file = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((pmake_max_jobs == 0) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (dmake_mode_type == parallel_mode)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (local_host[0] == '\0') {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) gethostname(local_host, MAXNAMELEN);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe MBSTOWCS(wcs_buffer, "DMAKE_MAX_JOBS");
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe dmake_name = GETNAME(wcs_buffer, FIND_LENGTH);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (((prop = get_prop(dmake_name->prop, macro_prop)) != NULL) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe ((dmake_value = prop->body.macro.value) != NULL)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe pmake_max_jobs = atoi(dmake_value->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (pmake_max_jobs <= 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe warning(gettext("DMAKE_MAX_JOBS cannot be less than or equal to zero."));
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe warning(gettext("setting DMAKE_MAX_JOBS to %d."), PMAKE_DEF_MAX_JOBS);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe pmake_max_jobs = PMAKE_DEF_MAX_JOBS;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * For backwards compatibility w/ PMake 1.x, when
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * DMake 2.x is being run in parallel mode, DMake
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * should parse the PMake startup file
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * $(HOME)/.make.machines to get the pmake_max_jobs.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe MBSTOWCS(wcs_buffer, "PMAKE_MACHINESFILE");
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe dmake_name = GETNAME(wcs_buffer, FIND_LENGTH);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (((prop = get_prop(dmake_name->prop, macro_prop)) != NULL) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe ((dmake_value = prop->body.macro.value) != NULL)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe make_machines_name = dmake_value;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe make_machines_name = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((pmake_max_jobs = read_make_machines(make_machines_name)) <= 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe pmake_max_jobs = PMAKE_DEF_MAX_JOBS;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((dmake_mode_type == serial_mode) ||
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe ((dmake_mode_type == parallel_mode) && (waitflg))) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return (execute_serial(line));
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe p = commands;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe argcnt = 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (rule = line->body.line.command_used;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rule != NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rule = rule->next) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (posix && (touch || quest) && !rule->always_exec) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe continue;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (vpath_defined) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rule->command_line =
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe vpath_translation(rule->command_line);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe silent_flag = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe ignore = 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (rule->command_line->hash.length > 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (++argcnt == MAXRULES) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return build_serial;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (rule->silent && !silent) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe silent_flag = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (rule->ignore_error) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe ignore++;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* XXX - need to add support for + prefix */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (silent_flag || ignore) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *p = getmem((silent_flag ? 1 : 0) +
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe ignore +
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (strlen(rule->
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe command_line->
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe string_mb)) +
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe 1);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe cp = *p++;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (silent_flag) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *cp++ = (int) at_char;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (ignore) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *cp++ = (int) hyphen_char;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) strcpy(cp, rule->command_line->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *p++ = rule->command_line->string_mb;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((argcnt == 0) ||
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (report_dependencies_level > 0)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return build_ok;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *p = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Doname res = distribute_process(commands, line);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (res == build_running) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe parallel_process_cnt++;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Return only those memory that were specially allocated
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * for part of commands.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (int i = 0; commands[i] != NULL; i++) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((commands[i][0] == (int) at_char) ||
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (commands[i][0] == (int) hyphen_char)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe retmem_mb(commands[i]);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return res;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <unistd.h> /* sysconf(_SC_NPROCESSORS_ONLN) */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <sys/ipc.h> /* ftok() */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <sys/shm.h> /* shmget(), shmat(), shmdt(), shmctl() */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <semaphore.h> /* sem_init(), sem_trywait(), sem_post(), sem_destroy() */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#include <sys/loadavg.h> /* getloadavg() */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * adjust_pmake_max_jobs (int pmake_max_jobs)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Parameters:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * pmake_max_jobs - max jobs limit set by user
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * External functions used:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * sysconf()
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * getloadavg()
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic int
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweadjust_pmake_max_jobs (int pmake_max_jobs)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe static int ncpu = 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe double loadavg[3];
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe int adjustment;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe int adjusted_max_jobs;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (ncpu <= 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((ncpu = sysconf(_SC_NPROCESSORS_ONLN)) <= 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe ncpu = 1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (getloadavg(loadavg, 3) != 3) return(pmake_max_jobs);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe adjustment = ((int)loadavg[LOADAVG_1MIN]);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (adjustment < 2) return(pmake_max_jobs);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (ncpu > 1) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe adjustment = adjustment / ncpu;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe adjusted_max_jobs = pmake_max_jobs - adjustment;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (adjusted_max_jobs < 1) adjusted_max_jobs = 1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return(adjusted_max_jobs);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * M2 adjust mode data and functions
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * m2_init() - initializes M2 shared semaphore
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * m2_acquire_job() - decrements M2 semaphore counter
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * m2_release_job() - increments M2 semaphore counter
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * m2_fini() - destroys M2 semaphore and shared memory*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Environment variables:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * __DMAKE_M2_FILE__
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * External functions:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * ftok(), shmget(), shmat(), shmdt(), shmctl()
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * sem_init(), sem_trywait(), sem_post(), sem_destroy()
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * creat(), close(), unlink()
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * getenv(), putenv()
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Static variables:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * m2_file - tmp file name to create ipc key for shared memory
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * m2_shm_id - shared memory id
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * m2_shm_sem - shared memory semaphore
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic char m2_file[MAXPATHLEN];
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic int m2_shm_id = -1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic sem_t* m2_shm_sem = 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic int
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowem2_init() {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe char *var;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe key_t key;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((var = getenv("__DMAKE_M2_FILE__")) == 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* compose tmp file name */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe sprintf(m2_file, "%s/dmake.m2.%d.XXXXXX", tmpdir, getpid());
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* create tmp file */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe int fd = mkstemp(m2_file);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (fd < 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return -1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe close(fd);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* using existing semaphore */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe strcpy(m2_file, var);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* combine IPC key */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((key = ftok(m2_file, 38)) == (key_t) -1) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return -1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* create shared memory */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((m2_shm_id = shmget(key, sizeof(*m2_shm_sem), 0666 | (var ? 0 : IPC_CREAT|IPC_EXCL))) == -1) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return -1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* attach shared memory */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((m2_shm_sem = (sem_t*) shmat(m2_shm_id, 0, 0666)) == (sem_t*)-1) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return -1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* root process */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (var == 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* initialize semaphore */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (sem_init(m2_shm_sem, 1, pmake_max_jobs)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return -1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* alloc memory for env variable */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((var = (char*) malloc(MAXPATHLEN)) == 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return -1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* put key to env */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe sprintf(var, "__DMAKE_M2_FILE__=%s", m2_file);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (putenv(var)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return -1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic void
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowem2_fini() {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (m2_shm_id >= 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct shmid_ds stat;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* determine the number of attached processes */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (shmctl(m2_shm_id, IPC_STAT, &stat) == 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (stat.shm_nattch <= 1) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* destroy semaphore */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (m2_shm_sem != 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) sem_destroy(m2_shm_sem);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* destroy shared memory */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) shmctl(m2_shm_id, IPC_RMID, &stat);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* remove tmp file created for the key */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) unlink(m2_file);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* detach shared memory */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (m2_shm_sem != 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) shmdt((char*) m2_shm_sem);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe m2_shm_id = -1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe m2_shm_sem = 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic int
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowem2_acquire_job() {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((m2_shm_id >= 0) && (m2_shm_sem != 0)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (sem_trywait(m2_shm_sem) == 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return 1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (errno == EAGAIN) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return -1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic int
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowem2_release_job() {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((m2_shm_id >= 0) && (m2_shm_sem != 0)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (sem_post(m2_shm_sem) == 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return -1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * job adjust mode
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Possible values:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * ADJUST_M1 - adjustment by system load (default)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * ADJUST_M2 - fixed limit of jobs for the group of nested dmakes
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * ADJUST_NONE - no adjustment - fixed limit of jobs for the current dmake
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic enum {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe ADJUST_UNKNOWN,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe ADJUST_M1,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe ADJUST_M2,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe ADJUST_NONE
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe} job_adjust_mode = ADJUST_UNKNOWN;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * void job_adjust_fini()
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Description:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Cleans up job adjust data.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Static variables:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * job_adjust_mode Current job adjust mode
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowevoid
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowejob_adjust_fini() {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (job_adjust_mode == ADJUST_M2) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe m2_fini();
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * void job_adjust_error()
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Description:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Prints warning message, cleans up job adjust data, and disables job adjustment
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Environment:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * DMAKE_ADJUST_MAX_JOBS
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * External functions:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * putenv()
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Static variables:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * job_adjust_mode Current job adjust mode
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic void
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowejob_adjust_error() {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (job_adjust_mode != ADJUST_NONE) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* cleanup internals */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe job_adjust_fini();
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* warning message for the user */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe warning(gettext("Encountered max jobs auto adjustment error - disabling auto adjustment."));
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* switch off job adjustment for the children */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe putenv(strdup("DMAKE_ADJUST_MAX_JOBS=NO"));
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* and for this dmake */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe job_adjust_mode = ADJUST_NONE;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * void job_adjust_init()
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Description:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Parses DMAKE_ADJUST_MAX_JOBS env variable
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * and performs appropriate initializations.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Environment:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * DMAKE_ADJUST_MAX_JOBS
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * DMAKE_ADJUST_MAX_JOBS == "NO" - no adjustment
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * DMAKE_ADJUST_MAX_JOBS == "M2" - M2 adjust mode
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * other - M1 adjust mode
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * External functions:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * getenv()
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Static variables:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * job_adjust_mode Current job adjust mode
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic void
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowejob_adjust_init() {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (job_adjust_mode == ADJUST_UNKNOWN) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* default mode */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe job_adjust_mode = ADJUST_M1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* determine adjust mode */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (char *var = getenv("DMAKE_ADJUST_MAX_JOBS")) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (strcasecmp(var, "NO") == 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe job_adjust_mode = ADJUST_NONE;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else if (strcasecmp(var, "M2") == 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe job_adjust_mode = ADJUST_M2;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* M2 specific initialization */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (job_adjust_mode == ADJUST_M2) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (m2_init()) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe job_adjust_error();
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * distribute_process(char **commands, Property line)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Parameters:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * commands argv vector of commands to execute
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Return value:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * The result of the execution
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Static variables used:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * process_running Set to the pid of the process set running
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * job_adjust_mode Current job adjust mode
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic Doname
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowedistribute_process(char **commands, Property line)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe static unsigned file_number = 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t string[MAXPATHLEN];
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe char mbstring[MAXPATHLEN];
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe int filed;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe int res;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe int tmp_index;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe char *tmp_index_str_ptr;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* initialize adjust mode, if not initialized */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (job_adjust_mode == ADJUST_UNKNOWN) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe job_adjust_init();
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* actions depend on adjust mode */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe switch (job_adjust_mode) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case ADJUST_M1:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe while (parallel_process_cnt >= adjust_pmake_max_jobs (pmake_max_jobs)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe await_parallel(false);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe finish_children(true);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case ADJUST_M2:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((res = m2_acquire_job()) == 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (parallel_process_cnt > 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe await_parallel(false);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe finish_children(true);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((res = m2_acquire_job()) == 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return build_serial;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return build_serial;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (res < 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* job adjustment error */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe job_adjust_error();
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* no adjustment */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe while (parallel_process_cnt >= pmake_max_jobs) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe await_parallel(false);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe finish_children(true);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe default:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe while (parallel_process_cnt >= pmake_max_jobs) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe await_parallel(false);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe finish_children(true);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe setvar_envvar();
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Tell the user what DMake is doing.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (!silent && output_mode != txt2_mode) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Print local_host --> x job(s).
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) fprintf(stdout,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe gettext("%s --> %d %s\n"),
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe local_host,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe parallel_process_cnt + 1,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (parallel_process_cnt == 0) ? gettext("job") : gettext("jobs"));
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Print command line(s). */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe tmp_index = 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe while (commands[tmp_index] != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* No @ char. */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* XXX - need to add [2] when + prefix is added */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((commands[tmp_index][0] != (int) at_char) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (commands[tmp_index][1] != (int) at_char)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe tmp_index_str_ptr = commands[tmp_index];
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (*tmp_index_str_ptr == (int) hyphen_char) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe tmp_index_str_ptr++;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) fprintf(stdout, "%s\n", tmp_index_str_ptr);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe tmp_index++;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) fflush(stdout);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) sprintf(mbstring,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe "%s/dmake.stdout.%d.%d.XXXXXX",
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe tmpdir,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe getpid(),
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe file_number++);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe mktemp(mbstring);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe stdout_file = strdup(mbstring);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe stderr_file = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (!out_err_same) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) sprintf(mbstring,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe "%s/dmake.stderr.%d.%d.XXXXXX",
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe tmpdir,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe getpid(),
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe file_number++);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe mktemp(mbstring);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe stderr_file = strdup(mbstring);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe process_running = run_rule_commands(local_host, commands);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return build_running;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * doname_parallel(target, do_get, implicit)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Processes the given target and finishes up any parallel
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * processes left running.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Return value:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Result of target build
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Parameters:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * target Target to build
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * do_get True if sccs get to be done
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * implicit True if this is an implicit target
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard LoweDoname
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowedoname_parallel(Name target, Boolean do_get, Boolean implicit)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Doname result;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe result = doname_check(target, do_get, implicit, false);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (result == build_ok || result == build_failed) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return result;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe finish_running();
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return (Doname) target->state;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * doname_subtree(target, do_get, implicit)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Completely computes an object and its dependents for a
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * serial subtree build.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Parameters:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * target Target to build
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * do_get True if sccs get to be done
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * implicit True if this is an implicit target
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Static variables used:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * running_tail Tail of the list of running processes
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Global variables used:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * running_list The list of running processes
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic void
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowedoname_subtree(Name target, Boolean do_get, Boolean implicit)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Running save_running_list;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Running *save_running_tail;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe save_running_list = running_list;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe save_running_tail = running_tail;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe running_list = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe running_tail = &running_list;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target->state = build_subtree;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target->checking_subtree = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe while(doname_check(target, do_get, implicit, false) == build_running) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target->checking_subtree = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe finish_running();
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target->state = build_subtree;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target->checking_subtree = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe running_list = save_running_list;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe running_tail = save_running_tail;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * finish_running()
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Keeps processing until the running_list is emptied out.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Parameters:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Global variables used:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * running_list The list of running processes
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowevoid
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowefinish_running(void)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe while (running_list != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe await_parallel(false);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe finish_children(true);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (running_list != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe process_next();
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * process_next()
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Searches the running list for any targets which can start processing.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * This can be a pending target, a serial target, or a subtree target.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Parameters:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Static variables used:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * running_tail The end of the list of running procs
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * subtree_conflict A target which conflicts with a subtree
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * subtree_conflict2 The other target which conflicts
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Global variables used:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * commands_done True if commands executed
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * debug_level Controls debug output
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * parallel_process_cnt Number of parallel process running
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * recursion_level Indentation for debug output
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * running_list List of running processes
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic void
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweprocess_next(void)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Running rp;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Running *rp_prev;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Property line;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Chain target_group;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Dependency dep;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean quiescent = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Running *subtree_target;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean saved_commands_done;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Property *conditionals;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe subtree_target = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe subtree_conflict = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe subtree_conflict2 = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * If nothing currently running, build a serial target, if any.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestart_loop_1:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (rp_prev = &running_list, rp = running_list;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp != NULL && parallel_process_cnt == 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp = rp->next) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (rp->state == build_serial) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *rp_prev = rp->next;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (rp->next == NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe running_tail = rp_prev;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe recursion_level = rp->recursion_level;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->target->state = build_pending;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) doname_check(rp->target,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->do_get,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->implicit,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe false);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe quiescent = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe delete_running_struct(rp);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe goto start_loop_1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp_prev = &rp->next;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Find a target to build. The target must be pending, have all
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * its dependencies built, and not be in a target group with a target
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * currently building.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestart_loop_2:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (rp_prev = &running_list, rp = running_list;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp != NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp = rp->next) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (!(rp->state == build_pending ||
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->state == build_subtree)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe quiescent = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp_prev = &rp->next;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else if (rp->state == build_pending) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe line = get_prop(rp->target->prop, line_prop);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (dep = line->body.line.dependencies;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe dep != NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe dep = dep->next) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (dep->name->state == build_running ||
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe dep->name->state == build_pending ||
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe dep->name->state == build_serial) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (dep == NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (target_group = line->body.line.target_group;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target_group != NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target_group = target_group->next) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (is_running(target_group->name)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (target_group == NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *rp_prev = rp->next;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (rp->next == NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe running_tail = rp_prev;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe recursion_level = rp->recursion_level;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->target->state = rp->redo ?
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe build_dont_know : build_pending;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe saved_commands_done = commands_done;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe conditionals =
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe set_conditionals
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (rp->conditional_cnt,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->conditional_targets);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->target->dont_activate_cond_values = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((doname_check(rp->target,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->do_get,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->implicit,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->target->has_target_prop ? true : false) !=
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe build_running) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe !commands_done) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe commands_done =
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe saved_commands_done;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->target->dont_activate_cond_values = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe reset_conditionals
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (rp->conditional_cnt,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->conditional_targets,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe conditionals);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe quiescent = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe delete_running_struct(rp);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe goto start_loop_2;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp_prev = &rp->next;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp_prev = &rp->next;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp_prev = &rp->next;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * If nothing has been found to build and there exists a subtree
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * target with no dependency conflicts, build it.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (quiescent) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestart_loop_3:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (rp_prev = &running_list, rp = running_list;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp != NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp = rp->next) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (rp->state == build_subtree) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (!dependency_conflict(rp->target)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *rp_prev = rp->next;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (rp->next == NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe running_tail = rp_prev;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe recursion_level = rp->recursion_level;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe doname_subtree(rp->target,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->do_get,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->implicit);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe quiescent = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe delete_running_struct(rp);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe goto start_loop_3;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe subtree_target = rp_prev;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp_prev = &rp->next;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp_prev = &rp->next;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * If still nothing found to build, we either have a deadlock
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * or a subtree with a dependency conflict with something waiting
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * to build.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (quiescent) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (subtree_target == NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe fatal(gettext("Internal error: deadlock detected in process_next"));
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp = *subtree_target;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (debug_level > 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe warning(gettext("Conditional macro conflict encountered for %s between %s and %s"),
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe subtree_conflict2->string_mb,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->target->string_mb,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe subtree_conflict->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *subtree_target = (*subtree_target)->next;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (rp->next == NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe running_tail = subtree_target;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe recursion_level = rp->recursion_level;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe doname_subtree(rp->target, rp->do_get, rp->implicit);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe delete_running_struct(rp);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * set_conditionals(cnt, targets)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Sets the conditional macros for the targets given in the array of
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * targets. The old macro values are returned in an array of
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Properties for later resetting.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Return value:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Array of conditional macro settings
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Parameters:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * cnt Number of targets
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * targets Array of targets
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic Property *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweset_conditionals(int cnt, Name *targets)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Property *locals, *lp;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Name *tp;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe locals = (Property *) getmem(cnt * sizeof(Property));
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (lp = locals, tp = targets;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe cnt > 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe cnt--, lp++, tp++) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *lp = (Property) getmem((*tp)->conditional_cnt *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe sizeof(struct _Property));
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe set_locals(*tp, *lp);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return locals;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * reset_conditionals(cnt, targets, locals)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Resets the conditional macros as saved in the given array of
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Properties. The resets are done in reverse order. Afterwards the
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * data structures are freed.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Parameters:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * cnt Number of targets
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * targets Array of targets
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * locals Array of dependency macro settings
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic void
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowereset_conditionals(int cnt, Name *targets, Property *locals)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Name *tp;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Property *lp;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (tp = targets + (cnt - 1), lp = locals + (cnt - 1);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe cnt > 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe cnt--, tp--, lp--) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe reset_locals(*tp,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *lp,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe get_prop((*tp)->prop, conditional_prop),
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe 0);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe retmem_mb((caddr_t) *lp);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe retmem_mb((caddr_t) locals);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * dependency_conflict(target)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Returns true if there is an intersection between
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * the subtree of the target and any dependents of the pending targets.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Return value:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * True if conflict found
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Parameters:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * target Subtree target to check
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Static variables used:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * subtree_conflict Target conflict found
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * subtree_conflict2 Second conflict found
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Global variables used:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * running_list List of running processes
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * wait_name .WAIT, not a real dependency
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic Boolean
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowedependency_conflict(Name target)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Property line;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Property pending_line;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Dependency dp;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Dependency pending_dp;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Running rp;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Return if we are already checking this target */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (target->checking_subtree) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target->checking_subtree = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe line = get_prop(target->prop, line_prop);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (line == NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target->checking_subtree = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Check each dependency of the target for conflicts */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (dp = line->body.line.dependencies; dp != NULL; dp = dp->next) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Ignore .WAIT dependency */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (dp->name == wait_name) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe continue;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * For each pending target, look for a dependency which
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * is the same as a dependency of the subtree target. Since
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * we can't build the subtree until all pending targets have
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * finished which depend on the same dependency, this is
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * a conflict.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (rp = running_list; rp != NULL; rp = rp->next) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (rp->state == build_pending) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe pending_line = get_prop(rp->target->prop,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe line_prop);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (pending_line == NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe continue;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for(pending_dp = pending_line->
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe body.line.dependencies;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe pending_dp != NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe pending_dp = pending_dp->next) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (dp->name == pending_dp->name) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target->checking_subtree
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe subtree_conflict = rp->target;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe subtree_conflict2 = dp->name;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (dependency_conflict(dp->name)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target->checking_subtree = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target->checking_subtree = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * await_parallel(waitflg)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Waits for parallel children to exit and finishes their processing.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * If waitflg is false, the function returns after update_delay.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Parameters:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * waitflg dwight
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowevoid
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweawait_parallel(Boolean waitflg)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean nohang;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe pid_t pid;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe int status;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Running rp;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe int waiterr;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe nohang = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for ( ; ; ) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (!nohang) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) alarm((int) update_delay);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe pid = waitpid((pid_t)-1,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe &status,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe nohang ? WNOHANG : 0);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe waiterr = errno;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (!nohang) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) alarm(0);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (pid <= 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (waiterr == EINTR) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (waitflg) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe continue;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (rp = running_list;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (rp != NULL) && (rp->pid != pid);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp = rp->next) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe ;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (rp == NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe fatal(gettext("Internal error: returned child pid not in running_list"));
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->state = (WIFEXITED(status) && WEXITSTATUS(status) == 0) ? build_ok : build_failed;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe nohang = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe parallel_process_cnt--;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (job_adjust_mode == ADJUST_M2) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (m2_release_job()) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe job_adjust_error();
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * finish_children(docheck)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Finishes the processing for all targets which were running
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * and have now completed.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Parameters:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * docheck Completely check the finished target
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Static variables used:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * running_tail The tail of the running list
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Global variables used:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * continue_after_error -k flag
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * fatal_in_progress True if we are finishing up after fatal err
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * running_list List of running processes
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowevoid
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowefinish_children(Boolean docheck)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe int cmds_length;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Property line;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Property line2;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe struct stat out_buf;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Running rp;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Running *rp_prev;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Cmd_line rule;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean silent_flag;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (rp_prev = &running_list, rp = running_list;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp != NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp = rp->next) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowebypass_for_loop_inc_4:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * If the state is ok or failed, then this target has
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * finished building.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * In parallel_mode, output the accumulated stdout/stderr.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Read the auto dependency stuff, handle a failed build,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * update the target, then finish the doname process for
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * that target.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (rp->state == build_ok || rp->state == build_failed) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *rp_prev = rp->next;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (rp->next == NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe running_tail = rp_prev;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((line2 = rp->command) == NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe line2 = get_prop(rp->target->prop, line_prop);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Check if there were any job output
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * from the parallel build.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (rp->stdout_file != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (stat(rp->stdout_file, &out_buf) < 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe fatal(gettext("stat of %s failed: %s"),
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->stdout_file,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe errmsg(errno));
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((line2 != NULL) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (out_buf.st_size > 0)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe cmds_length = 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (rule = line2->body.line.command_used,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe silent_flag = silent;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rule != NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rule = rule->next) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe cmds_length += rule->command_line->hash.length + 1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe silent_flag = BOOLEAN(silent_flag || rule->silent);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (out_buf.st_size != cmds_length || silent_flag ||
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe output_mode == txt2_mode) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe dump_out_file(rp->stdout_file, false);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) unlink(rp->stdout_file);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe retmem_mb(rp->stdout_file);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->stdout_file = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (!out_err_same && (rp->stderr_file != NULL)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (stat(rp->stderr_file, &out_buf) < 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe fatal(gettext("stat of %s failed: %s"),
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->stderr_file,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe errmsg(errno));
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((line2 != NULL) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (out_buf.st_size > 0)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe dump_out_file(rp->stderr_file, true);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) unlink(rp->stderr_file);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe retmem_mb(rp->stderr_file);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->stderr_file = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe check_state(rp->temp_file);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (rp->temp_file != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe free_name(rp->temp_file);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->temp_file = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (rp->state == build_failed) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe line = get_prop(rp->target->prop, line_prop);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (line != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe line->body.line.command_used = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (continue_after_error ||
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe fatal_in_progress ||
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe !docheck) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe warning(gettext("Command failed for target `%s'"),
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->command ? line2->body.line.target->string_mb : rp->target->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe build_failed_seen = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * XXX??? - DMake needs to exit(),
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * but shouldn't call fatal().
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#ifdef PRINT_EXIT_STATUS
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe warning("I'm in finish_children. rp->state == build_failed.");
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe#endif
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe fatal(gettext("Command failed for target `%s'"),
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->command ? line2->body.line.target->string_mb : rp->target->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (!docheck) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe delete_running_struct(rp);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp = *rp_prev;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (rp == NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe goto bypass_for_loop_inc_4;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe update_target(get_prop(rp->target->prop, line_prop),
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->state);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe finish_doname(rp);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe delete_running_struct(rp);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp = *rp_prev;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (rp == NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe goto bypass_for_loop_inc_4;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp_prev = &rp->next;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * dump_out_file(filename, err)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Write the contents of the file to stdout, then unlink the file.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Parameters:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * filename Name of temp file containing output
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Global variables used:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic void
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowedump_out_file(char *filename, Boolean err)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe int chars_read;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe char copybuf[BUFSIZ];
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe int fd;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe int out_fd = (err ? 2 : 1);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((fd = open(filename, O_RDONLY)) < 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe fatal(gettext("open failed for output file %s: %s"),
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe filename,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe errmsg(errno));
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (!silent && output_mode != txt2_mode) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) fprintf(err ? stderr : stdout,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe err ?
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe gettext("%s --> Job errors\n") :
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe gettext("%s --> Job output\n"),
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe local_host);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) fflush(err ? stderr : stdout);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (chars_read = read(fd, copybuf, BUFSIZ);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe chars_read > 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe chars_read = read(fd, copybuf, BUFSIZ)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Read buffers from the source file until end or error.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (write(out_fd, copybuf, chars_read) < 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe fatal(gettext("write failed for output file %s: %s"),
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe filename,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe errmsg(errno));
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) close(fd);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) unlink(filename);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * finish_doname(rp)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Completes the processing for a target which was left running.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Parameters:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * rp Running list entry for target
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Global variables used:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * debug_level Debug flag
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * recursion_level Indentation for debug output
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic void
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowefinish_doname(Running rp)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe int auto_count = rp->auto_count;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Name *automatics = rp->automatics;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Doname result = rp->state;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Name target = rp->target;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Name true_target = rp->true_target;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Property *conditionals;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe recursion_level = rp->recursion_level;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (result == build_ok) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (true_target == NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf("Target = %s\n", target->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf(" State = %d\n", result);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe fatal("Internal error: NULL true_target in finish_doname");
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* If all went OK, set a nice timestamp */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (true_target->stat.time == file_doesnt_exist) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe true_target->stat.time = file_max_time;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target->state = result;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (target->is_member) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Property member;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Propagate the timestamp from the member file to the member */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((target->stat.time != file_max_time) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe ((member = get_prop(target->prop, member_prop)) != NULL) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (exists(member->body.member.member) > file_doesnt_exist)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target->stat.time =
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe exists(member->body.member.member);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe member->body.member.member->stat.time;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Check if we found any new auto dependencies when we
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * built the target.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((result == build_ok) && check_auto_dependencies(target,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe auto_count,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe automatics)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (debug_level > 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf(gettext("%*sTarget `%s' acquired new dependencies from build, checking all dependencies\n"),
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe recursion_level,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe "",
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe true_target->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target->rechecking_target = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe target->state = build_running;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* [tolik, Tue Mar 25 1997]
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Fix for bug 4038824:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * command line options set by conditional macros get dropped
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * rp->conditional_cnt and rp->conditional_targets must be copied
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * to new 'rp' during add_pending(). Set_conditionals() stores
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * rp->conditional_targets to the global variable 'conditional_targets'
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Add_pending() will use this variable to set up 'rp'.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe conditionals = set_conditionals(rp->conditional_cnt, rp->conditional_targets);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe add_pending(target,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe recursion_level,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->do_get,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->implicit,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe true);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe reset_conditionals(rp->conditional_cnt, rp->conditional_targets, conditionals);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * new_running_struct()
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Constructor for Running struct. Creates a structure and initializes
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * its fields.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic Running new_running_struct()
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Running rp;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp = ALLOC(Running);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->target = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->true_target = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->command = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->sprodep_value = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->sprodep_env = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->auto_count = 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->automatics = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->pid = -1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->job_msg_id = -1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->stdout_file = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->stderr_file = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->temp_file = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->next = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return rp;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * add_running(target, true_target, command, recursion_level, auto_count,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * automatics, do_get, implicit)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Adds a record on the running list for this target, which
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * was just spawned and is running.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Parameters:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * target Target being built
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * true_target True target for target
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * command Running command.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * recursion_level Debug indentation level
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * auto_count Count of automatic dependencies
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * automatics List of automatic dependencies
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * do_get Sccs get flag
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * implicit Implicit flag
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Static variables used:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * running_tail Tail of running list
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * process_running PID of process
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Global variables used:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * current_line Current line for target
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * current_target Current target being built
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * stderr_file Temporary file for stdout
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * stdout_file Temporary file for stdout
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * temp_file_name Temporary file for auto dependencies
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowevoid
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweadd_running(Name target, Name true_target, Property command, int recursion_level, int auto_count, Name *automatics, Boolean do_get, Boolean implicit)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Running rp;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Name *p;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp = new_running_struct();
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->state = build_running;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->target = target;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->true_target = true_target;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->command = command;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->recursion_level = recursion_level;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->do_get = do_get;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->implicit = implicit;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->auto_count = auto_count;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (auto_count > 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->automatics = (Name *) getmem(auto_count * sizeof (Name));
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (p = rp->automatics; auto_count > 0; auto_count--) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *p++ = *automatics++;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->automatics = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->pid = process_running;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe process_running = -1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe childPid = -1;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->job_msg_id = job_msg_id;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->stdout_file = stdout_file;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->stderr_file = stderr_file;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->temp_file = temp_file_name;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->redo = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->next = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe store_conditionals(rp);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe stdout_file = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe stderr_file = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe temp_file_name = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe current_target = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe current_line = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *running_tail = rp;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe running_tail = &rp->next;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * add_pending(target, recursion_level, do_get, implicit, redo)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Adds a record on the running list for a pending target
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * (waiting for its dependents to finish running).
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Parameters:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * target Target being built
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * recursion_level Debug indentation level
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * do_get Sccs get flag
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * implicit Implicit flag
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * redo True if this target is being redone
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Static variables used:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * running_tail Tail of running list
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowevoid
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweadd_pending(Name target, int recursion_level, Boolean do_get, Boolean implicit, Boolean redo)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Running rp;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp = new_running_struct();
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->state = build_pending;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->target = target;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->recursion_level = recursion_level;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->do_get = do_get;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->implicit = implicit;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->redo = redo;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe store_conditionals(rp);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *running_tail = rp;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe running_tail = &rp->next;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * add_serial(target, recursion_level, do_get, implicit)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Adds a record on the running list for a target which must be
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * executed in serial after others have finished.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Parameters:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * target Target being built
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * recursion_level Debug indentation level
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * do_get Sccs get flag
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * implicit Implicit flag
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Static variables used:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * running_tail Tail of running list
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowevoid
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweadd_serial(Name target, int recursion_level, Boolean do_get, Boolean implicit)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Running rp;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp = new_running_struct();
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->target = target;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->recursion_level = recursion_level;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->do_get = do_get;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->implicit = implicit;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->state = build_serial;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->redo = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe store_conditionals(rp);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *running_tail = rp;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe running_tail = &rp->next;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * add_subtree(target, recursion_level, do_get, implicit)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Adds a record on the running list for a target which must be
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * executed in isolation after others have finished.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Parameters:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * target Target being built
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * recursion_level Debug indentation level
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * do_get Sccs get flag
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * implicit Implicit flag
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Static variables used:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * running_tail Tail of running list
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowevoid
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweadd_subtree(Name target, int recursion_level, Boolean do_get, Boolean implicit)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Running rp;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp = new_running_struct();
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->target = target;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->recursion_level = recursion_level;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->do_get = do_get;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->implicit = implicit;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->state = build_subtree;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->redo = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe store_conditionals(rp);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *running_tail = rp;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe running_tail = &rp->next;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * store_conditionals(rp)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Creates an array of the currently active targets with conditional
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * macros (found in the chain conditional_targets) and puts that
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * array in the Running struct.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Parameters:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * rp Running struct for storing chain
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Global variables used:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * conditional_targets Chain of current dynamic conditionals
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic void
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestore_conditionals(Running rp)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe int cnt;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Chain cond_name;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (conditional_targets == NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->conditional_cnt = 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->conditional_targets = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe cnt = 0;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (cond_name = conditional_targets;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe cond_name != NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe cond_name = cond_name->next) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe cnt++;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->conditional_cnt = cnt;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->conditional_targets = (Name *) getmem(cnt * sizeof(Name));
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (cond_name = conditional_targets;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe cond_name != NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe cond_name = cond_name->next) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp->conditional_targets[--cnt] = cond_name->name;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * parallel_ok(target, line_prop_must_exists)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Returns true if the target can be run in parallel
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Return value:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * True if can run in parallel
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Parameters:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * target Target being tested
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Global variables used:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * all_parallel True if all targets default to parallel
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * only_parallel True if no targets default to parallel
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard LoweBoolean
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweparallel_ok(Name target, Boolean line_prop_must_exists)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean assign;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean make_refd;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Property line;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Cmd_line rule;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe assign = make_refd = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (((line = get_prop(target->prop, line_prop)) == NULL) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe line_prop_must_exists) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (line != NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (rule = line->body.line.command_used;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rule != NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rule = rule->next) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (rule->assign) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe assign = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else if (rule->make_refd) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe make_refd = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (assign) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else if (target->parallel) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else if (target->no_parallel) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else if (all_parallel) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else if (only_parallel) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else if (make_refd) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * is_running(target)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Returns true if the target is running.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Return value:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * True if target is running
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Parameters:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * target Target to check
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe *
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * Global variables used:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * running_list List of running processes
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard LoweBoolean
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Loweis_running(Name target)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Running rp;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (target->state != build_running) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (rp = running_list;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp != NULL && target != rp->target;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe rp = rp->next);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (rp == NULL) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return (rp->state == build_running) ? true : false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/*
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe * This function replaces the makesh binary.
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic pid_t
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowerun_rule_commands(char *host, char **commands)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean always_exec;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Name command;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean ignore;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe int length;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Doname result;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe Boolean silent_flag;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe wchar_t *tmp_wcs_buffer;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe childPid = fork();
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe switch (childPid) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case -1: /* Error */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe fatal(gettext("Could not fork child process for dmake job: %s"),
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe errmsg(errno));
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe case 0: /* Child */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* To control the processed targets list is not the child's business */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe running_list = NULL;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if(out_err_same) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe redirect_io(stdout_file, (char*)NULL);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe redirect_io(stdout_file, stderr_file);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe for (commands = commands;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (*commands != (char *)NULL);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe commands++) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe silent_flag = silent;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe ignore = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe always_exec = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe while ((**commands == (int) at_char) ||
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (**commands == (int) hyphen_char) ||
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (**commands == (int) plus_char)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (**commands == (int) at_char) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe silent_flag = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (**commands == (int) hyphen_char) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe ignore = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (**commands == (int) plus_char) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe always_exec = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (*commands)++;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((length = strlen(*commands)) >= MAXPATHLEN) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe tmp_wcs_buffer = ALLOC_WC(length + 1);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) mbstowcs(tmp_wcs_buffer, *commands, length + 1);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe command = GETNAME(tmp_wcs_buffer, FIND_LENGTH);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe retmem(tmp_wcs_buffer);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe } else {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe MBSTOWCS(wcs_buffer, *commands);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe command = GETNAME(wcs_buffer, FIND_LENGTH);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((command->hash.length > 0) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe !silent_flag) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf("%s\n", command->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe result = dosys(command,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe ignore,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe false,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe false, /* bugs #4085164 & #4990057 */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* BOOLEAN(silent_flag && ignore), */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe always_exec,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (Name) NULL);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (result == build_failed) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (silent_flag) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) printf(gettext("The following command caused the error:\n%s\n"), command->string_mb);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (!ignore) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe _exit(1);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe _exit(0);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe default:
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe break;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return childPid;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic void
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowemaybe_reread_make_state(void)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe /* Copying dosys()... */
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (report_dependencies_level == 0) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe make_state->stat.time = file_no_time;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) exists(make_state);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (make_state_before == make_state->stat.time) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe return;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe makefile_type = reading_statefile;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if (read_trace_level > 1) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe trace_reader = true;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe temp_file_number++;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (void) read_simple_file(make_state,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe false,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe false,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe false,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe false,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe false,
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe true);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe trace_reader = false;
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowestatic void
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowedelete_running_struct(Running rp)
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe{
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((rp->conditional_cnt > 0) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (rp->conditional_targets != NULL)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe retmem_mb((char *) rp->conditional_targets);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/**/
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if ((rp->auto_count > 0) &&
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe (rp->automatics != NULL)) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe retmem_mb((char *) rp->automatics);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe/**/
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if(rp->sprodep_value) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe free_name(rp->sprodep_value);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe if(rp->sprodep_env) {
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe retmem_mb(rp->sprodep_env);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe }
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe retmem_mb((char *) rp);
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe}
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe
10d63b7db37a83b39c7f511cf9426c9d03ea0760Richard Lowe