Replace the revolting build pointer data structure by a proper data

type.  Make it abstract because that's possible.  Change data layout
so that the slots belonging to a sector are together in memory, it's
nicer to the cache.
(bp): The new type.  Users changed.
(get_wp): Update accordingly.
(alloc_bp): New.
(update_main, calc_all): Use it.  Before, calc_all() allocated 1/7
more than necessary.
This commit is contained in:
Markus Armbruster 2007-01-13 09:07:59 +00:00
parent ac9cdf5bb9
commit 5507e8a1dc
13 changed files with 51 additions and 39 deletions

View file

@ -39,10 +39,11 @@
#define SCT_EFFIC (SCT_TYPE_MAX + 1) #define SCT_EFFIC (SCT_TYPE_MAX + 1)
void fill_update_array(int *bp, struct sctstr *sp); struct bp *alloc_bp(void);
int gt_bg_nmbr(int *bp, struct sctstr *sp, i_type comm); void fill_update_array(struct bp *, struct sctstr *);
void pt_bg_nmbr(int *bp, struct sctstr *sp, i_type comm, int amount); int gt_bg_nmbr(struct bp *, struct sctstr *, i_type);
int get_materials(struct sctstr *, int *, int *, int); void pt_bg_nmbr(struct bp *, struct sctstr *, i_type, int);
int get_materials(struct sctstr *, struct bp *, int *, int);
extern long money[MAXNOC]; extern long money[MAXNOC];
extern long pops[MAXNOC]; extern long pops[MAXNOC];

View file

