Files
nethack/include/timeout.h
PatR ed18ebc545 timer validations
Add the contributed code that checks for attempting to start a
duplicate timer.  It's based on a comment which must have been there
at least 25 years and doesn't solve any known problems, but it is
conceptually similar to the large amount of sanity checking which has
gone into 3.6.x.

It didn't work as is because it was comparing two unions with '=='.
I don't know offhand whether C++ supports that but C doesn't (through
C11 at least; don't know about C17).  The union ('anything') is simple
enough that two instances can be compared without jumping through hoops.

I've also added another check for timer 'kind' (level, object, monster,
or global).
2019-07-27 16:12:24 -07:00

52 lines
1.6 KiB
C

/* NetHack 3.6 timeout.h $NHDT-Date: 1564269131 2019/07/27 23:12:11 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.12 $ */
/* Copyright 1994, Dean Luick */
/* NetHack may be freely redistributed. See license for details. */
#ifndef TIMEOUT_H
#define TIMEOUT_H
/* generic timeout function */
typedef void FDECL((*timeout_proc), (ANY_P *, long));
/* kind of timer */
enum timer_type {
TIMER_LEVEL = 0, /* event specific to level [melting ice] */
TIMER_GLOBAL = 1, /* event follows current play [not used] */
TIMER_OBJECT = 2, /* event follows an object [various] */
TIMER_MONSTER = 3, /* event follows a monster [not used] */
NUM_TIMER_KINDS /* 4 */
};
/* save/restore timer ranges */
#define RANGE_LEVEL 0 /* save/restore timers staying on level */
#define RANGE_GLOBAL 1 /* save/restore timers following global play */
/*
* Timeout functions. Add a define here, then put it in the table
* in timeout.c. "One more level of indirection will fix everything."
*/
enum timeout_types {
ROT_ORGANIC = 0, /* for buried organics */
ROT_CORPSE,
REVIVE_MON,
BURN_OBJECT,
HATCH_EGG,
FIG_TRANSFORM,
MELT_ICE_AWAY,
NUM_TIME_FUNCS
};
/* used in timeout.c */
typedef struct fe {
struct fe *next; /* next item in chain */
long timeout; /* when we time out */
unsigned long tid; /* timer ID */
short kind; /* kind of use */
short func_index; /* what to call when we time out */
anything arg; /* pointer to timeout argument */
Bitfield(needs_fixup, 1); /* does arg need to be patched? */
} timer_element;
#endif /* TIMEOUT_H */