/* -----------------------------------------------------------------------------
- * $Id: Stats.c,v 1.18 1999/11/11 13:17:36 simonmar Exp $
+ * $Id: Stats.c,v 1.22 2000/12/04 12:31:21 simonmar Exp $
*
* (c) The GHC Team, 1998-1999
*
#include <unistd.h>
#endif
-#ifndef __MINGW32__
+#ifndef mingw32_TARGET_OS
# ifdef HAVE_SYS_TIMES_H
# include <sys/times.h>
# endif
# endif
#endif
-#if ! irix_TARGET_OS && ! defined(__MINGW32__)
+#if ! irix_TARGET_OS && ! defined(mingw32_TARGET_OS)
# if defined(HAVE_SYS_RESOURCE_H)
# include <sys/resource.h>
# endif
/* mut_user_time_during_GC() and mut_user_time()
*
- * This function can be used to get the current mutator time *during*
- * a GC, i.e. between stat_startGC and stat_endGC. This is used in
- * the heap profiler for accurately time stamping the heap sample.
+ * The former function can be used to get the current mutator time
+ * *during* a GC, i.e. between stat_startGC and stat_endGC. This is
+ * used in the heap profiler for accurately time stamping the heap
+ * sample.
+ *
+ * ATTENTION: mut_user_time_during_GC() relies on GC_start_time being
+ * defined in stat_startGC() - to minimise system calls,
+ * GC_start_time is, however, only defined when really needed (check
+ * stat_startGC() for details)
*/
double
mut_user_time_during_GC(void)
static nat rub_bell = 0;
+/* initialise global variables needed during GC
+ *
+ * * GC_start_time is read in mut_user_time_during_GC(), which in turn is
+ * needed if either PROFILING or DEBUGing is enabled
+ */
void
stat_startGC(void)
{
}
}
+#if defined(PROFILING) || defined(DEBUG)
+ GC_start_time = usertime(); /* needed in mut_user_time_during_GC() */
+#endif
+
if (sf != NULL) {
- GC_start_time = usertime();
+#if !defined(PROFILING) && !defined(DEBUG)
+ GC_start_time = usertime();
+#endif
GCe_start_time = elapsedtime();
if (RtsFlags.GcFlags.giveStats) {
GC_start_faults = pagefaults();
if (sf != NULL) {
double time = usertime();
double etime = elapsedtime();
- double gc_time = time-GC_start_time;
- double gc_etime = etime-GCe_start_time;
+ double gc_time = time - GC_start_time;
+ double gc_etime = etime - GCe_start_time;
if (RtsFlags.GcFlags.giveStats >= VERBOSE_GC_STATS) {
nat faults = pagefaults();
gc_time,
gc_etime,
time,
- etime,
+ etime - ElapsedTimeStart,
faults - GC_start_faults,
GC_start_faults - GC_end_faults,
gen);
fflush(sf);
}
- GC_coll_times[gen] += time-GC_start_time;
+ GC_coll_times[gen] += gc_time;
GC_tot_copied += (ullong) copied;
GC_tot_alloc += (ullong) alloc;
nat i;
pthread_t me = pthread_self();
- for (i = 0; i < RtsFlags.ConcFlags.nNodes; i++) {
+ for (i = 0; i < RtsFlags.ParFlags.nNodes; i++) {
if (me == task_ids[i].id) {
task_ids[i].gc_time += gc_time;
task_ids[i].gc_etime += gc_etime;
nat i;
pthread_t me = pthread_self();
- for (i = 0; i < RtsFlags.ConcFlags.nNodes; i++) {
+ for (i = 0; i < RtsFlags.ParFlags.nNodes; i++) {
if (task_ids[i].id == me) {
task_ids[i].mut_time = usertime() - task_ids[i].gc_time;
task_ids[i].mut_etime = elapsedtime()
{
nat i;
MutUserTime = 0.0;
- for (i = 0; i < RtsFlags.ConcFlags.nNodes; i++) {
+ for (i = 0; i < RtsFlags.ParFlags.nNodes; i++) {
MutUserTime += task_ids[i].mut_time;
fprintf(sf, " Task %2d: MUT time: %6.2fs (%6.2fs elapsed)\n"
" GC time: %6.2fs (%6.2fs elapsed)\n\n",
}
fprintf(stderr,"\n");
}
+
+/* -----------------------------------------------------------------------------
+ Stats available via a programmatic interface, so eg. GHCi can time
+ each compilation and expression evaluation.
+ -------------------------------------------------------------------------- */
+
+extern HsInt getAllocations( void )
+{ return (HsInt)(total_allocated * sizeof(W_)); }