@ -735,12 +735,12 @@ extern void finish_sects(int);
/* human.c */ /* human.c */
extern int new_work(struct sctstr *, int); extern int new_work(struct sctstr *, int);
extern int do_feed(struct sctstr *, struct natstr *, extern int do_feed(struct sctstr *, struct natstr *,
short *, int *, int *, int); short *, int *, struct bp *, int);
extern int feed_people(short *, int); extern int feed_people(short *, int);
extern double food_needed(short *, int); extern double food_needed(short *, int);
extern int famine_victims(short *, int); extern int famine_victims(short *, int);
/* land.c */ /* land.c */
extern int prod_land(int, int, int *, int); extern int prod_land(int, int, struct bp *, int);
/* main.c */ /* main.c */
/* in server.h */ /* in server.h */
/* material.c */ /* material.c */
@ -774,7 +774,7 @@ extern void *nxtitemp(struct nstr_item *);
extern void do_plague(struct sctstr *, struct natstr *, int); extern void do_plague(struct sctstr *, struct natstr *, int);
extern int plague_people(struct natstr *, short *, int *, int *, int); extern int plague_people(struct natstr *, short *, int *, int *, int);
/* plane.c */ /* plane.c */
extern int prod_plane(int, int, int *, int); extern int prod_plane(int, int, struct bp *, int);
/* populace.c */ /* populace.c */
extern void populace(struct natstr *, struct sctstr *, int); extern void populace(struct natstr *, struct sctstr *, int);
extern int total_work(int, int, int, int, int, int); extern int total_work(int, int, int, int, int, int);
@ -782,7 +782,7 @@ extern int total_work(int, int, int, int, int, int);
extern void tax(struct sctstr *, struct natstr *, int, long *, int *, extern void tax(struct sctstr *, struct natstr *, int, long *, int *,
int *, int *); int *, int *);
extern int upd_slmilcosts(natid, int); extern int upd_slmilcosts(natid, int);
extern void prepare_sects(int, int *); extern void prepare_sects(int, struct bp *);
extern int bank_income(struct sctstr *, int); extern int bank_income(struct sctstr *, int);
/* produce.c */ /* produce.c */
extern int produce(struct natstr *, struct sctstr *, short *, int, int, extern int produce(struct natstr *, struct sctstr *, short *, int, int,
@ -799,9 +799,9 @@ extern void sail_ship(natid);
extern void do_fallout(struct sctstr *, int); extern void do_fallout(struct sctstr *, int);
extern void spread_fallout(struct sctstr *, int); extern void spread_fallout(struct sctstr *, int);
extern void decay_fallout(struct sctstr *, int); extern void decay_fallout(struct sctstr *, int);
extern void produce_sect(int, int, int *, long [][2]); extern void produce_sect(int, int, struct bp *, long [][2]);
/* ship.c */ /* ship.c */
extern int prod_ship(int, int, int *, int); extern int prod_ship(int, int, struct bp *, int);
/* /*
* src/server * src/server

View file

@ -37,6 +37,7 @@
typedef unsigned char natid; /* NSC_NATID must match this */ typedef unsigned char natid; /* NSC_NATID must match this */
typedef short coord; typedef short coord;
struct bp;
struct emp_qelem; struct emp_qelem;
struct empobj; struct empobj;
struct lndstr; struct lndstr;

View file

@ -184,7 +184,7 @@ calc_all(long p_sect[][2],
int *planes, int *pbuild, int *npbuild, int *pmaint) int *planes, int *pbuild, int *npbuild, int *pmaint)
{ {
struct natstr *np; struct natstr *np;
int *bp; struct bp *bp;
long pop = 0; long pop = 0;
int n, civ_tax, uw_tax, mil_pay; int n, civ_tax, uw_tax, mil_pay;
struct sctstr *sp; struct sctstr *sp;
@ -197,7 +197,7 @@ calc_all(long p_sect[][2],
*planes = *pbuild = *npbuild = *pmaint = 0; *planes = *pbuild = *npbuild = *pmaint = 0;
np = getnatp(player->cnum); np = getnatp(player->cnum);
bp = calloc(WORLD_X * WORLD_Y * 8, sizeof(int)); bp = alloc_bp();
for (n = 0; NULL != (sp = getsectid(n)); n++) { for (n = 0; NULL != (sp = getsectid(n)); n++) {
fill_update_array(bp, sp); fill_update_array(bp, sp);
if (sp->sct_own == player->cnum) { if (sp->sct_own == player->cnum) {

View file

@ -29,6 +29,7 @@
* *
* Known contributors to this file: * Known contributors to this file:
* Ville Virrankoski, 1996 * Ville Virrankoski, 1996
* Markus Armbruster, 2007
*/ */
#include <config.h> #include <config.h>
@ -36,18 +37,21 @@
#include "budg.h" #include "budg.h"
#include "update.h" #include "update.h"
struct bp {
int val[7];
};
static int bud_key[I_MAX + 2] = static int bud_key[I_MAX + 2] =
{ 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 5, 6, 0, 0, 7 }; { 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 5, 6, 0, 0, 7 };
static int * static int *
get_wp(int *bp, struct sctstr *sp, int cm) get_wp(struct bp *bp, struct sctstr *sp, int cm)
{ {
return (bp + (sp->sct_x + (sp->sct_y * WORLD_X)) + return &bp[sp->sct_x + sp->sct_y * WORLD_X].val[cm - 1];
WORLD_X * WORLD_Y * (cm - 1));
} }
int int
gt_bg_nmbr(int *bp, struct sctstr *sp, i_type comm) gt_bg_nmbr(struct bp *bp, struct sctstr *sp, i_type comm)
{ {
int *wp; int *wp;
int cm; int cm;
@ -61,7 +65,7 @@ gt_bg_nmbr(int *bp, struct sctstr *sp, i_type comm)
} }
void void
pt_bg_nmbr(int *bp, struct sctstr *sp, i_type comm, int amount) pt_bg_nmbr(struct bp *bp, struct sctstr *sp, i_type comm, int amount)
{ {
int *wp; int *wp;
int cm; int cm;
@ -73,7 +77,7 @@ pt_bg_nmbr(int *bp, struct sctstr *sp, i_type comm, int amount)
} }
void void
fill_update_array(int *bp, struct sctstr *sp) fill_update_array(struct bp *bp, struct sctstr *sp)
{ {
int k; int k;
int *wp; int *wp;
@ -87,3 +91,9 @@ fill_update_array(int *bp, struct sctstr *sp)
wp = get_wp(bp, sp, bud_key[I_MAX + 1]); wp = get_wp(bp, sp, bud_key[I_MAX + 1]);
*wp = sp->sct_avail; *wp = sp->sct_avail;
} }
struct bp *
alloc_bp(void)
{
return calloc(WORLD_X * WORLD_Y, sizeof(struct bp));
}

View file

@ -55,7 +55,7 @@ static int babies(int, int, double, int, int);
*/ */
int int
do_feed(struct sctstr *sp, struct natstr *np, short *vec, do_feed(struct sctstr *sp, struct natstr *np, short *vec,
int *workp, int *bp, int etu) int *workp, struct bp *bp, int etu)
{ {
int work_avail; int work_avail;
int starved, sctwork; int starved, sctwork;

View file

@ -46,12 +46,12 @@
#include "update.h" #include "update.h"
#include <math.h> #include <math.h>
static void landrepair(struct lndstr *, struct natstr *, int *, int); static void landrepair(struct lndstr *, struct natstr *, struct bp *, int);
static void upd_land(struct lndstr *, int, struct natstr *, int *, int); static void upd_land(struct lndstr *, int, struct natstr *, struct bp *, int);
static int feed_land(struct lndstr *, int); static int feed_land(struct lndstr *, int);
int int
prod_land(int etus, int natnum, int *bp, int build) prod_land(int etus, int natnum, struct bp *bp, int build)
/* build = 1, maintain = 0 */ /* build = 1, maintain = 0 */
{ {
struct lndstr *lp; struct lndstr *lp;
@ -104,7 +104,7 @@ prod_land(int etus, int natnum, int *bp, int build)
static void static void
upd_land(struct lndstr *lp, int etus, upd_land(struct lndstr *lp, int etus,
struct natstr *np, int *bp, int build) struct natstr *np, struct bp *bp, int build)
/* build = 1, maintain = 0 */ /* build = 1, maintain = 0 */
{ {
struct lchrstr *lcp; struct lchrstr *lcp;
@ -214,7 +214,7 @@ upd_land(struct lndstr *lp, int etus,
} }
static void static void
landrepair(struct lndstr *land, struct natstr *np, int *bp, int etus) landrepair(struct lndstr *land, struct natstr *np, struct bp *bp, int etus)
{ {
int delta; int delta;
struct sctstr *sp; struct sctstr *sp;

View file

@ -58,7 +58,7 @@ update_main(void *unused)
int etu = etu_per_update; int etu = etu_per_update;
int n; int n;
int x; int x;
int *bp; struct bp *bp;
int cn, cn2, rel; int cn, cn2, rel;
struct natstr *cnp; struct natstr *cnp;
struct natstr *np; struct natstr *np;
@ -92,7 +92,7 @@ update_main(void *unused)
memset(air_money, 0, sizeof(air_money)); memset(air_money, 0, sizeof(air_money));
memset(sea_money, 0, sizeof(sea_money)); memset(sea_money, 0, sizeof(sea_money));
memset(lnd_money, 0, sizeof(lnd_money)); memset(lnd_money, 0, sizeof(lnd_money));
bp = calloc(WORLD_X * WORLD_Y * 7, sizeof(int)); bp = alloc_bp();
for (n = 0; n < MAXNOC; n++) { for (n = 0; n < MAXNOC; n++) {
money[n] = 0; money[n] = 0;
if (!(np = getnatp(n))) if (!(np = getnatp(n)))

View file

@ -48,7 +48,7 @@
* Return adjusted build percentage. * Return adjusted build percentage.
*/ */
int int
get_materials(struct sctstr *sp, int *bp, int *mvec, int pct) get_materials(struct sctstr *sp, struct bp *bp, int *mvec, int pct)
{ {
int i, amt; int i, amt;

View file

@ -42,11 +42,11 @@
#include "ship.h" #include "ship.h"
#include "update.h" #include "update.h"
static void planerepair(struct plnstr *, struct natstr *, int *, int); static void planerepair(struct plnstr *, struct natstr *, struct bp *, int);
static void upd_plane(struct plnstr *, int, struct natstr *, int *, int); static void upd_plane(struct plnstr *, int, struct natstr *, struct bp *, int);
int int
prod_plane(int etus, int natnum, int *bp, int buildem) prod_plane(int etus, int natnum, struct bp *bp, int buildem)
/* Build = 1, maintain =0 */ /* Build = 1, maintain =0 */
{ {
struct plnstr *pp; struct plnstr *pp;
@ -88,7 +88,7 @@ prod_plane(int etus, int natnum, int *bp, int buildem)
static void static void
upd_plane(struct plnstr *pp, int etus, upd_plane(struct plnstr *pp, int etus,
struct natstr *np, int *bp, int build) struct natstr *np, struct bp *bp, int build)
{ {
struct plchrstr *pcp = &plchr[(int)pp->pln_type]; struct plchrstr *pcp = &plchr[(int)pp->pln_type];
int mult, cost, eff; int mult, cost, eff;
@ -125,7 +125,7 @@ upd_plane(struct plnstr *pp, int etus,
} }
static void static void
planerepair(struct plnstr *pp, struct natstr *np, int *bp, int etus) planerepair(struct plnstr *pp, struct natstr *np, struct bp *bp, int etus)
{ {
int build; int build;
int mvec[I_MAX + 1]; int mvec[I_MAX + 1];

View file

@ -44,7 +44,7 @@
#include "update.h" #include "update.h"
void void
prepare_sects(int etu, int *bp) prepare_sects(int etu, struct bp *bp)
{ {
struct sctstr *sp; struct sctstr *sp;
struct natstr *np; struct natstr *np;

View file

@ -257,7 +257,7 @@ decay_fallout(struct sctstr *sp, int etus)
* Produce for a specific nation * Produce for a specific nation
*/ */
void void
produce_sect(int natnum, int etu, int *bp, long p_sect[][2]) produce_sect(int natnum, int etu, struct bp *bp, long p_sect[][2])
{ {
struct sctstr *sp; struct sctstr *sp;
struct natstr *np; struct natstr *np;

View file

@ -47,12 +47,12 @@
#include "ship.h" #include "ship.h"
#include "update.h" #include "update.h"
static void shiprepair(struct shpstr *, struct natstr *, int *, int); static void shiprepair(struct shpstr *, struct natstr *, struct bp *, int);
static void upd_ship(struct shpstr *, int, struct natstr *, int *, int); static void upd_ship(struct shpstr *, int, struct natstr *, struct bp *, int);
static int feed_ship(struct shpstr *, int); static int feed_ship(struct shpstr *, int);
int int
prod_ship(int etus, int natnum, int *bp, int build) prod_ship(int etus, int natnum, struct bp *bp, int build)
/* build = 1, maintain = 0 */ /* build = 1, maintain = 0 */
{ {
struct shpstr *sp; struct shpstr *sp;
@ -107,7 +107,7 @@ prod_ship(int etus, int natnum, int *bp, int build)
static void static void
upd_ship(struct shpstr *sp, int etus, upd_ship(struct shpstr *sp, int etus,
struct natstr *np, int *bp, int build) struct natstr *np, struct bp *bp, int build)
/* build = 1, maintain = 0 */ /* build = 1, maintain = 0 */
{ {
struct sctstr *sectp; struct sctstr *sectp;
@ -266,7 +266,7 @@ upd_ship(struct shpstr *sp, int etus,
* 8 * 8 * $40 = $2560! * 8 * 8 * $40 = $2560!
*/ */
static void static void
shiprepair(struct shpstr *ship, struct natstr *np, int *bp, int etus) shiprepair(struct shpstr *ship, struct natstr *np, struct bp *bp, int etus)
{ {
int delta; int delta;
struct sctstr *sp; struct sctstr *sp;