aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/util/Stats.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2013-10-01 14:21:27 +0200
committerMartin Odersky <odersky@gmail.com>2013-10-01 14:21:27 +0200
commitf039fa7fa2544998426764bd05ea8f18179eb0bd (patch)
tree6f5431d1824702284d16e581eb620a849a1c2f91 /src/dotty/tools/dotc/util/Stats.scala
parentb733e929b60fd1b5a3fc961fd23e720679ce09d3 (diff)
downloaddotty-f039fa7fa2544998426764bd05ea8f18179eb0bd.tar.gz
dotty-f039fa7fa2544998426764bd05ea8f18179eb0bd.tar.bz2
dotty-f039fa7fa2544998426764bd05ea8f18179eb0bd.zip
Added option -Yheartbeat
… which shows snapshot of the callstack of tracked operations at fixed intervals.
Diffstat (limited to 'src/dotty/tools/dotc/util/Stats.scala')
-rw-r--r--src/dotty/tools/dotc/util/Stats.scala43
1 files changed, 42 insertions, 1 deletions
diff --git a/src/dotty/tools/dotc/util/Stats.scala b/src/dotty/tools/dotc/util/Stats.scala
index 68884fdbc..3aa6eb9b9 100644
--- a/src/dotty/tools/dotc/util/Stats.scala
+++ b/src/dotty/tools/dotc/util/Stats.scala
@@ -1,7 +1,48 @@
-package dotty.tools.dotc.util
+package dotty.tools.dotc
+package util
+
+import core.Contexts._
object Stats {
final val enabled = true
+ /** The period in ms in which stack snapshots are displayed */
+ final val HeartBeatPeriod = 250
+
+ @volatile private var stack: List[String] = Nil
+
+ def track[T](fn: String)(op: => T) = {
+ stack = fn :: stack
+ try op
+ finally stack = stack.tail
+ }
+
+ class HeartBeat extends Thread() {
+ @volatile private[Stats] var continue = true
+
+ private def printStack(stack: List[String]): Unit = stack match {
+ case str :: rest =>
+ printStack(rest)
+ print(s"-> $str ")
+ case Nil =>
+ println()
+ print("|")
+ }
+
+ override final def run() {
+ Thread.sleep(HeartBeatPeriod)
+ printStack(stack)
+ if (continue) run()
+ }
+ }
+
+ def monitorHeartBeat[T](op: => T)(implicit ctx: Context) = {
+ if (ctx.settings.Yheartbeat.value) {
+ var hb = new HeartBeat()
+ hb.start()
+ try op
+ finally hb.continue = false
+ } else op
+ }
} \ No newline at end of file