[DO_EFF_MEM_CHECKING]: Dead for some ten years. Bury.
This commit is contained in:
parent
590cfe674a
commit
8f40f5ad6d
1 changed files with 15 additions and 172 deletions
|
@ -25,9 +25,8 @@
|
||||||
*
|
*
|
||||||
* ---
|
* ---
|
||||||
*
|
*
|
||||||
* path.c: Empire/A* Interface code. Provides callbacks for A* code and
|
* path.c: Empire/A* Interface code.
|
||||||
* a sector cache to speed things up. Define BP_STATS for sector
|
* Define AS_STATS for A* statistics.
|
||||||
* cache statistics, AS_STATS for A* statistics.
|
|
||||||
*
|
*
|
||||||
* Known contributors to this file:
|
* Known contributors to this file:
|
||||||
* Phil Lapsley, 1991
|
* Phil Lapsley, 1991
|
||||||
|
@ -48,52 +47,16 @@
|
||||||
#include "gen.h"
|
#include "gen.h"
|
||||||
#include "optlist.h"
|
#include "optlist.h"
|
||||||
|
|
||||||
/* STM - The server is now reliant on the sector file being
|
|
||||||
* memory mapped for other things. So, this code has been
|
|
||||||
* setup to have the sector hashing #ifdef'd instead so that
|
|
||||||
* we don't have to do runtime checking. If someone moves
|
|
||||||
* the sector file to me non-memory mapped, they have larger
|
|
||||||
* problems than this, and can just turn this back on. Then
|
|
||||||
* again, their performance will be so bad going to a file
|
|
||||||
* all the time, it won't matter. */
|
|
||||||
|
|
||||||
/*#define DO_EFF_MEM_CHECKING*/
|
|
||||||
|
|
||||||
|
|
||||||
/* XXX won't need sector hash when sect file is memory mapped */
|
|
||||||
|
|
||||||
#define BP_SCTHASHSIZE 128 /* sector cache hash table size */
|
|
||||||
#define BP_ASHASHSIZE 128 /* A* queue hash table size */
|
#define BP_ASHASHSIZE 128 /* A* queue hash table size */
|
||||||
#define BP_NEIGHBORS 6 /* max number of neighbors */
|
#define BP_NEIGHBORS 6 /* max number of neighbors */
|
||||||
|
|
||||||
#ifdef DO_EFF_MEM_CHECKING
|
|
||||||
struct sctcache {
|
|
||||||
coord x, y;
|
|
||||||
struct sctstr *sp;
|
|
||||||
struct sctcache *next;
|
|
||||||
};
|
|
||||||
#endif /* DO_EFF_MEM_CHECKING */
|
|
||||||
|
|
||||||
struct bestp {
|
struct bestp {
|
||||||
#ifdef DO_EFF_MEM_CHECKING
|
|
||||||
struct sctcache *sctcachetab[BP_SCTHASHSIZE];
|
|
||||||
#endif
|
|
||||||
int sctcache_hits;
|
int sctcache_hits;
|
||||||
int sctcache_misses;
|
int sctcache_misses;
|
||||||
int bp_mobtype;
|
int bp_mobtype;
|
||||||
struct as_data *adp;
|
struct as_data *adp;
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef DO_EFF_MEM_CHECKING
|
|
||||||
|
|
||||||
static struct sctstr *bp_getsect(struct bestp *bp, coord x, coord y);
|
|
||||||
static struct sctstr *bp_sctcache_get(struct bestp *bp, coord x, coord y);
|
|
||||||
static void bp_sctcache_set(struct bestp *bp, coord x, coord y,
|
|
||||||
struct sctstr *sp);
|
|
||||||
static void bp_sctcache_zap(struct bestp *bp);
|
|
||||||
|
|
||||||
#endif /* DO_EFF_MEM_CHECKING */
|
|
||||||
|
|
||||||
static int bp_path(struct as_path *pp, s_char *buf);
|
static int bp_path(struct as_path *pp, s_char *buf);
|
||||||
static int bp_neighbors(struct as_coord c, struct as_coord *cp,
|
static int bp_neighbors(struct as_coord c, struct as_coord *cp,
|
||||||
s_char *pp);
|
s_char *pp);
|
||||||
|
@ -150,9 +113,6 @@ best_path(struct sctstr *from, struct sctstr *to, s_char *path,
|
||||||
if (mybestpath == 0)
|
if (mybestpath == 0)
|
||||||
mybestpath = (struct bestp *)bp_init();
|
mybestpath = (struct bestp *)bp_init();
|
||||||
adp = mybestpath->adp;
|
adp = mybestpath->adp;
|
||||||
#ifdef DO_EFF_MEM_CHECKING
|
|
||||||
bp_sctcache_zap(mybestpath);
|
|
||||||
#endif
|
|
||||||
ap = as_find_cachepath(from->sct_x, from->sct_y, to->sct_x, to->sct_y);
|
ap = as_find_cachepath(from->sct_x, from->sct_y, to->sct_x, to->sct_y);
|
||||||
if (ap == NULL) {
|
if (ap == NULL) {
|
||||||
adp->from.x = from->sct_x;
|
adp->from.x = from->sct_x;
|
||||||
|
@ -228,9 +188,6 @@ bp_path(struct as_path *pp, s_char *buf)
|
||||||
static int
|
static int
|
||||||
bp_neighbors(struct as_coord c, struct as_coord *cp, s_char *pp)
|
bp_neighbors(struct as_coord c, struct as_coord *cp, s_char *pp)
|
||||||
{
|
{
|
||||||
#ifdef DO_EFF_MEM_CHECKING
|
|
||||||
struct bestp *bp = (struct bestp *)pp;
|
|
||||||
#endif /* DO_EFF_MEM_CHECKING */
|
|
||||||
coord x, y;
|
coord x, y;
|
||||||
coord nx, ny;
|
coord nx, ny;
|
||||||
int n = 0, q;
|
int n = 0, q;
|
||||||
|
@ -241,18 +198,10 @@ bp_neighbors(struct as_coord c, struct as_coord *cp, s_char *pp)
|
||||||
|
|
||||||
x = c.x;
|
x = c.x;
|
||||||
y = c.y;
|
y = c.y;
|
||||||
#ifdef DO_EFF_MEM_CHECKING
|
sx = XNORM(x);
|
||||||
if ((ep->flags & EFF_MEM) == 0) {
|
sy = YNORM(y);
|
||||||
from = bp_getsect(bp, x, y);
|
offset = (sy * WORLD_X + sx) / 2;
|
||||||
} else {
|
from = (struct sctstr *)(ep->cache + ep->size * offset);
|
||||||
#endif /* DO_EFF_MEM_CHECKING */
|
|
||||||
sx = XNORM(x);
|
|
||||||
sy = YNORM(y);
|
|
||||||
offset = (sy * WORLD_X + sx) / 2;
|
|
||||||
from = (struct sctstr *)(ep->cache + ep->size * offset);
|
|
||||||
#ifdef DO_EFF_MEM_CHECKING
|
|
||||||
}
|
|
||||||
#endif /* DO_EFF_MEM_CHECKING */
|
|
||||||
|
|
||||||
if (neighsects == (struct sctstr **)0)
|
if (neighsects == (struct sctstr **)0)
|
||||||
ssp = (struct sctstr **)&tsp[0];
|
ssp = (struct sctstr **)&tsp[0];
|
||||||
|
@ -265,19 +214,9 @@ bp_neighbors(struct as_coord c, struct as_coord *cp, s_char *pp)
|
||||||
ny = y + diroff[q][1];
|
ny = y + diroff[q][1];
|
||||||
sx = XNORM(nx);
|
sx = XNORM(nx);
|
||||||
sy = YNORM(ny);
|
sy = YNORM(ny);
|
||||||
#ifdef DO_EFF_MEM_CHECKING
|
offset = (sy * WORLD_X + sx) / 2;
|
||||||
if ((ep->flags & EFF_MEM) == 0) {
|
sp = (struct sctstr *)(ep->cache + ep->size * offset);
|
||||||
sp = bp_getsect(bp, nx, ny);
|
*ssp = sp;
|
||||||
} else {
|
|
||||||
#endif /* DO_EFF_MEM_CHECKING */
|
|
||||||
offset = (sy * WORLD_X + sx) / 2;
|
|
||||||
sp = (struct sctstr *)(ep->cache + ep->size * offset);
|
|
||||||
/* We can only save in our neighbor cache if the
|
|
||||||
sector file is in memory */
|
|
||||||
*ssp = sp;
|
|
||||||
#ifdef DO_EFF_MEM_CHECKING
|
|
||||||
}
|
|
||||||
#endif /* DO_EFF_MEM_CHECKING */
|
|
||||||
} else {
|
} else {
|
||||||
sp = *ssp;
|
sp = *ssp;
|
||||||
sx = XNORM(sp->sct_x);
|
sx = XNORM(sp->sct_x);
|
||||||
|
@ -308,20 +247,12 @@ bp_lbcost(struct as_coord from, struct as_coord to, s_char *pp)
|
||||||
float cost;
|
float cost;
|
||||||
int x, y, sx, sy, offset;
|
int x, y, sx, sy, offset;
|
||||||
|
|
||||||
#ifdef DO_EFF_MEM_CHECKING
|
x = to.x;
|
||||||
if ((ep->flags & EFF_MEM) == 0) {
|
y = to.y;
|
||||||
ts = bp_getsect(bp, (coord)to.x, (coord)to.y);
|
sx = XNORM(x);
|
||||||
} else {
|
sy = YNORM(y);
|
||||||
#endif /* DO_EFF_MEM_CHECKING */
|
offset = (sy * WORLD_X + sx) / 2;
|
||||||
x = to.x;
|
ts = (struct sctstr *)(ep->cache + ep->size * offset);
|
||||||
y = to.y;
|
|
||||||
sx = XNORM(x);
|
|
||||||
sy = YNORM(y);
|
|
||||||
offset = (sy * WORLD_X + sx) / 2;
|
|
||||||
ts = (struct sctstr *)(ep->cache + ep->size * offset);
|
|
||||||
#ifdef DO_EFF_MEM_CHECKING
|
|
||||||
}
|
|
||||||
#endif /* DO_EFF_MEM_CHECKING */
|
|
||||||
cost = sector_mcost(ts, bp->bp_mobtype);
|
cost = sector_mcost(ts, bp->bp_mobtype);
|
||||||
return (cost);
|
return (cost);
|
||||||
}
|
}
|
||||||
|
@ -347,94 +278,6 @@ bp_seccost(struct as_coord from, struct as_coord to, s_char *pp)
|
||||||
(coord)to.x, (coord)to.y));
|
(coord)to.x, (coord)to.y));
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DO_EFF_MEM_CHECKING
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get a sector from the cache. If it's not in the cache,
|
|
||||||
* get it from disk and add it to the cache.
|
|
||||||
*/
|
|
||||||
static struct sctstr *
|
|
||||||
bp_getsect(struct bestp *bp, coord x, coord y)
|
|
||||||
{
|
|
||||||
struct sctstr *sp;
|
|
||||||
|
|
||||||
sp = bp_sctcache_get(bp, x, y);
|
|
||||||
if (sp == NULL) {
|
|
||||||
sp = (struct sctstr *)malloc(sizeof(*sp));
|
|
||||||
getsect(x, y, sp);
|
|
||||||
bp_sctcache_set(bp, x, y, sp);
|
|
||||||
bp->sctcache_misses++;
|
|
||||||
} else {
|
|
||||||
bp->sctcache_hits++;
|
|
||||||
}
|
|
||||||
return (sp);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get a sector from the cache; return NULL if it's not there.
|
|
||||||
*/
|
|
||||||
static struct sctstr *
|
|
||||||
bp_sctcache_get(struct bestp *bp, coord x, coord y)
|
|
||||||
{
|
|
||||||
int hashval;
|
|
||||||
struct as_coord c;
|
|
||||||
struct sctcache *hp;
|
|
||||||
|
|
||||||
c.x = x;
|
|
||||||
c.y = y;
|
|
||||||
hashval = bp_coord_hash(c) % BP_SCTHASHSIZE;
|
|
||||||
for (hp = bp->sctcachetab[hashval]; hp; hp = hp->next) {
|
|
||||||
if (hp->x == x && hp->y == y)
|
|
||||||
return (hp->sp);
|
|
||||||
}
|
|
||||||
return (NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Put a sector in the cache.
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
bp_sctcache_set(struct bestp *bp, coord x, coord y, struct sctstr *sp)
|
|
||||||
{
|
|
||||||
int hashval;
|
|
||||||
struct as_coord c;
|
|
||||||
struct sctcache *hp;
|
|
||||||
|
|
||||||
hp = (struct sctcache *)calloc(1, sizeof(*hp));
|
|
||||||
hp->x = x;
|
|
||||||
hp->y = y;
|
|
||||||
hp->sp = sp;
|
|
||||||
c.x = x;
|
|
||||||
c.y = y;
|
|
||||||
hashval = bp_coord_hash(c) % BP_SCTHASHSIZE;
|
|
||||||
hp->next = bp->sctcachetab[hashval];
|
|
||||||
bp->sctcachetab[hashval] = hp;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Zap the cache and reset statistics.
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
bp_sctcache_zap(struct bestp *bp)
|
|
||||||
{
|
|
||||||
register struct sctcache *hp;
|
|
||||||
register struct sctcache *np;
|
|
||||||
register int i;
|
|
||||||
|
|
||||||
for (i = 0; i < BP_SCTHASHSIZE; i++) {
|
|
||||||
for (hp = bp->sctcachetab[i]; hp; hp = np) {
|
|
||||||
np = hp->next;
|
|
||||||
free(hp->sp);
|
|
||||||
free(hp);
|
|
||||||
}
|
|
||||||
bp->sctcachetab[i] = NULL;
|
|
||||||
}
|
|
||||||
bp->sctcache_hits = 0;
|
|
||||||
bp->sctcache_misses = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* DO_EFF_MEM_CHECKING */
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Hash a coordinate into an integer.
|
* Hash a coordinate into an integer.
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue