forked from github/server
caching get_race() calls
This commit is contained in:
parent
c3dfbdea18
commit
22f64abaf2
|
@ -61,6 +61,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
/** external variables **/
|
/** external variables **/
|
||||||
race *races;
|
race *races;
|
||||||
int num_races = 0;
|
int num_races = 0;
|
||||||
|
static int cache_breaker;
|
||||||
|
|
||||||
static const char *racenames[MAXRACES] = {
|
static const char *racenames[MAXRACES] = {
|
||||||
"dwarf", "elf", NULL, "goblin", "human", "troll", "demon", "insect",
|
"dwarf", "elf", NULL, "goblin", "human", "troll", "demon", "insect",
|
||||||
|
@ -76,10 +77,23 @@ static const char *racenames[MAXRACES] = {
|
||||||
"clone"
|
"clone"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static race * race_cache[MAXRACES];
|
||||||
|
|
||||||
struct race *get_race(race_t rt) {
|
struct race *get_race(race_t rt) {
|
||||||
|
static int cache = -1;
|
||||||
|
if (cache_breaker != cache) {
|
||||||
|
cache = cache_breaker;
|
||||||
|
memset(race_cache, 0, sizeof(race_cache));
|
||||||
assert(rt < MAXRACES);
|
assert(rt < MAXRACES);
|
||||||
if (racenames[rt]) {
|
if (racenames[rt]) {
|
||||||
return rc_get_or_create(racenames[rt]);
|
return race_cache[rt] = rc_get_or_create(racenames[rt]);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
race * result = race_cache[rt];
|
||||||
|
if (!result) {
|
||||||
|
result = race_cache[rt] = rc_get_or_create(racenames[rt]);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -180,6 +194,7 @@ race *rc_get_or_create(const char *zName)
|
||||||
rc->attack[0].type = AT_COMBATSPELL;
|
rc->attack[0].type = AT_COMBATSPELL;
|
||||||
rc->attack[1].type = AT_NONE;
|
rc->attack[1].type = AT_NONE;
|
||||||
rc->index = num_races++;
|
rc->index = num_races++;
|
||||||
|
++cache_breaker;
|
||||||
rc->next = races;
|
rc->next = races;
|
||||||
return races = rc;
|
return races = rc;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue