[Libreoffice-commits] core.git: include/rtl sal/rtl

Stephan Bergmann sbergman at redhat.com
Wed May 16 06:38:37 UTC 2018


 include/rtl/alloc.h     |    2 -
 sal/rtl/alloc_arena.cxx |   88 ++----------------------------------------------
 sal/rtl/alloc_arena.hxx |    1 
 sal/rtl/alloc_cache.cxx |   17 +--------
 sal/rtl/alloc_impl.hxx  |    1 
 5 files changed, 8 insertions(+), 101 deletions(-)

New commits:
commit 6da400912e8c69ae86650e799767da54ee422392
Author: Stephan Bergmann <sbergman at redhat.com>
Date:   Mon Jan 1 15:01:35 2018 +0100

    [API CHANGE] Remove no longer working rtl_arena -> rtl_cache feature
    
    rtl_arena_create's quantum_cache_max parameter (when non-zero) would have
    allowed an rtl_arena to internally use an rtl_cache for chunk allocation.  (And
    none of the LO-internal uses of rtl_arena_create makes use of that.)
    
    However, with the combination of old ce906b8096081dee15dc8cc96e570d5b0b587955
    "skip tricky allocators on G_SLICE=always-malloc" and recent
    bc6a5d8e79e7d0e7d75ac107aa8e6aa275e434e9 "Disable custom allocator", rtl_cache
    unconditionally just uses malloc/free now, so the rtl_arena_create
    quantum_cache_max feature has effectively become irrelevant.  As those changes
    appear to have no negative consequences overall (and help remove quite a chunk
    of no-longer used code), leave it at that and officially abandon the
    quantum_cache_max feature.
    
    Change-Id: I7d186a4a1589db6a73059c2be164aa81d81aef47
    Reviewed-on: https://gerrit.libreoffice.org/54388
    Reviewed-by: Stephan Bergmann <sbergman at redhat.com>
    Tested-by: Stephan Bergmann <sbergman at redhat.com>

diff --git a/include/rtl/alloc.h b/include/rtl/alloc.h
index 9f8dfc1f992e..a55df0aaaf4c 100644
--- a/include/rtl/alloc.h
+++ b/include/rtl/alloc.h
@@ -152,7 +152,7 @@ typedef struct SAL_DLLPUBLIC_RTTI rtl_arena_st rtl_arena_type;
 /**
  *  @param[in] pName             descriptive name; for debugging purposes.
  *  @param[in] quantum           resource allocation unit / granularity; rounded up to next power of 2.
- *  @param[in] quantum_cache_max max resources to cache; rounded up to next multiple of quantum; usually 0.
+ *  @param[in] quantum_cache_max no longer used, should be 0.
  *  @param[in] source_arena      passed as argument to source_alloc, source_free; usually NULL.
  *  @param[in] source_alloc      function to allocate resources; usually rtl_arena_alloc.
  *  @param[in] source_free       function to free resources; usually rtl_arena_free.
diff --git a/sal/rtl/alloc_arena.cxx b/sal/rtl/alloc_arena.cxx
index 721df266f442..b321e8e23f91 100644
--- a/sal/rtl/alloc_arena.cxx
+++ b/sal/rtl/alloc_arena.cxx
@@ -609,7 +609,6 @@ rtl_arena_type * rtl_arena_activate(
     rtl_arena_type * arena,
     const char *     name,
     sal_Size         quantum,
-    sal_Size         quantum_cache_max,
     rtl_arena_type * source_arena,
     void * (SAL_CALL * source_alloc)(rtl_arena_type *, sal_Size *),
     void   (SAL_CALL * source_free) (rtl_arena_type *, void *, sal_Size)
@@ -625,39 +624,14 @@ rtl_arena_type * rtl_arena_activate(
             /* roundup to next power of 2 */
             quantum = ((sal_Size(1)) << highbit(quantum));
         }
-        quantum_cache_max = RTL_MEMORY_P2ROUNDUP(quantum_cache_max, quantum);
 
         arena->m_quantum = quantum;
         arena->m_quantum_shift = highbit(arena->m_quantum) - 1;
-        arena->m_qcache_max = quantum_cache_max;
 
         arena->m_source_arena = source_arena;
         arena->m_source_alloc = source_alloc;
         arena->m_source_free  = source_free;
 
