--- deliantra/server/common/shstr.C 2007/10/22 05:46:44 1.27 +++ deliantra/server/common/shstr.C 2008/04/11 21:09:52 1.29 @@ -1,9 +1,9 @@ /* - * This file is part of Crossfire TRT, the Roguelike Realtime MORPG. + * This file is part of Deliantra, the Roguelike Realtime MMORPG. * - * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team + * Copyright (©) 2005,2006,2007,2008 Marc Alexander Lehmann / Robin Redeker / the Deliantra team * - * Crossfire TRT is free software: you can redistribute it and/or modify + * Deliantra is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . * - * The authors can be reached via e-mail to + * The authors can be reached via e-mail to */ /* @@ -35,6 +35,7 @@ typedef std::tr1::unordered_set , true> HT; static HT ht; +static int next_gc; static const char * makevec (const char *s) @@ -85,6 +86,7 @@ return found; } + --next_gc; s = makevec (s); ht.insert (s); return s; @@ -95,6 +97,9 @@ void shstr::gc () { + if (expect_true (next_gc > 0)) + return; + static const char *curpos; auto (i, curpos ? ht.find (curpos) : ht.begin ()); @@ -103,6 +108,7 @@ i = ht.begin (); int n = ht.size () / 256 + 16; + next_gc += n >> 1; for (;;) {