mirror of
https://github.com/Mercury-Language/mercury.git
synced 2025-12-10 11:23:15 +00:00
Discussion of these changes can be found on the Mercury developers
mailing list archives from June 2018.
COPYING.LIB:
Add a special linking exception to the LGPL.
*:
Update references to COPYING.LIB.
Clean up some minor errors that have accumulated in copyright
messages.
126 lines
4.2 KiB
C
126 lines
4.2 KiB
C
// vim: ts=4 sw=4 expandtab ft=c
|
|
|
|
// Copyright (C) 1998, 2000-2001, 2006, 2011 The University of Melbourne.
|
|
// Copyright (C) 2016, 2018 The Mercury team.
|
|
// This file is distributed under the terms specified in COPYING.LIB.
|
|
|
|
// File: mercury_heap_profile.h
|
|
// Main authors: zs, fjh
|
|
//
|
|
// This module records information about the allocations of cells on the heap.
|
|
// The information recorded here is used by mercury_prof.c and
|
|
// by library/benchmarking.m.
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef MERCURY_HEAP_PROFILE_H
|
|
#define MERCURY_HEAP_PROFILE_H
|
|
|
|
#include "mercury_types.h" // for `MR_Code'
|
|
#include "mercury_dword.h" // for `MR_Dword'
|
|
#include "mercury_type_info.h" // for `MR_STATIC_CODE_CONST'
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
|
|
// Type declarations.
|
|
|
|
// We count memory allocation in units of
|
|
// - cells (i.e. individual allocations), and
|
|
// - words
|
|
//
|
|
// We keep track of how much allocation occurs in each "period".
|
|
// A period ends (and a new period begins) at each call to
|
|
// report_stats or report_full_memory_stats in library/benchmarking.m.
|
|
// We also keep track of the total allocation over all periods.
|
|
//
|
|
// We keep track of how much memory was allocated
|
|
// - by each procedure,
|
|
// - for objects of each type,
|
|
// - and an overall total
|
|
//
|
|
// The tables of counters for each procedure is represented as a binary
|
|
// search tree. Similarly for the table of counters for each type.
|
|
//
|
|
// Due to garbage collection, the total amount of memory allocated can exceed
|
|
// the amount of real or even virtual memory available. Hence the total amount
|
|
// of memory allocated by a long-running Mercury program might not fit into a
|
|
// single 32-bit `unsigned long'. This is why we use MR_Dwords, which are
|
|
// at least 64 bits in size.
|
|
|
|
typedef struct MR_memprof_counter
|
|
{
|
|
MR_Dword cells_at_period_start;
|
|
MR_Dword words_at_period_start;
|
|
MR_Dword cells_since_period_start;
|
|
MR_Dword words_since_period_start;
|
|
} MR_memprof_counter;
|
|
|
|
// Type representing a binary tree node.
|
|
typedef struct MR_memprof_record
|
|
{
|
|
const char *type_name; // type name or NULL
|
|
MR_STATIC_CODE_CONST MR_Code *proc; // proc address or NULL
|
|
MR_memprof_counter counter;
|
|
struct MR_memprof_record *left; // left sub-tree
|
|
struct MR_memprof_record *right; // right sub-tree
|
|
} MR_memprof_record;
|
|
|
|
// Type representing a binary tree.
|
|
typedef struct MR_memprof_table
|
|
{
|
|
MR_memprof_record *root;
|
|
int num_entries;
|
|
} MR_memprof_table;
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
|
|
// global variables
|
|
|
|
extern MR_memprof_counter MR_memprof_overall;
|
|
extern MR_memprof_table MR_memprof_procs;
|
|
extern MR_memprof_table MR_memprof_types;
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
|
|
// Function declarations.
|
|
|
|
// MR_record_allocation(size, alloc_id, type):
|
|
//
|
|
// Record heap profiling information for an allocation of one cell of `size'
|
|
// words. The heap profiling information is recorded in the three global
|
|
// variables above.
|
|
|
|
extern void MR_record_allocation(int size,
|
|
const MR_AllocSiteInfoPtr alloc_id, const char *type_name);
|
|
|
|
// MR_prof_output_mem_tables():
|
|
//
|
|
// Write out the information recorded by MR_record_allocation() to a pair
|
|
// of files `Prof.MemoryMR_Words' and `Prof.MemoryCells'.
|
|
|
|
extern void MR_prof_output_mem_tables(void);
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
|
|
// At runtime turn heap profiling on or off.
|
|
|
|
extern void MR_prof_turn_on_heap_profiling(void);
|
|
|
|
extern void MR_prof_turn_off_heap_profiling(void);
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
|
|
extern void MR_register_alloc_sites(const MR_AllocSiteInfo *alloc_sites,
|
|
int size);
|
|
|
|
extern void MR_report_memory_attribution(MR_ConstString label,
|
|
MR_bool run_collect);
|
|
|
|
extern void MR_finish_prof_snapshots_file(void);
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
|
|
#endif // MERCURY_HEAP_PROFILE_H
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|