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 35static 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 57struct event * 58schedule(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 95void 96reschedule(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 120void 121unschedule(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 146struct event * 147xsched(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 165void 166xresched(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