[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