1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-12 06:41:13 +02:00

Changes from arch/CVS synchronization

This commit is contained in:
Ludovic Courtès 2006-11-08 09:34:35 +00:00
parent dd18d31211
commit d9f71a0754
8 changed files with 149 additions and 63 deletions

View file

@ -1,3 +1,8 @@
2006-11-08 Ludovic Courtès <ludovic.courtes@laas.fr>
* configure.in: Pass `bug-guile@gnu.org' as a third argument to
`AC_INIT'.
2006-10-25 Neil Jerram <neil@ossau.uklinux.net> 2006-10-25 Neil Jerram <neil@ossau.uklinux.net>
IA64 HP-UX patch from Hrvoje Nikšić. (Thanks!) IA64 HP-UX patch from Hrvoje Nikšić. (Thanks!)
@ -2973,3 +2978,8 @@ Thu Aug 1 02:31:53 1996 Jim Blandy <jimb@totoro.cyclic.com>
Makefile. Build doc/Makefile from doc/Makefile.in. Makefile. Build doc/Makefile from doc/Makefile.in.
* doc/Makefile.in: New file. * doc/Makefile.in: New file.
;; Local Variables:
;; coding: utf-8
;; End:

View file

@ -28,7 +28,8 @@ Boston, MA 02110-1301, USA.
AC_PREREQ(2.53) AC_PREREQ(2.53)
AC_INIT(m4_esyscmd(. ./GUILE-VERSION && echo -n ${PACKAGE}), AC_INIT(m4_esyscmd(. ./GUILE-VERSION && echo -n ${PACKAGE}),
m4_esyscmd(. ./GUILE-VERSION && echo -n ${GUILE_VERSION})) m4_esyscmd(. ./GUILE-VERSION && echo -n ${GUILE_VERSION}),
[bug-guile@gnu.org])
AC_CONFIG_AUX_DIR([.]) AC_CONFIG_AUX_DIR([.])
AC_CONFIG_SRCDIR(GUILE-VERSION) AC_CONFIG_SRCDIR(GUILE-VERSION)
AM_INIT_AUTOMAKE([no-define]) AM_INIT_AUTOMAKE([no-define])

View file

@ -1,3 +1,38 @@
2006-11-08 Ludovic Courtès <ludovic.courtes@laas.fr>
* libguile/gc-freelist.c (scm_i_adjust_min_yield): Take two
"sweep_stats" arguments; use them instead of accessing the global
variables `scm_gc_cells_collected' and `scm_gc_cells_collected_1'.
* libguile/gc-segment.c (scm_i_sweep_some_cards): Reset SWEEP
before each iteration of the loop.
(scm_i_sweep_some_segments): Reset SWEEP at each iteration.
(scm_i_get_new_heap_segment): Take an additional argument
SWEEP_STATS. Compute MIN_CELLS as a function of it.
* libguile/gc.c (scm_gc_cells_collected,
scm_gc_cells_collected_1): Removed.
(scm_i_gc_sweep_stats, scm_i_gc_sweep_stats_1): New.
(scm_gc_cells_marked_acc, scm_gc_cells_swept_acc,
scm_gc_time_taken, scm_gc_mark_time_taken, scm_gc_times,
scm_gc_cell_yield_percentage, protected_obj_count): Made `static'.
(scm_gc_stats): Use `scm_i_gc_sweep_stats' instead of
`scm_gc_cells_(collected|swept)'.
(gc_update_stats): New.
(gc_end_stats): Use `scm_i_gc_sweep_stats' and
`scm_i_gc_sweep_stats_1' instead of the former globals.
(scm_gc_for_newcell): Invoke `gc_update_stats ()' after each
`scm_i_sweep_some_segments' call. This fixes a bug where the GC
would keep allocating new segments instead of re-using collected
cells (because `scm_gc_cells_collected' would remain zero).
* libguile/gc.h (scm_gc_cells_swept, scm_gc_cells_collected,
scm_gc_cell_yield_percentage): Removed.
* libguile/private-gc.h (scm_gc_cells_collected_1): Removed.
(scm_i_adjust_min_yield): Updated.
(scm_i_get_new_heap_segment): Updated.
2006-11-02 Neil Jerram <neil@ossau.uklinux.net> 2006-11-02 Neil Jerram <neil@ossau.uklinux.net>
* modules.c: Correct comment saying that low-level environments * modules.c: Correct comment saying that low-level environments
@ -13546,3 +13581,7 @@
(write_all): new helper procedure. (write_all): new helper procedure.
The ChangeLog continues in the file: "ChangeLog-2000" The ChangeLog continues in the file: "ChangeLog-2000"
;; Local Variables:
;; coding: utf-8
;; End:

View file

@ -72,14 +72,13 @@ SCM_DEFINE (scm_gc_set_debug_check_freelist_x, "gc-set-debug-check-freelist!", 1
/* /* Adjust FREELIST variables to decide wether or not to allocate more heap in
This adjust FREELIST variables to decide wether or not to allocate the next GC run based on SWEEP_STATS on SWEEP_STATS_1 (statistics
more heap in the next GC run. It uses scm_gc_cells_collected and scm_gc_cells_collected1 collected after the two last full GC). */
*/
void void
scm_i_adjust_min_yield (scm_t_cell_type_statistics *freelist, scm_i_adjust_min_yield (scm_t_cell_type_statistics *freelist,
scm_t_sweep_statistics sweep_stats) scm_t_sweep_statistics sweep_stats,
scm_t_sweep_statistics sweep_stats_1)
{ {
/* min yield is adjusted upwards so that next predicted total yield /* min yield is adjusted upwards so that next predicted total yield
* (allocated cells actually freed by GC) becomes * (allocated cells actually freed by GC) becomes
@ -99,7 +98,8 @@ scm_i_adjust_min_yield (scm_t_cell_type_statistics *freelist,
{ {
/* Pick largest of last two yields. */ /* Pick largest of last two yields. */
long delta = ((SCM_HEAP_SIZE * freelist->min_yield_fraction / 100) long delta = ((SCM_HEAP_SIZE * freelist->min_yield_fraction / 100)
- (long) sweep_stats.collected); - (long) SCM_MAX (sweep_stats.collected,
sweep_stats_1.collected));
#ifdef DEBUGINFO #ifdef DEBUGINFO
fprintf (stderr, " after GC = %lu, delta = %ld\n", fprintf (stderr, " after GC = %lu, delta = %ld\n",
(unsigned long) scm_cells_allocated, (unsigned long) scm_cells_allocated,

View file

@ -141,9 +141,8 @@ scm_i_clear_segment_mark_space (scm_t_heap_segment *seg)
} }
/* Sweep cards from SEG until we've gathered THRESHOLD cells. On return, /* Sweep cards from SEG until we've gathered THRESHOLD cells. On return,
*CELLS_SWEPT contains the number of cells that have been visited and SWEEP_STATS contains the number of cells that have been visited and
*CELLS_COLLECTED contains the number of cells actually collected. A collected. A freelist is returned, potentially empty. */
freelist is returned, potentially empty. */
SCM SCM
scm_i_sweep_some_cards (scm_t_heap_segment *seg, scm_i_sweep_some_cards (scm_t_heap_segment *seg,
scm_t_sweep_statistics *sweep_stats) scm_t_sweep_statistics *sweep_stats)
@ -206,8 +205,12 @@ scm_i_sweep_segment (scm_t_heap_segment *seg,
scm_i_sweep_statistics_init (sweep_stats); scm_i_sweep_statistics_init (sweep_stats);
scm_i_sweep_statistics_init (&sweep);
while (scm_i_sweep_some_cards (seg, &sweep) != SCM_EOL) while (scm_i_sweep_some_cards (seg, &sweep) != SCM_EOL)
scm_i_sweep_statistics_sum (sweep_stats, sweep); {
scm_i_sweep_statistics_sum (sweep_stats, sweep);
scm_i_sweep_statistics_init (&sweep);
}
seg->next_free_card =p; seg->next_free_card =p;
} }
@ -339,6 +342,7 @@ scm_i_sweep_some_segments (scm_t_cell_type_statistics *fl,
if (scm_i_heap_segment_table[i]->freelist != fl) if (scm_i_heap_segment_table[i]->freelist != fl)
continue; continue;
scm_i_sweep_statistics_init (&sweep);
collected = scm_i_sweep_some_cards (scm_i_heap_segment_table[i], collected = scm_i_sweep_some_cards (scm_i_heap_segment_table[i],
&sweep); &sweep);
@ -461,14 +465,12 @@ scm_i_find_heap_segment_containing_object (SCM obj)
} }
/* /* Important entry point: try to grab some memory, and make it into a
Important entry point: try to grab some memory, and make it into a segment; return the index of the segment. SWEEP_STATS should contain
segment. global GC sweep statistics collected since the last full GC. */
int
RETURN: the index of the segment.
*/
int
scm_i_get_new_heap_segment (scm_t_cell_type_statistics *freelist, scm_i_get_new_heap_segment (scm_t_cell_type_statistics *freelist,
scm_t_sweep_statistics sweep_stats,
policy_on_error error_policy) policy_on_error error_policy)
{ {
size_t len; size_t len;
@ -489,7 +491,7 @@ scm_i_get_new_heap_segment (scm_t_cell_type_statistics *freelist,
*/ */
float f = freelist->min_yield_fraction / 100.0; float f = freelist->min_yield_fraction / 100.0;
float h = SCM_HEAP_SIZE; float h = SCM_HEAP_SIZE;
float min_cells = (f * h - scm_gc_cells_collected) / (1.0 - f); float min_cells = (f * h - sweep_stats.collected) / (1.0 - f);
/* Make heap grow with factor 1.5 */ /* Make heap grow with factor 1.5 */
len = freelist->heap_size / 2; len = freelist->heap_size / 2;

View file

@ -209,20 +209,28 @@ unsigned long scm_mtrigger;
*/ */
unsigned long scm_cells_allocated = 0; unsigned long scm_cells_allocated = 0;
unsigned long scm_mallocated = 0; unsigned long scm_mallocated = 0;
unsigned long scm_gc_cells_collected;
unsigned long scm_gc_cells_collected_1 = 0; /* previous GC yield */ /* Global GC sweep statistics since the last full GC. */
unsigned long scm_gc_malloc_collected; static scm_t_sweep_statistics scm_i_gc_sweep_stats = { 0, 0 };
unsigned long scm_gc_ports_collected; static scm_t_sweep_statistics scm_i_gc_sweep_stats_1 = { 0, 0 };
unsigned long scm_gc_time_taken = 0;
/* Total count of cells marked/swept. */
static double scm_gc_cells_marked_acc = 0.;
static double scm_gc_cells_swept_acc = 0.;
static unsigned long scm_gc_time_taken = 0;
static unsigned long t_before_gc; static unsigned long t_before_gc;
unsigned long scm_gc_mark_time_taken = 0; static unsigned long scm_gc_mark_time_taken = 0;
unsigned long scm_gc_times = 0;
unsigned long scm_gc_cells_swept = 0; static unsigned long scm_gc_times = 0;
double scm_gc_cells_marked_acc = 0.;
double scm_gc_cells_swept_acc = 0.; static int scm_gc_cell_yield_percentage = 0;
int scm_gc_cell_yield_percentage =0; static unsigned long protected_obj_count = 0;
/* The following are accessed from `gc-malloc.c' and `gc-card.c'. */
int scm_gc_malloc_yield_percentage = 0; int scm_gc_malloc_yield_percentage = 0;
unsigned long protected_obj_count = 0; unsigned long scm_gc_malloc_collected = 0;
unsigned long scm_gc_ports_collected = 0;
SCM_SYMBOL (sym_cells_allocated, "cells-allocated"); SCM_SYMBOL (sym_cells_allocated, "cells-allocated");
@ -346,10 +354,10 @@ SCM_DEFINE (scm_gc_stats, "gc-stats", 0, 0, 0,
local_protected_obj_count = protected_obj_count; local_protected_obj_count = protected_obj_count;
local_scm_gc_cells_swept = local_scm_gc_cells_swept =
(double) scm_gc_cells_swept_acc (double) scm_gc_cells_swept_acc
+ (double) scm_gc_cells_swept; + (double) scm_i_gc_sweep_stats.swept;
local_scm_gc_cells_marked = scm_gc_cells_marked_acc local_scm_gc_cells_marked = scm_gc_cells_marked_acc
+(double) scm_gc_cells_swept +(double) scm_i_gc_sweep_stats.swept
-(double) scm_gc_cells_collected; -(double) scm_i_gc_sweep_stats.collected;
for (i = table_size; i--;) for (i = table_size; i--;)
{ {
@ -393,6 +401,30 @@ SCM_DEFINE (scm_gc_stats, "gc-stats", 0, 0, 0,
} }
#undef FUNC_NAME #undef FUNC_NAME
/* Update the global sweeping/collection statistics by adding SWEEP_STATS to
SCM_I_GC_SWEEP_STATS and updating related variables. */
static inline void
gc_update_stats (scm_t_sweep_statistics sweep_stats)
{
/* CELLS SWEPT is another word for the number of cells that were examined
during GC. YIELD is the number that we cleaned out. MARKED is the number
that weren't cleaned. */
scm_gc_cell_yield_percentage = (sweep_stats.collected * 100) / SCM_HEAP_SIZE;
scm_i_sweep_statistics_sum (&scm_i_gc_sweep_stats, sweep_stats);
if ((scm_i_gc_sweep_stats.collected > scm_i_gc_sweep_stats.swept)
|| (scm_cells_allocated < sweep_stats.collected))
{
printf ("internal GC error, please report to `"
PACKAGE_BUGREPORT "'\n");
abort ();
}
scm_cells_allocated -= sweep_stats.collected;
}
static void static void
gc_start_stats (const char *what SCM_UNUSED) gc_start_stats (const char *what SCM_UNUSED)
{ {
@ -406,23 +438,18 @@ static void
gc_end_stats (scm_t_sweep_statistics sweep_stats) gc_end_stats (scm_t_sweep_statistics sweep_stats)
{ {
unsigned long t = scm_c_get_internal_run_time (); unsigned long t = scm_c_get_internal_run_time ();
scm_gc_time_taken += (t - t_before_gc); scm_gc_time_taken += (t - t_before_gc);
/* /* Reset the number of cells swept/collected since the last full GC. */
CELLS SWEPT is another word for the number of cells that were scm_i_gc_sweep_stats_1 = scm_i_gc_sweep_stats;
examined during GC. YIELD is the number that we cleaned scm_i_gc_sweep_stats.collected = scm_i_gc_sweep_stats.swept = 0;
out. MARKED is the number that weren't cleaned.
*/
scm_gc_cells_marked_acc += (double) sweep_stats.swept
- (double) scm_gc_cells_collected;
scm_gc_cells_swept_acc += (double) sweep_stats.swept;
scm_gc_cell_yield_percentage = (sweep_stats.collected * 100) / SCM_HEAP_SIZE; gc_update_stats (sweep_stats);
scm_gc_cells_swept = sweep_stats.swept; scm_gc_cells_marked_acc += (double) scm_i_gc_sweep_stats.swept
scm_gc_cells_collected_1 = scm_gc_cells_collected; - (double) scm_i_gc_sweep_stats.collected;
scm_gc_cells_collected = sweep_stats.collected; scm_gc_cells_swept_acc += (double) scm_i_gc_sweep_stats.swept;
scm_cells_allocated -= sweep_stats.collected;
++scm_gc_times; ++scm_gc_times;
} }
@ -480,13 +507,17 @@ scm_gc_for_newcell (scm_t_cell_type_statistics *freelist, SCM *free_cells)
scm_gc_running_p = 1; scm_gc_running_p = 1;
*free_cells = scm_i_sweep_some_segments (freelist, &sweep_stats); *free_cells = scm_i_sweep_some_segments (freelist, &sweep_stats);
scm_cells_allocated -= sweep_stats.collected; gc_update_stats (sweep_stats);
if (*free_cells == SCM_EOL && scm_i_gc_grow_heap_p (freelist)) if (*free_cells == SCM_EOL && scm_i_gc_grow_heap_p (freelist))
{ {
freelist->heap_segment_idx = scm_i_get_new_heap_segment (freelist, abort_on_error); freelist->heap_segment_idx =
scm_i_get_new_heap_segment (freelist,
scm_i_gc_sweep_stats,
abort_on_error);
*free_cells = scm_i_sweep_some_segments (freelist, &sweep_stats); *free_cells = scm_i_sweep_some_segments (freelist, &sweep_stats);
scm_cells_allocated -= sweep_stats.collected; gc_update_stats (sweep_stats);
} }
if (*free_cells == SCM_EOL) if (*free_cells == SCM_EOL)
@ -495,7 +526,9 @@ scm_gc_for_newcell (scm_t_cell_type_statistics *freelist, SCM *free_cells)
with the advent of lazy sweep, GC yield is only known just with the advent of lazy sweep, GC yield is only known just
before doing the GC. before doing the GC.
*/ */
scm_i_adjust_min_yield (freelist, sweep_stats); scm_i_adjust_min_yield (freelist,
scm_i_gc_sweep_stats,
scm_i_gc_sweep_stats_1);
/* /*
out of fresh cells. Try to get some new ones. out of fresh cells. Try to get some new ones.
@ -505,7 +538,7 @@ scm_gc_for_newcell (scm_t_cell_type_statistics *freelist, SCM *free_cells)
scm_i_gc ("cells"); scm_i_gc ("cells");
*free_cells = scm_i_sweep_some_segments (freelist, &sweep_stats); *free_cells = scm_i_sweep_some_segments (freelist, &sweep_stats);
scm_cells_allocated -= sweep_stats.collected; gc_update_stats (sweep_stats);
} }
if (*free_cells == SCM_EOL) if (*free_cells == SCM_EOL)
@ -513,9 +546,13 @@ scm_gc_for_newcell (scm_t_cell_type_statistics *freelist, SCM *free_cells)
/* /*
failed getting new cells. Get new juice or die. failed getting new cells. Get new juice or die.
*/ */
freelist->heap_segment_idx = scm_i_get_new_heap_segment (freelist, abort_on_error); freelist->heap_segment_idx =
scm_i_get_new_heap_segment (freelist,
scm_i_gc_sweep_stats,
abort_on_error);
*free_cells = scm_i_sweep_some_segments (freelist, &sweep_stats); *free_cells = scm_i_sweep_some_segments (freelist, &sweep_stats);
scm_cells_allocated -= sweep_stats.collected; gc_update_stats (sweep_stats);
} }
if (*free_cells == SCM_EOL) if (*free_cells == SCM_EOL)

View file

@ -277,13 +277,9 @@ SCM_API scm_i_pthread_key_t scm_i_freelist2;
SCM_API struct scm_t_cell_type_statistics scm_i_master_freelist; SCM_API struct scm_t_cell_type_statistics scm_i_master_freelist;
SCM_API struct scm_t_cell_type_statistics scm_i_master_freelist2; SCM_API struct scm_t_cell_type_statistics scm_i_master_freelist2;
SCM_API unsigned long scm_gc_cells_swept;
SCM_API unsigned long scm_gc_cells_collected;
SCM_API unsigned long scm_gc_malloc_collected; SCM_API unsigned long scm_gc_malloc_collected;
SCM_API unsigned long scm_gc_ports_collected; SCM_API unsigned long scm_gc_ports_collected;
SCM_API unsigned long scm_cells_allocated; SCM_API unsigned long scm_cells_allocated;
SCM_API int scm_gc_cell_yield_percentage;
SCM_API int scm_gc_malloc_yield_percentage; SCM_API int scm_gc_malloc_yield_percentage;
SCM_API unsigned long scm_mallocated; SCM_API unsigned long scm_mallocated;
SCM_API unsigned long scm_mtrigger; SCM_API unsigned long scm_mtrigger;

View file

@ -144,14 +144,13 @@ typedef struct scm_sweep_statistics
} \ } \
while (0) while (0)
extern scm_t_cell_type_statistics scm_i_master_freelist; extern scm_t_cell_type_statistics scm_i_master_freelist;
extern scm_t_cell_type_statistics scm_i_master_freelist2; extern scm_t_cell_type_statistics scm_i_master_freelist2;
extern unsigned long scm_gc_cells_collected_1;
void scm_i_adjust_min_yield (scm_t_cell_type_statistics *freelist, void scm_i_adjust_min_yield (scm_t_cell_type_statistics *freelist,
scm_t_sweep_statistics sweep_stats); scm_t_sweep_statistics sweep_stats,
scm_t_sweep_statistics sweep_stats_1);
void scm_i_gc_sweep_freelist_reset (scm_t_cell_type_statistics *freelist); void scm_i_gc_sweep_freelist_reset (scm_t_cell_type_statistics *freelist);
int scm_i_gc_grow_heap_p (scm_t_cell_type_statistics * freelist); int scm_i_gc_grow_heap_p (scm_t_cell_type_statistics * freelist);
@ -270,7 +269,9 @@ void scm_i_heap_segment_statistics (scm_t_heap_segment *seg, SCM tab);
int scm_i_insert_segment (scm_t_heap_segment * seg); int scm_i_insert_segment (scm_t_heap_segment * seg);
long int scm_i_find_heap_segment_containing_object (SCM obj); long int scm_i_find_heap_segment_containing_object (SCM obj);
int scm_i_get_new_heap_segment (scm_t_cell_type_statistics *, policy_on_error); int scm_i_get_new_heap_segment (scm_t_cell_type_statistics *,
scm_t_sweep_statistics,
policy_on_error);
void scm_i_clear_mark_space (void); void scm_i_clear_mark_space (void);
void scm_i_sweep_segments (void); void scm_i_sweep_segments (void);
SCM scm_i_sweep_some_segments (scm_t_cell_type_statistics *fl, SCM scm_i_sweep_some_segments (scm_t_cell_type_statistics *fl,