-        if (arena->m_qcache_max > 0)
-        {
-            char namebuf[RTL_ARENA_NAME_LENGTH + 1];
-            int  i, n = (arena->m_qcache_max >> arena->m_quantum_shift);
-
-            sal_Size size = n * sizeof(rtl_cache_type*);
-            arena->m_qcache_ptr = static_cast<rtl_cache_type**>(rtl_arena_alloc (gp_arena_arena, &size));
-            if (!(arena->m_qcache_ptr))
-            {
-                /* out of memory */
-                return nullptr;
-            }
-            for (i = 1; i <= n; i++)
-            {
-                size = i * arena->m_quantum;
-                (void) snprintf (namebuf, sizeof(namebuf), "%s_%" SAL_PRIuUINTPTR, arena->m_name, size);
-#if defined __GNUC__ && __GNUC__ >= 7
-#pragma GCC diagnostic pop
-#endif
-                arena->m_qcache_ptr[i - 1] = rtl_cache_create(namebuf, size, 0, nullptr, nullptr, nullptr, nullptr, arena, RTL_CACHE_FLAG_QUANTUMCACHE);
-            }
-        }
-
         /* insert into arena list */
         RTL_MEMORY_LOCK_ACQUIRE(&(g_arena_list.m_lock));
         QUEUE_INSERT_TAIL_NAMED(&(g_arena_list.m_arena_head), arena, arena_);
@@ -675,26 +649,6 @@ void rtl_arena_deactivate(rtl_arena_type * arena)
     QUEUE_REMOVE_NAMED(arena, arena_);
     RTL_MEMORY_LOCK_RELEASE(&(g_arena_list.m_lock));
 
