]> git.proxmox.com Git - rustc.git/blobdiff - src/jemalloc/include/jemalloc/internal/extent.h
Imported Upstream version 1.9.0+dfsg1
[rustc.git] / src / jemalloc / include / jemalloc / internal / extent.h
index 5b00076f26d2c644f836424eef4716d856d003fa..386d50ef4cd5eda34cfb0bb232c8484163c7eeee 100644 (file)
@@ -7,28 +7,53 @@ typedef struct extent_node_s extent_node_t;
 /******************************************************************************/
 #ifdef JEMALLOC_H_STRUCTS
 
-/* Tree of extents. */
+/* Tree of extents.  Use accessor functions for en_* fields. */
 struct extent_node_s {
-       /* Linkage for the size/address-ordered tree. */
-       rb_node(extent_node_t)  link_szad;
+       /* Arena from which this extent came, if any. */
+       arena_t                 *en_arena;
 
-       /* Linkage for the address-ordered tree. */
-       rb_node(extent_node_t)  link_ad;
+       /* Pointer to the extent that this tree node is responsible for. */
+       void                    *en_addr;
+
+       /* Total region size. */
+       size_t                  en_size;
+
+       /*
+        * The zeroed flag is used by chunk recycling code to track whether
+        * memory is zero-filled.
+        */
+       bool                    en_zeroed;
+
+       /*
+        * True if physical memory is committed to the extent, whether
+        * explicitly or implicitly as on a system that overcommits and
+        * satisfies physical memory needs on demand via soft page faults.
+        */
+       bool                    en_committed;
+
+       /*
+        * The achunk flag is used to validate that huge allocation lookups
+        * don't return arena chunks.
+        */
+       bool                    en_achunk;
 
        /* Profile counters, used for huge objects. */
-       prof_tctx_t             *prof_tctx;
+       prof_tctx_t             *en_prof_tctx;
 
-       /* Pointer to the extent that this tree node is responsible for. */
-       void                    *addr;
+       /* Linkage for arena's runs_dirty and chunks_cache rings. */
+       arena_runs_dirty_link_t rd;
+       qr(extent_node_t)       cc_link;
 
-       /* Total region size. */
-       size_t                  size;
+       union {
+               /* Linkage for the size/address-ordered tree. */
+               rb_node(extent_node_t)  szad_link;
 
-       /* Arena from which this extent came, if any */
-       arena_t                 *arena;
+               /* Linkage for arena's huge and node_cache lists. */
+               ql_elm(extent_node_t)   ql_link;
+       };
 
-       /* True if zero-filled; used by chunk recycling code. */
-       bool                    zeroed;
+       /* Linkage for the address-ordered tree. */
+       rb_node(extent_node_t)  ad_link;
 };
 typedef rb_tree(extent_node_t) extent_tree_t;
 
@@ -44,6 +69,171 @@ rb_proto(, extent_tree_ad_, extent_tree_t, extent_node_t)
 /******************************************************************************/
 #ifdef JEMALLOC_H_INLINES
 
