From: Ralph Corderoy Date: Fri, 28 Apr 2017 11:45:26 +0000 (+0100) Subject: sbr/vector.c: Only allocate bvector storage for set bits. X-Git-Url: https://diplodocus.org/git/nmh/commitdiff_plain/4d3c5111a2a7716e957547cb80a1efe7accabf6f sbr/vector.c: Only allocate bvector storage for set bits. Now that a pointer to all the bit storage doesn't escape vector.c, there's no need to allocate storage, that's initialised to 0, just to then clear a bit in it. Only extend the bits's storage for set bits. Remove the unused initial size parameter from bvector_create() as it simplifies the implementation. --- diff --git a/h/mh.h b/h/mh.h index 1edf4822..0a62f586 100644 --- a/h/mh.h +++ b/h/mh.h @@ -192,7 +192,7 @@ extern struct swit anoyes[]; /* standard yes/no switches */ */ typedef struct bvector *bvector_t; -bvector_t bvector_create (size_t /* initial size in bits, can be 0 */); +bvector_t bvector_create (void); void bvector_copy (bvector_t, bvector_t); void bvector_free (bvector_t); void bvector_clear (bvector_t, size_t); @@ -329,7 +329,7 @@ struct msgs { #define make_seq_private(mp,seqnum) \ bvector_set (mp->attrstats, FFATTRSLOT + seqnum) #define make_all_public(mp) \ - mp->attrstats = bvector_create(0); bvector_clear_all (mp->attrstats) + mp->attrstats = bvector_create(); bvector_clear_all (mp->attrstats) /* * macros for folder attributes diff --git a/sbr/folder_read.c b/sbr/folder_read.c index e742153c..e157dd25 100644 --- a/sbr/folder_read.c +++ b/sbr/folder_read.c @@ -136,7 +136,7 @@ folder_read (char *name, int lockflag) mp->num_msgstats = MSGSTATNUM (mp->lowoff, mp->hghoff); mp->msgstats = mh_xmalloc (MSGSTATSIZE(mp)); for (i = 0, v = mp->msgstats; i < mp->num_msgstats; ++i, ++v) { - *v = bvector_create (0); + *v = bvector_create (); } mp->msgattrs = svector_create (0); diff --git a/sbr/folder_realloc.c b/sbr/folder_realloc.c index fbef8549..2084e0ee 100644 --- a/sbr/folder_realloc.c +++ b/sbr/folder_realloc.c @@ -58,7 +58,7 @@ folder_realloc (struct msgs *mp, int lo, int hi) mh_xrealloc (mp->msgstats, MSGSTATSIZE(mp)); for (i = old_size, v = &mp->msgstats[old_size]; i < new_size; ++i, ++v) { - *v = bvector_create (0); + *v = bvector_create (); } } else { /* @@ -72,7 +72,7 @@ folder_realloc (struct msgs *mp, int lo, int hi) mp->num_msgstats = MSGSTATNUM (lo, hi); tmpstats = mh_xmalloc (MSGSTATSIZE(mp)); for (i = 0, t = tmpstats; i < mp->num_msgstats; ++i, ++t) { - *t = bvector_create (0); + *t = bvector_create (); } /* then copy messages status array with shift */ diff --git a/sbr/vector.c b/sbr/vector.c index b7103b79..e3760651 100644 --- a/sbr/vector.c +++ b/sbr/vector.c @@ -60,25 +60,16 @@ struct bvector { static void bvector_resize (bvector_t vec, size_t newsize); bvector_t -bvector_create (size_t init_size) { +bvector_create (void) { bvector_t vec; - size_t bytes; /* See "wider than unsigned long" comment above. */ assert (sizeof *vec->bits <= sizeof 1ul); NEW(vec); - - if (init_size <= BVEC_INIT_SIZE) { - vec->bits = vec->tiny; - vec->maxsize = BVEC_INIT_SIZE; - memset(vec->tiny, 0, sizeof vec->tiny); - return vec; - } - - bytes = BVEC_BYTES(init_size); - vec->bits = mh_xcalloc (1, bytes); - vec->maxsize = bytes * CHAR_BIT; + vec->bits = vec->tiny; + vec->maxsize = BVEC_INIT_SIZE; + memset(vec->tiny, 0, sizeof vec->tiny); return vec; } @@ -103,13 +94,8 @@ bvector_free (bvector_t vec) { void bvector_clear (bvector_t vec, size_t n) { - size_t word = BVEC_WORD(n); - size_t offset = BVEC_OFFSET(n); - - if (n >= vec->maxsize) - bvector_resize (vec, n); - - vec->bits[word] &= ~(1ul << offset); + if (n < vec->maxsize) + vec->bits[BVEC_WORD(n)] &= ~(1ul << BVEC_OFFSET(n)); } @@ -131,12 +117,10 @@ bvector_set (bvector_t vec, size_t n) { unsigned int bvector_at (bvector_t vec, size_t i) { - size_t word = BVEC_WORD(i); - size_t offset = BVEC_OFFSET(i); + if (i < vec->maxsize) + return !!(vec->bits[BVEC_WORD(i)] & (1ul << BVEC_OFFSET(i))); - return i < vec->maxsize - ? (vec->bits[word] & (1ul << offset) ? 1 : 0) - : 0; + return 0; } static void diff --git a/uip/sortm.c b/uip/sortm.c index f07e7863..4f5602fe 100644 --- a/uip/sortm.c +++ b/uip/sortm.c @@ -540,7 +540,7 @@ static void rename_msgs (struct msgs *mp, struct smsg **mlist) { int i, j, old, new; - bvector_t tmpset = bvector_create (0); + bvector_t tmpset = bvector_create (); char f1[BUFSIZ], tmpfil[BUFSIZ]; char newbuf[PATH_MAX + 1]; struct smsg *sp;