summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorIvan Maidanski <ivmai@mail.ru>2023-03-24 08:35:46 +0300
committerIvan Maidanski <ivmai@mail.ru>2023-03-24 12:53:15 +0300
commit1d8ed2c5bb50d20c8903bb96f017b43a62b32ef2 (patch)
tree88c9cab5eaa62d7572de72f2673a48b0e0725ad8 /include
parentd21d456b3abecb61ec8e5dfc6f06f48ba1eb4cc5 (diff)
downloadbdwgc-1d8ed2c5bb50d20c8903bb96f017b43a62b32ef2.tar.gz
Avoid code duplication in IGNORE_OFF_PAGE-specific malloc functions
(refactoring) * alloc.c: Update comment regarding GC_generic_malloc_inner usage. * alloc.c (GC_collect_or_expand): Replace ignore_off_page argument to flags (check IGNORE_OFF_PAGE bit only in it); update comment. * alloc.c (GC_allocobj): Pass 0 as flags to GC_collect_or_expand. * dbg_mlc.c (GC_debug_generic_malloc, GC_debug_generic_or_special_malloc): Rename knd argument to k. * mallocx.c (GC_generic_or_special_malloc): Likewise. * dbg_mlc.c (GC_debug_generic_malloc): Use GC_generic_malloc_aligned() instead of GC_generic_malloc(). * dbg_mlc.c (GC_debug_generic_malloc_inner): Add flags argument. * gcj_mlc.c [GC_GCJ_SUPPORT] (GC_core_gcj_malloc): Likewise. * include/private/gc_priv.h (C_generic_malloc_aligned, GC_generic_malloc_inner): Likewise. * include/private/gc_priv.h [THREAD_LOCAL_ALLOC && GC_GCJ_SUPPORT] (GC_core_gcj_malloc): Likewise. * include/private/gc_priv.h [DBG_HDRS_ALL] (GC_debug_generic_malloc_inner): Likewise. * malloc.c (GC_generic_malloc_inner, GC_generic_malloc_aligned): Likewise. * dbg_mlc.c (GC_debug_generic_malloc_inner): Use GC_generic_malloc_inner() instead of GC_generic_malloc_inner_ignore_off_page(). * dbg_mlc.c [DBG_HDRS_ALL] (GC_debug_generic_malloc_inner_ignore_off_page): Remove GC_INNER function. * include/private/gc_priv.h [DBG_HDRS_ALL || GC_GCJ_SUPPORT || !GC_NO_FINALIZATION] (GC_generic_malloc_inner_ignore_off_page): Likewise. * include/private/gc_priv.h [DBG_HDRS_ALL] (GC_debug_generic_malloc_inner_ignore_off_page): Likewise. * malloc.c [DBG_HDRS_ALL || GC_GCJ_SUPPORT || !GC_NO_FINALIZATION] (GC_generic_malloc_inner_ignore_off_page): Likewise. * gcj_mlc.c [GC_GCJ_SUPPORT && !THREAD_LOCAL_ALLOC] (GC_gcj_malloc): Define as STATIC GC_core_gcj_malloc. * gcj_mlc.c [GC_GCJ_SUPPORT] (GC_core_gcj_malloc): Reformat comment; pass flags to GC_generic_malloc_inner(). * gcj_mlc.c [GC_GCJ_SUPPORT && !THREAD_LOCAL_ALLOC] (GC_gcj_malloc): Redirect to GC_core_gcj_malloc() passing 0 to flags argument. * thread_local_alloc.c [THREAD_LOCAL_ALLOC && GC_GCJ_SUPPORT] (GC_gcj_malloc): Likewise. * gcj_mlc.c [GC_GCJ_SUPPORT] (GC_gcj_malloc_ignore_off_page): Redirect to GC_core_gcj_malloc() passing IGNORE_OFF_PAGE. * gcj_mlc.c [GC_GCJ_SUPPORT] (GC_debug_gcj_malloc): Pass 0 as flags to GC_generic_malloc_inner(). * include/private/gc_priv.h (GC_generic_malloc_inner): Update comment. * mallocx.c (GC_generic_malloc_many): Likewise. * include/private/gc_priv.h (GC_collect_or_expand): Replace GC_bool ignore_off_page argument to unsigned flags. * include/private/gc_priv.h (GC_INTERNAL_MALLOC, GC_INTERNAL_MALLOC_IGNORE_OFF_PAGE): Specify macro arguments. * include/private/gc_priv.h (GC_INTERNAL_MALLOC): Pass 0 as flags argument to GC_[debug_]generic_malloc_inner(). * include/private/gc_priv.h (GC_INTERNAL_MALLOC_IGNORE_OFF_PAGE): Pass IGNORE_OFF_PAGE to GC_[debug_]generic_malloc_inner(). * malloc.c (GC_alloc_large): Pass flags (instead of flags!=0) to GC_collect_or_expand(). * malloc.c (GC_generic_malloc_inner_small): New STATIC function (move most of code from GC_generic_malloc_inner). * malloc.c (GC_generic_malloc_inner): Move comment to gc_priv.h; call GC_generic_malloc_inner_small(). * malloc.c (GC_generic_malloc_aligned): Call GC_generic_malloc_inner_small() instead of GC_generic_malloc_inner(); pass flags (instead of 0) to GC_alloc_large(); do not cast result of GC_alloc_large() to ptr_t. * malloc.c (GC_generic_malloc): Pass 0 as flags to GC_generic_malloc_aligned(). * malloc.c (GC_memalign): Likewise. * malloc.c (GC_malloc_kind_global, GC_generic_malloc_uncollectable): Call GC_generic_malloc_aligned() instead of GC_generic_malloc(). * mallocx.c (GC_generic_malloc_many): Likewise. * malloc.c (free_internal): Rename knd local variable to k. * mallocx.c (GC_generic_malloc_ignore_off_page, GC_malloc_ignore_off_page, GC_malloc_atomic_ignore_off_page): Redirect to GC_generic_malloc_aligned() passing IGNORE_OFF_PAGE. * typd_mlc.c (GC_generic_malloc_ignore_off_page): Likewise. * tests/gctest.c (run_one_test): Call GC_generic_malloc_ignore_off_page() (with size larger than HBLKSIZE); increment collectable_count.
Diffstat (limited to 'include')
-rw-r--r--include/private/gc_priv.h39
1 files changed, 20 insertions, 19 deletions
diff --git a/include/private/gc_priv.h b/include/private/gc_priv.h
index de1af1e9..9c7855ce 100644
--- a/include/private/gc_priv.h
+++ b/include/private/gc_priv.h
@@ -2286,6 +2286,7 @@ GC_INNER void GC_freehblk(struct hblk * p);
/* as invalid. */
/* Miscellaneous GC routines. */
+
GC_INNER GC_bool GC_expand_hp_inner(word n);
GC_INNER void GC_start_reclaim(GC_bool abort_if_found);
/* Restore unmarked objects to free */
@@ -2338,23 +2339,24 @@ GC_INNER void GC_collect_a_little_inner(int n);
/* A unit is an amount appropriate for */
/* HBLKSIZE bytes of allocation. */
-GC_INNER void * GC_generic_malloc_aligned(size_t lb, int k, size_t align_m1);
+GC_INNER void * GC_generic_malloc_aligned(size_t lb, int k, unsigned flags,
+ size_t align_m1);
-GC_INNER void * GC_generic_malloc_inner(size_t lb, int k);
+GC_INNER void * GC_generic_malloc_inner(size_t lb, int k, unsigned flags);
/* Allocate an object of the given */
/* kind but assuming lock already held. */
-#if defined(DBG_HDRS_ALL) || defined(GC_GCJ_SUPPORT) \
- || !defined(GC_NO_FINALIZATION)
- GC_INNER void * GC_generic_malloc_inner_ignore_off_page(size_t lb, int k);
- /* Allocate an object, where the client */
+ /* Should not be used to directly */
+ /* allocate objects requiring special */
+ /* handling on allocation. The flags */
+ /* argument should be IGNORE_OFF_PAGE */
+ /* or 0. In the first case the client */
/* guarantees that there will always be */
/* a pointer to the beginning (i.e. */
/* within the first hblk) of the object */
/* while it is live. */
-#endif
-GC_INNER GC_bool GC_collect_or_expand(word needed_blocks,
- GC_bool ignore_off_page, GC_bool retry);
+GC_INNER GC_bool GC_collect_or_expand(word needed_blocks, unsigned flags,
+ GC_bool retry);
GC_INNER ptr_t GC_allocobj(size_t gran, int kind);
/* Make the indicated free list */
@@ -2386,7 +2388,7 @@ GC_INNER ptr_t GC_allocobj(size_t gran, int kind);
/* Allocation routines that bypass the thread local cache. */
#if defined(THREAD_LOCAL_ALLOC) && defined(GC_GCJ_SUPPORT)
- GC_INNER void * GC_core_gcj_malloc(size_t, void *);
+ GC_INNER void *GC_core_gcj_malloc(size_t lb, void *, unsigned flags);
#endif
GC_INNER void GC_init_headers(void);
@@ -2508,12 +2510,11 @@ GC_EXTERN GC_bool GC_print_back_height;
/* Macros used for collector internal allocation. */
/* These assume the collector lock is held. */
#ifdef DBG_HDRS_ALL
- GC_INNER void * GC_debug_generic_malloc_inner(size_t lb, int k);
- GC_INNER void * GC_debug_generic_malloc_inner_ignore_off_page(size_t lb,
- int k);
-# define GC_INTERNAL_MALLOC GC_debug_generic_malloc_inner
-# define GC_INTERNAL_MALLOC_IGNORE_OFF_PAGE \
- GC_debug_generic_malloc_inner_ignore_off_page
+ GC_INNER void * GC_debug_generic_malloc_inner(size_t lb, int k,
+ unsigned flags);
+# define GC_INTERNAL_MALLOC(lb, k) GC_debug_generic_malloc_inner(lb, k, 0)
+# define GC_INTERNAL_MALLOC_IGNORE_OFF_PAGE(lb, k) \
+ GC_debug_generic_malloc_inner(lb, k, IGNORE_OFF_PAGE)
# ifdef THREADS
GC_INNER void GC_debug_free_inner(void * p);
# define GC_INTERNAL_FREE GC_debug_free_inner
@@ -2521,9 +2522,9 @@ GC_EXTERN GC_bool GC_print_back_height;
# define GC_INTERNAL_FREE GC_debug_free
# endif
#else
-# define GC_INTERNAL_MALLOC GC_generic_malloc_inner
-# define GC_INTERNAL_MALLOC_IGNORE_OFF_PAGE \
- GC_generic_malloc_inner_ignore_off_page
+# define GC_INTERNAL_MALLOC(lb, k) GC_generic_malloc_inner(lb, k, 0)
+# define GC_INTERNAL_MALLOC_IGNORE_OFF_PAGE(lb, k) \
+ GC_generic_malloc_inner(lb, k, IGNORE_OFF_PAGE)
# ifdef THREADS
# define GC_INTERNAL_FREE GC_free_inner
# else