+#ifndef JEMALLOC_ENABLE_INLINE
+arena_t        *extent_node_arena_get(const extent_node_t *node);
+void   *extent_node_addr_get(const extent_node_t *node);
+size_t extent_node_size_get(const extent_node_t *node);
+bool   extent_node_zeroed_get(const extent_node_t *node);
+bool   extent_node_committed_get(const extent_node_t *node);
+bool   extent_node_achunk_get(const extent_node_t *node);
+prof_tctx_t    *extent_node_prof_tctx_get(const extent_node_t *node);
+void   extent_node_arena_set(extent_node_t *node, arena_t *arena);
+void   extent_node_addr_set(extent_node_t *node, void *addr);
+void   extent_node_size_set(extent_node_t *node, size_t size);
+void   extent_node_zeroed_set(extent_node_t *node, bool zeroed);
+void   extent_node_committed_set(extent_node_t *node, bool committed);
+void   extent_node_achunk_set(extent_node_t *node, bool achunk);
+void   extent_node_prof_tctx_set(extent_node_t *node, prof_tctx_t *tctx);
+void   extent_node_init(extent_node_t *node, arena_t *arena, void *addr,
+    size_t size, bool zeroed, bool committed);
+void   extent_node_dirty_linkage_init(extent_node_t *node);
+void   extent_node_dirty_insert(extent_node_t *node,
+    arena_runs_dirty_link_t *runs_dirty, extent_node_t *chunks_dirty);
+void   extent_node_dirty_remove(extent_node_t *node);
+#endif
+
+#if (defined(JEMALLOC_ENABLE_INLINE) || defined(JEMALLOC_EXTENT_C_))
+JEMALLOC_INLINE arena_t *
+extent_node_arena_get(const extent_node_t *node)
+{
+
+       return (node->en_arena);
+}
+
+JEMALLOC_INLINE void *
+extent_node_addr_get(const extent_node_t *node)
+{
+
+       return (node->en_addr);
+}
+
+JEMALLOC_INLINE size_t
+extent_node_size_get(const extent_node_t *node)
+{
+
+       return (node->en_size);
+}
+
+JEMALLOC_INLINE bool
+extent_node_zeroed_get(const extent_node_t *node)
+{
+
+       return (node->en_zeroed);
+}
+
+JEMALLOC_INLINE bool
+extent_node_committed_get(const extent_node_t *node)
+{
+
+       assert(!node->en_achunk);
+       return (node->en_committed);
+}
+
+JEMALLOC_INLINE bool
+extent_node_achunk_get(const extent_node_t *node)
+{
+
+       return (node->en_achunk);
+}
+
+JEMALLOC_INLINE prof_tctx_t *
+extent_node_prof_tctx_get(const extent_node_t *node)
+{
+
+       return (node->en_prof_tctx);
+}
+
+JEMALLOC_INLINE void
+extent_node_arena_set(extent_node_t *node, arena_t *arena)
+{
+
+       node->en_arena = arena;
+}
+
+JEMALLOC_INLINE void
+extent_node_addr_set(extent_node_t *node, void *addr)
+{
+
+       node->en_addr = addr;
+}
+
+JEMALLOC_INLINE void
+extent_node_size_set(extent_node_t *node, size_t size)
+{
+
+       node->en_size = size;
+}
+
+JEMALLOC_INLINE void
+extent_node_zeroed_set(extent_node_t *node, bool zeroed)
+{
+
+       node->en_zeroed = zeroed;
+}
+
+JEMALLOC_INLINE void
+extent_node_committed_set(extent_node_t *node, bool committed)
+{
+
+       node->en_committed = committed;
+}
+
+JEMALLOC_INLINE void
+extent_node_achunk_set(extent_node_t *node, bool achunk)
+{
+
+       node->en_achunk = achunk;
+}
+
+JEMALLOC_INLINE void
+extent_node_prof_tctx_set(extent_node_t *node, prof_tctx_t *tctx)
+{
+
+       node->en_prof_tctx = tctx;
+}
+
+JEMALLOC_INLINE void
+extent_node_init(extent_node_t *node, arena_t *arena, void *addr, size_t size,
+    bool zeroed, bool committed)
+{
+
+       extent_node_arena_set(node, arena);
+       extent_node_addr_set(node, addr);
+       extent_node_size_set(node, size);
+       extent_node_zeroed_set(node, zeroed);
+       extent_node_committed_set(node, committed);
+       extent_node_achunk_set(node, false);
+       if (config_prof)
+               extent_node_prof_tctx_set(node, NULL);
+}
+
+JEMALLOC_INLINE void
+extent_node_dirty_linkage_init(extent_node_t *node)
+{
+
+       qr_new(&node->rd, rd_link);
+       qr_new(node, cc_link);
+}
+
+JEMALLOC_INLINE void
+extent_node_dirty_insert(extent_node_t *node,
+    arena_runs_dirty_link_t *runs_dirty, extent_node_t *chunks_dirty)
+{
+
+       qr_meld(runs_dirty, &node->rd, rd_link);
+       qr_meld(chunks_dirty, node, cc_link);
+}
+
+JEMALLOC_INLINE void
+extent_node_dirty_remove(extent_node_t *node)
+{
+
+       qr_remove(&node->rd, rd_link);
+       qr_remove(node, cc_link);
+}
+
+#endif
+
 #endif /* JEMALLOC_H_INLINES */
 /******************************************************************************/