@@ -5,6 +5,8 @@ import java.lang.management.ManagementFactory
55import java .nio .file .{Files , Path }
66import java .util .concurrent .TimeUnit
77
8+ import scala .collection .mutable
9+
810object ChromeTrace {
911
1012 private object EventType {
@@ -27,24 +29,26 @@ object ChromeTrace {
2729final class ChromeTrace (f : Path ) extends Closeable {
2830 import ChromeTrace .EventType
2931 private val traceWriter = Files .newBufferedWriter(f)
32+ private val context = mutable.ArrayStack [JsonContext ](TopContext )
33+
3034 objStart()
3135 fld(" traceEvents" )
36+ context.push(ValueContext )
3237 arrStart()
3338 traceWriter.write(" \n " )
3439
35- private val pid = ManagementFactory .getRuntimeMXBean().getName()
40+ private val pid = ManagementFactory .getRuntimeMXBean().getName().replaceAll( " @.* " , " " )
3641
3742 override def close (): Unit = {
38- traceWriter.append(" \n " )
3943 arrEnd()
4044 objEnd()
45+ context.pop()
4146 traceWriter.close()
4247 }
4348
4449 def traceDurationEvent (name : String , startNanos : Long , durationNanos : Long , tid : String = this .tid()): Unit = {
4550 val durationMicros = nanosToMicros(durationNanos)
4651 val startMicros = nanosToMicros(startNanos)
47- commaIfFirst()
4852 objStart()
4953 str(" cat" , " scalac" )
5054 str(" name" , name)
@@ -58,7 +62,6 @@ final class ChromeTrace(f: Path) extends Closeable {
5862 }
5963
6064 def traceCounterEvent (name : String , counterName : String , count : Long ): Unit = {
61- commaIfFirst()
6265 objStart()
6366 str(" cat" , " scalac" )
6467 str(" name" , name)
@@ -78,7 +81,6 @@ final class ChromeTrace(f: Path) extends Closeable {
7881 def traceDurationEventEnd (name : String , colour : String = " " ): Unit = traceAsyncEvent(EventType .Finished , name, colour)
7982
8083 private def traceAsyncEvent (eventType : String , name : String , colour : String ): Unit = {
81- commaIfFirst()
8284 objStart()
8385 str(" cat" , " scalac" )
8486 str(" name" , name)
@@ -99,14 +101,15 @@ final class ChromeTrace(f: Path) extends Closeable {
99101
100102 private def microTime (): Long = nanosToMicros(System .nanoTime())
101103
102- private def commaIfFirst () : Unit = {
103- if (firstEvent) firstEvent = false else traceWriter.write( " , " )
104- }
105-
106- private var firstEvent = true
104+ sealed abstract class JsonContext
105+ case class ArrayContext ( var first : Boolean ) extends JsonContext
106+ case class ObjectContext ( var first : Boolean ) extends JsonContext
107+ case object ValueContext extends JsonContext
108+ case object TopContext extends JsonContext
107109
108110 private def str (name : String , value : String ): Unit = {
109111 fld(name)
112+ traceWriter.write(" \" " )
110113 traceWriter.write(value) // This assumes no escaping is needed
111114 traceWriter.write(" \" " )
112115 }
@@ -115,15 +118,40 @@ final class ChromeTrace(f: Path) extends Closeable {
115118 traceWriter.write(String .valueOf(value))
116119 traceWriter.write(" " )
117120 }
118- private def objStart (): Unit = traceWriter.write(" {" )
119- private def objEnd (): Unit = traceWriter.write(" }" )
120- private def arrStart (): Unit = traceWriter.write(" [" )
121- private def arrEnd (): Unit = traceWriter.write(" ]" )
121+ private def objStart (): Unit = {
122+ context.top match {
123+ case ac @ ArrayContext (first) =>
124+ if (first) ac.first = false
125+ else traceWriter.write(" ," )
126+ case _ =>
127+ }
128+ context.push(ObjectContext (true ))
129+ traceWriter.write(" {" )
130+ }
131+ private def objEnd (): Unit = {
132+ traceWriter.write(" }" )
133+ context.pop()
134+ }
135+ private def arrStart (): Unit = {
136+ traceWriter.write(" [" )
137+ context.push(ArrayContext (true ))
138+ }
139+ private def arrEnd (): Unit = {
140+ traceWriter.write(" ]" )
141+ context.pop()
142+ }
122143
123144 private def fld (name : String ) = {
145+ context.top match {
146+ case oc @ ObjectContext (first) =>
147+ if (first) oc.first = false
148+ else traceWriter.write(" ," )
149+ case context =>
150+ throw new IllegalStateException (" Wrong context: " + context)
151+ }
124152 traceWriter.write(" \" " )
125153 traceWriter.write(name)
126154 traceWriter.write(" \" " )
127- traceWriter.write(" : " )
155+ traceWriter.write(" :" )
128156 }
129157}
0 commit comments