1 #ifndef ENGINE_H 2 #define ENGINE_H 3 /* $OpenBSD: engine.h,v 1.13 2012/12/07 15:08:03 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 being made by 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 remade. 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 exit_type; /* last child exit or signal */ 107 #define JOB_EXIT_OKAY 0 108 #define JOB_EXIT_BAD 1 109 #define JOB_SIGNALED 2 110 int code; /* exit status or signal code */ 111 LstNode next_cmd; /* Next command to run */ 112 char *cmd; /* Last command run */ 113 GNode *node; /* Target of this job */ 114 unsigned short flags; 115 #define JOB_SILENT 0x001 /* Command was silent */ 116 #define JOB_IS_EXPENSIVE 0x002 117 #define JOB_LOST 0x004 /* sent signal to non-existing pid ? */ 118 #define JOB_ERRCHECK 0x008 /* command wants errcheck */ 119 }; 120 121 /* Continuation-style running commands for the parallel engine */ 122 123 /* job_attach_node(job, node): 124 * attach a job to an allocated node, to be able to run commands 125 */ 126 extern void job_attach_node(Job *, GNode *); 127 128 /* finished = job_run_next(job): 129 * run next command for a job attached to a node. 130 * return true when job is finished. 131 */ 132 extern bool job_run_next(Job *); 133 134 /* job_handle_status(job, waitstatus): 135 * process a wait return value corresponding to a job, display 136 * messages and set job status accordingly. 137 */ 138 extern void job_handle_status(Job *, int); 139 140 #endif 141