-    /* cleanup quantum cache(s) */
-    if (arena->m_qcache_max > 0 && arena->m_qcache_ptr)
-    {
-        int  i, n = (arena->m_qcache_max >> arena->m_quantum_shift);
-        for (i = 1; i <= n; i++)
-        {
-            if (arena->m_qcache_ptr[i-1])
-            {
-                rtl_cache_destroy (arena->m_qcache_ptr[i-1]);
-                arena->m_qcache_ptr[i-1] = nullptr;
-            }
-        }
-        rtl_arena_free (
-            gp_arena_arena,
-            arena->m_qcache_ptr,
-            n * sizeof(rtl_cache_type*));
-
-        arena->m_qcache_ptr = nullptr;
-    }
-
     /* check for leaked segments */
     if (arena->m_stats.m_alloc > arena->m_stats.m_free)
     {
@@ -781,7 +735,7 @@ void rtl_arena_deactivate(rtl_arena_type * arena)
 rtl_arena_type * SAL_CALL rtl_arena_create(
     const char *       name,
     sal_Size           quantum,
-    sal_Size           quantum_cache_max,
+    sal_Size,
     rtl_arena_type *   source_arena,
     void * (SAL_CALL * source_alloc)(rtl_arena_type *, sal_Size *),
     void   (SAL_CALL * source_free) (rtl_arena_type *, void *, sal_Size),
@@ -808,7 +762,6 @@ try_alloc:
             arena,
             name,
             quantum,
-            quantum_cache_max,
             source_arena,
             source_alloc,
             source_free
@@ -855,7 +808,7 @@ void * SAL_CALL rtl_arena_alloc(
         sal_Size size;
 
         size = RTL_MEMORY_ALIGN(*pSize, arena->m_quantum);
-        if (size > arena->m_qcache_max)
+        if (size > 0)
         {
             /* allocate from segment list */
             rtl_arena_segment_type *segment = nullptr;
@@ -874,7 +827,7 @@ void * SAL_CALL rtl_arena_alloc(
                 /* resize */
                 assert(segment->m_size >= size);
                 oversize = segment->m_size - size;
-                if (oversize >= arena->m_quantum && oversize >= arena->m_qcache_max)
+                if (oversize >= arena->m_quantum)
                 {
                     rtl_arena_segment_type * remainder = nullptr;
                     rtl_arena_segment_get (arena, &remainder);
@@ -898,16 +851,6 @@ void * SAL_CALL rtl_arena_alloc(
             }
             RTL_MEMORY_LOCK_RELEASE(&(arena->m_lock));
         }
-        else if (size > 0)
-        {
-            /* allocate from quantum cache(s) */
-            int index = (size >> arena->m_quantum_shift) - 1;
-            assert(arena->m_qcache_ptr[index]);
-
-            addr = rtl_cache_alloc (arena->m_qcache_ptr[index]);
-            if (addr)
-                (*pSize) = size;
-        }
     }
     return addr;
 }
@@ -921,7 +864,7 @@ void SAL_CALL rtl_arena_free (
     if (arena)
     {
         size = RTL_MEMORY_ALIGN(size, arena->m_quantum);
-        if (size > arena->m_qcache_max)
+        if (size > 0)
         {
             /* free to segment list */
             rtl_arena_segment_type * segment;
@@ -981,31 +924,11 @@ void SAL_CALL rtl_arena_free (
 
             RTL_MEMORY_LOCK_RELEASE(&(arena->m_lock));
         }
-        else if (size > 0)
-        {
-            /* free to quantum cache(s) */
-            int index = (size >> arena->m_quantum_shift) - 1;
-            assert(arena->m_qcache_ptr[index]);
-
-            rtl_cache_free (arena->m_qcache_ptr[index], addr);
-        }
     }
 }
 
 void rtl_arena_foreach (rtl_arena_type *arena, ArenaForeachFn foreachFn)
 {
-    // quantum caches
-    if ((arena->m_qcache_max > 0) && (arena->m_qcache_ptr != nullptr))
-    {
-        int i, n = (arena->m_qcache_max >> arena->m_quantum_shift);
-        for (i = 1; i <= n; i++)
-        {
-            if (arena->m_qcache_ptr[i - 1] != nullptr)
-                rtl_cache_foreach (arena->m_qcache_ptr[i - 1],
-                                   foreachFn);
-        }
-    }
-
     /* used segments */
     for (int i = 0, n = arena->m_hash_size; i < n; i++)
     {
@@ -1131,7 +1054,6 @@ void rtl_arena_init()
             &g_machdep_arena,
             "rtl_machdep_arena",
             rtl_machdep_pagesize(),
-            0,       /* no quantum caching */
             nullptr, nullptr, nullptr  /* no source */
         );
         assert(gp_machdep_arena);
@@ -1147,7 +1069,6 @@ void rtl_arena_init()
             &g_default_arena,
             "rtl_default_arena",
             rtl_machdep_pagesize(),
-            0,                 /* no quantum caching */
             gp_machdep_arena,  /* source */
             rtl_machdep_alloc,
             rtl_machdep_free
@@ -1165,7 +1086,6 @@ void rtl_arena_init()
             &g_arena_arena,
             "rtl_arena_internal_arena",
             64,                /* quantum */
-            0,                 /* no quantum caching */
             gp_default_arena,  /* source */
             rtl_arena_alloc,
             rtl_arena_free
diff --git a/sal/rtl/alloc_arena.hxx b/sal/rtl/alloc_arena.hxx
index 30eac16840a6..120d0ec5ac45 100644
--- a/sal/rtl/alloc_arena.hxx
+++ b/sal/rtl/alloc_arena.hxx
@@ -101,7 +101,6 @@ struct rtl_arena_st
     sal_Size                  m_hash_size;  /* m_hash_mask + 1   */
     sal_Size                  m_hash_shift; /* log2(m_hash_size) */
 
-    sal_Size                  m_qcache_max;
     rtl_cache_type **         m_qcache_ptr;
 };
 
diff --git a/sal/rtl/alloc_cache.cxx b/sal/rtl/alloc_cache.cxx
index a24f8661cb8f..f7dd02ab7c8a 100644
--- a/sal/rtl/alloc_cache.cxx
+++ b/sal/rtl/alloc_cache.cxx
@@ -742,21 +742,10 @@ rtl_cache_type * rtl_cache_activate(
         cache->m_source = source;
 
         slabsize = source->m_quantum; /* minimum slab size */
-        if (flags & RTL_CACHE_FLAG_QUANTUMCACHE)
+        /* waste at most 1/8 of slab */
+        if(slabsize < cache->m_type_size * 8)
         {
-            /* next power of 2 above 3 * qcache_max */
-            if (slabsize < ((sal_Size(1)) << highbit(3 * source->m_qcache_max)))
-            {
-                slabsize = ((sal_Size(1)) << highbit(3 * source->m_qcache_max));
-            }
-        }
-        else
-        {
-            /* waste at most 1/8 of slab */
-            if(slabsize < cache->m_type_size * 8)
-            {
-                slabsize = cache->m_type_size * 8;
-            }
+            slabsize = cache->m_type_size * 8;
         }
 
         slabsize = RTL_MEMORY_P2ROUNDUP(slabsize, source->m_quantum);
diff --git a/sal/rtl/alloc_impl.hxx b/sal/rtl/alloc_impl.hxx
index 0c5340303ae5..38d0f92d733c 100644
--- a/sal/rtl/alloc_impl.hxx
+++ b/sal/rtl/alloc_impl.hxx
@@ -211,7 +211,6 @@ typedef CRITICAL_SECTION rtl_memory_lock_type;
     @internal
 */
 #define RTL_CACHE_FLAG_NOMAGAZINE   (1 << 13) /* w/o magazine layer */
-#define RTL_CACHE_FLAG_QUANTUMCACHE (2 << 13) /* used as arena quantum cache */
 
 enum class AllocMode { CUSTOM, SYSTEM, UNSET };
 


More information about the Libreoffice-commits mailing list