1 /* $NetBSD: schedule.c,v 1.12 2022/05/22 11:27:33 andvar Exp $ */ 2 3 /* 4 * Copyright (c) 1980, 1993 5 * The Regents of the University of California. All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. Neither the name of the University nor the names of its contributors 16 * may be used to endorse or promote products derived from this software 17 * without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 * SUCH DAMAGE. 30 */ 31 32 #include <sys/cdefs.h> 33 #ifndef lint 34 #if 0 35 static char sccsid[] = "@(#)schedule.c 8.1 (Berkeley) 5/31/93"; 36 #else 37 __RCSID("$NetBSD: schedule.c,v 1.12 2022/05/22 11:27:33 andvar Exp $"); 38 #endif 39 #endif /* not lint */ 40 41 #include <stdio.h> 42 #include <math.h> 43 #include <err.h> 44 #include <limits.h> 45 #include "trek.h" 46 47 /* 48 ** SCHEDULE AN EVENT 49 ** 50 ** An event of type 'type' is scheduled for time NOW + 'offset' 51 ** into the first available slot. 'x', 'y', and 'z' are 52 ** considered the attributes for this event. 53 ** 54 ** The address of the slot is returned. 55 */ 56 57 struct event * 58 schedule(int type, double offset, int x, int y, int z) 59 { 60 struct event *e; 61 int i; 62 double date; 63 64 date = Now.date + offset; 65 for (i = 0; i < MAXEVENTS; i++) { 66 e = &Event[i]; 67 if (e->evcode) 68 continue; 69 /* got a slot */ 70 #ifdef xTRACE 71 if (Trace) 72 printf("schedule: type %d @ %.2f " 73 "slot %d parm %d %d %d\n", 74 type, date, i, x, y, z); 75 #endif 76 e->evcode = type; 77 e->date = date; 78 e->x = x; 79 e->y = y; 80 e->systemname = z; 81 Now.eventptr[type & ~E_GHOST] = e; 82 return (e); 83 } 84 errx(1, "Cannot schedule event %d parm %d %d %d", type, x, y, z); 85 } 86 87 88 /* 89 ** RESCHEDULE AN EVENT 90 ** 91 ** The event pointed to by 'e' is rescheduled to the current 92 ** time plus 'offset'. 93 */ 94 95 void 96 reschedule(struct event *e1, double offset) 97 { 98 double date; 99 struct event *e; 100 101 e = e1; 102 103 date = Now.date + offset; 104 e->date = date; 105 #ifdef xTRACE 106 if (Trace) 107 printf("reschedule: type %d parm %d %d %d @ %.2f\n", 108 e->evcode, e->x, e->y, e->systemname, date); 109 #endif 110 return; 111 } 112 113 114 /* 115 ** UNSCHEDULE AN EVENT 116 ** 117 ** The event at slot 'e' is deleted. 118 */ 119 120 void 121 unschedule(struct event *e1) 122 { 123 struct event *e; 124 125 e = e1; 126 127 #ifdef xTRACE 128 if (Trace) 129 printf("unschedule: type %d @ %.2f parm %d %d %d\n", 130 e->evcode, e->date, e->x, e->y, e->systemname); 131 #endif 132 Now.eventptr[e->evcode & E_EVENT] = 0; 133 e->date = TOOLARGE; 134 e->evcode = 0; 135 return; 136 } 137 138 139 /* 140 ** Abbreviated schedule routine 141 ** 142 ** Parameters are the event index and a factor for the time 143 ** figure. 144 */ 145 146 struct event * 147 xsched(int ev1, int factor, int x, int y, int z) 148 { 149 int ev; 150 double when; 151 152 ev = ev1; 153 when = -Param.eventdly[ev] * Param.time * log(franf()) / factor; 154 return (schedule(ev, when, x, y, z)); 155 } 156 157 158 /* 159 ** Simplified reschedule routine 160 ** 161 ** Parameters are the event index, the initial date, and the 162 ** division factor. Look at the code to see what really happens. 163 */ 164 165 void 166 xresched(struct event *e1, int ev1, int factor) 167 { 168 int ev; 169 struct event *e; 170 double when; 171 172 ev = ev1; 173 e = e1; 174 when = -Param.eventdly[ev] * Param.time * log(franf()) / factor; 175 reschedule(e, when); 176 } 177