]> git.proxmox.com Git - rustc.git/blobdiff - src/jemalloc/src/bitmap.c
Imported Upstream version 1.9.0+dfsg1
[rustc.git] / src / jemalloc / src / bitmap.c
index c733372b4cb2f47fcbe1b49628a00b20fc26cde6..b1e66271e67889ff04d19d242bf210d5df372db9 100644 (file)
@@ -3,6 +3,8 @@
 
 /******************************************************************************/
 
+#ifdef USE_TREE
+
 void
 bitmap_info_init(bitmap_info_t *binfo, size_t nbits)
 {
@@ -32,20 +34,11 @@ bitmap_info_init(bitmap_info_t *binfo, size_t nbits)
        binfo->nbits = nbits;
 }
 
-size_t
+static size_t
 bitmap_info_ngroups(const bitmap_info_t *binfo)
 {
 
-       return (binfo->levels[binfo->nlevels].group_offset << LG_SIZEOF_BITMAP);
-}
-
-size_t
-bitmap_size(size_t nbits)
-{
-       bitmap_info_t binfo;
-
-       bitmap_info_init(&binfo, nbits);
-       return (bitmap_info_ngroups(&binfo));
+       return (binfo->levels[binfo->nlevels].group_offset);
 }
 
 void
@@ -61,8 +54,7 @@ bitmap_init(bitmap_t *bitmap, const bitmap_info_t *binfo)
         * correspond to the first logical bit in the group, so extra bits
         * are the most significant bits of the last group.
         */
-       memset(bitmap, 0xffU, binfo->levels[binfo->nlevels].group_offset <<
-           LG_SIZEOF_BITMAP);
+       memset(bitmap, 0xffU, bitmap_size(binfo));
        extra = (BITMAP_GROUP_NBITS - (binfo->nbits & BITMAP_GROUP_NBITS_MASK))
            & BITMAP_GROUP_NBITS_MASK;
        if (extra != 0)
@@ -76,3 +68,47 @@ bitmap_init(bitmap_t *bitmap, const bitmap_info_t *binfo)
                        bitmap[binfo->levels[i+1].group_offset - 1] >>= extra;
        }
 }
+
+#else /* USE_TREE */
+
+void
+bitmap_info_init(bitmap_info_t *binfo, size_t nbits)
+{
+       size_t i;
+
+       assert(nbits > 0);
+       assert(nbits <= (ZU(1) << LG_BITMAP_MAXBITS));
+
+       i = nbits >> LG_BITMAP_GROUP_NBITS;
+       if (nbits % BITMAP_GROUP_NBITS != 0)
+               i++;
+       binfo->ngroups = i;
+       binfo->nbits = nbits;
+}
+
+static size_t
+bitmap_info_ngroups(const bitmap_info_t *binfo)
+{
+
+       return (binfo->ngroups);
+}
+
+void
+bitmap_init(bitmap_t *bitmap, const bitmap_info_t *binfo)
+{
+       size_t extra;
+
+       memset(bitmap, 0xffU, bitmap_size(binfo));
+       extra = (binfo->nbits % (binfo->ngroups * BITMAP_GROUP_NBITS));
+       if (extra != 0)
+               bitmap[binfo->ngroups - 1] >>= (BITMAP_GROUP_NBITS - extra);
+}
+
+#endif /* USE_TREE */
+
+size_t
+bitmap_size(const bitmap_info_t *binfo)
+{
+
+       return (bitmap_info_ngroups(binfo) << LG_SIZEOF_BITMAP);
+}