1 #ifndef ENGINE_H 2 #define ENGINE_H 3 /* $OpenBSD: engine.h,v 1.17 2020/01/13 15:12:58 espie Exp $ */ 4 5 /* 6 * Copyright (c) 1988, 1989, 1990 The Regents of the University of California. 7 * Copyright (c) 1988, 1989 by Adam de Boor 8 * Copyright (c) 1989 by Berkeley Softworks 9 * All rights reserved. 10 * 11 * This code is derived from software contributed to Berkeley by 12 * Adam de Boor. 13 * 14 * Redistribution and use in source and binary forms, with or without 15 * modification, are permitted provided that the following conditions 16 * are met: 17 * 1. Redistributions of source code must retain the above copyright 18 * notice, this list of conditions and the following disclaimer. 19 * 2. Redistributions in binary form must reproduce the above copyright 20 * notice, this list of conditions and the following disclaimer in the 21 * documentation and/or other materials provided with the distribution. 22 * 3. Neither the name of the University nor the names of its contributors 23 * may be used to endorse or promote products derived from this software 24 * without specific prior written permission. 25 * 26 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 27 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 28 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 29 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 30 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 31 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 32 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 34 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 35 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 36 * SUCH DAMAGE. 37 * 38 * from: @(#)job.h 8.1 (Berkeley) 6/6/93 39 */ 40 41 /* ok = node_find_valid_commands(node); 42 * verify the integrity of a node's commands, pulling stuff off 43 * .DEFAULT and other places if necessary. 44 */ 45 extern bool node_find_valid_commands(GNode *); 46 47 /* node_failure(gn); 48 * indicate we don't know how to make gn. 49 * may continue with -k or if node was optional. 50 */ 51 extern void node_failure(GNode *); 52 53 /* Job_Touch(node); 54 * touch the path corresponding to a node or update the corresponding 55 * archive object. 56 */ 57 extern void Job_Touch(GNode *); 58 59 /* Make_TimeStamp(parent, child); 60 * ensure parent is at least as recent as child. 61 */ 62 extern void Make_TimeStamp(GNode *, GNode *); 63 64 /* Make_HandleUse(user_node, usee_node); 65 * let user_node inherit the commands from usee_node 66 */ 67 extern void Make_HandleUse(GNode *, GNode *); 68 69 /* old = Make_OODate(node); 70 * check if a given node is out-of-date. 71 */ 72 extern bool Make_OODate(GNode *); 73 74 /* Make_DoAllVar(node); 75 * fill all dynamic variables for a node. 76 */ 77 extern void Make_DoAllVar(GNode *); 78 79 /* status = run_gnode(gn): 80 * fully run all commands of a node for compat mode. 81 */ 82 extern int run_gnode(GNode *); 83 84 /*- 85 * Job Table definitions. 86 * 87 * Each job has several things associated with it: 88 * 1) The process id of the child shell 89 * 2) The graph node describing the target of this job 90 * 3) State associated to latest command run 91 * 5) A word of flags which determine how the module handles errors, 92 * echoing, etc. for the job 93 * 94 * The job "table" is kept as a linked Lst in 'jobs', with the number of 95 * active jobs maintained in the 'nJobs' variable. At no time will this 96 * exceed the value of 'maxJobs', initialized by the Job_Init function. 97 * 98 * When a job is finished, the Make_Update function is called on each of the 99 * parents of the node which was just rebuilt. This takes care of the upward 100 * traversal of the dependency graph. 101 */ 102 struct Job_ { 103 struct Job_ *next; /* singly linked list */ 104 pid_t pid; /* Current command process id */ 105 Location *location; 106 int code; /* exit status or signal code */ 107 unsigned short exit_type; /* last child exit or signal */ 108 #define JOB_EXIT_OKAY 0 109 #define JOB_EXIT_BAD 1 110 #define JOB_SIGNALED 2 111 unsigned short flags; 112 #define JOB_SILENT 0x001 /* Command was silent */ 113 #define JOB_IS_EXPENSIVE 0x002 114 #define JOB_LOST 0x004 /* sent signal to non-existing pid ? */ 115 #define JOB_ERRCHECK 0x008 /* command wants errcheck */ 116 #define JOB_KEEPERROR 0x010 /* should place job on error list */ 117 LstNode next_cmd; /* Next command to run */ 118 char *cmd; /* Last command run */ 119 GNode *node; /* Target of this job */ 120 }; 121 122 /* Continuation-style running commands for the parallel engine */ 123 124 /* job_attach_node(job, node): 125 * attach a job to an allocated node, to be able to run commands 126 */ 127 extern void job_attach_node(Job *, GNode *); 128 129 /* finished = job_run_next(job): 130 * run next command for a job attached to a node. 131 * return true when job is finished. 132 */ 133 extern bool job_run_next(Job *); 134 135 /* handle_job_status(job, waitstatus): 136 * process a wait return value corresponding to a job, display 137 * messages and set job status accordingly. 138 */ 139 extern void handle_job_status(Job *, int); 140 141 #endif 142