mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2024-11-10 15:22:04 +00:00
[set] Make static init sets compatible with normal
When using SET_STATIC_INIT, the set size needs to be the same as what set_new() would create for the same number of bits, otherwise the set will possibly get resized incorrectly (which is bad news when the array was allocated using alloca). While this is really a symptom of set_bits_t not getting the right size, getting weird segfaults is not a good way to diagnose the problem, and set_bits_t being the wrong size is just a minor pessimism.
This commit is contained in:
parent
451a98d391
commit
d39f1307c5
1 changed files with 5 additions and 2 deletions
|
@ -51,6 +51,7 @@ typedef uint32_t set_bits_t;
|
|||
- sizeof (int) - sizeof (unsigned))\
|
||||
/ sizeof (set_bits_t))
|
||||
#define SET_BITS (sizeof (set_bits_t) * 8)
|
||||
#define SET_DEFMAP_BITS (SET_DEFMAP_SIZE * SET_BITS)
|
||||
//NOTE: x is the element number, so size is x + 1
|
||||
#define SET_SIZE(x) (((x) + SET_BITS) & ~(SET_BITS - 1))
|
||||
#define SET_WORDS_STATIC(x) (SET_SIZE (x) / SET_BITS)
|
||||
|
@ -63,9 +64,11 @@ typedef uint32_t set_bits_t;
|
|||
(((byte *)(s)->map)[(x) / 8] |= (SET_ONE << ((x) % 8)))
|
||||
#define SET_REMOVE(s, x) \
|
||||
(((byte *)(s)->map)[(x) / 8] &= ~(SET_ONE << ((x) % 8)))
|
||||
#define SET_LARGE_SET(x) (SET_SIZE (x) > SET_DEFMAP_BITS)
|
||||
#define SET_SAFE_SIZE(x) (SET_LARGE_SET (x) ? SET_SIZE (x) : SET_DEFMAP_BITS)
|
||||
#define SET_STATIC_INIT(x, alloc) { \
|
||||
.size = SET_SIZE (x), \
|
||||
.map = alloc (SET_SIZE (x) / 8), \
|
||||
.size = SET_SAFE_SIZE (x), \
|
||||
.map = alloc (SET_SAFE_SIZE (x) / 8), \
|
||||
}
|
||||
#define SET_STATIC_ARRAY(array) { \
|
||||
.size = 8 * __builtin_choose_expr ( \
|
||||
|
|
Loading…
Reference in a new issue