X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FProftimer.c;h=3b499152d66b768e682ec7b8947e07b5d6438720;hb=45252b35151fc55aa19fb6770df5ed8267639083;hp=b93123a784061bcb0ec8b9aa373c0f7e9a25cfa5;hpb=c01bd74591f8e7b5d9c90100a9f64b1c4bfb9238;p=ghc-hetmet.git diff --git a/ghc/rts/Proftimer.c b/ghc/rts/Proftimer.c index b93123a..3b49915 100644 --- a/ghc/rts/Proftimer.c +++ b/ghc/rts/Proftimer.c @@ -1,5 +1,4 @@ /* ----------------------------------------------------------------------------- - * $Id: Proftimer.c,v 1.4 1999/08/04 17:03:41 panne Exp $ * * (c) The GHC Team, 1998-1999 * @@ -7,60 +6,80 @@ * * ---------------------------------------------------------------------------*/ -/* Only have cost centres etc if PROFILING defined */ - #if defined (PROFILING) +#include "PosixSource.h" + #include "Rts.h" -#include "ProfRts.h" -#include "Itimer.h" +#include "Profiling.h" +#include "Timer.h" #include "Proftimer.h" +#include "RtsFlags.h" -lnat total_ticks = 0; +static rtsBool do_prof_ticks = rtsFalse; // enable profiling ticks +static rtsBool do_heap_prof_ticks = rtsFalse; // enable heap profiling ticks -nat current_interval = 1; /* Current interval number -- - stored in AGE */ +// Number of ticks until next heap census +static int ticks_to_heap_profile; -nat interval_ticks = DEFAULT_INTERVAL; /* No of ticks in an interval */ +// Time for a heap profile on the next context switch +rtsBool performHeapProfile; -nat previous_ticks = 0; /* ticks in previous intervals */ -nat current_ticks = 0; /* ticks in current interval */ +void +stopProfTimer( void ) +{ + do_prof_ticks = rtsFalse; +} void -initProfTimer(nat ms) +startProfTimer( void ) { - if (initialize_virtual_timer(ms)) { - fflush(stdout); - fprintf(stderr, "Can't initialize virtual timer.\n"); - stg_exit(EXIT_FAILURE); - } -}; + do_prof_ticks = rtsTrue; +} void -stopProfTimer(void) -{ /* Stops time profile */ - if (time_profiling) { - initProfTimer(0); - } -}; +stopHeapProfTimer( void ) +{ + do_heap_prof_ticks = rtsFalse; +} void -startProfTimer(void) -{ /* Starts time profile */ - if (time_profiling) { - initProfTimer(TICK_MILLISECS); - } -}; +startHeapProfTimer( void ) +{ + if (RtsFlags.ProfFlags.doHeapProfile && + RtsFlags.ProfFlags.profileIntervalTicks > 0) { + do_heap_prof_ticks = rtsTrue; + } +} + +void +initProfTimer( void ) +{ + performHeapProfile = rtsFalse; + + RtsFlags.ProfFlags.profileIntervalTicks = + RtsFlags.ProfFlags.profileInterval / TICK_MILLISECS; + + ticks_to_heap_profile = RtsFlags.ProfFlags.profileIntervalTicks; + + startHeapProfTimer(); +} -/* For a small collection of signal handler prototypes, see - http://web2.airmail.net/sjbaker1/software/signal_collection.html */ void -handleProfTick(int unused) +handleProfTick(void) { - (void)unused; /* no warnings, please */ - CCS_TICK(CCCS); - total_ticks++; -}; + if (do_prof_ticks) { + CCCS->time_ticks++; + } + + if (do_heap_prof_ticks) { + ticks_to_heap_profile--; + if (ticks_to_heap_profile <= 0) { + ticks_to_heap_profile = RtsFlags.ProfFlags.profileIntervalTicks; + performHeapProfile = rtsTrue; + } + } +} #endif /* PROFILING */