@@ -5,6 +5,8 @@ import java.lang.management.ManagementFactory
5
5
import java .nio .file .{Files , Path }
6
6
import java .util .concurrent .TimeUnit
7
7
8
+ import scala .collection .mutable
9
+
8
10
object ChromeTrace {
9
11
10
12
private object EventType {
@@ -27,24 +29,26 @@ object ChromeTrace {
27
29
final class ChromeTrace (f : Path ) extends Closeable {
28
30
import ChromeTrace .EventType
29
31
private val traceWriter = Files .newBufferedWriter(f)
32
+ private val context = mutable.ArrayStack [JsonContext ](TopContext )
33
+
30
34
objStart()
31
35
fld(" traceEvents" )
36
+ context.push(ValueContext )
32
37
arrStart()
33
38
traceWriter.write(" \n " )
34
39
35
- private val pid = ManagementFactory .getRuntimeMXBean().getName()
40
+ private val pid = ManagementFactory .getRuntimeMXBean().getName().replaceAll( " @.* " , " " )
36
41
37
42
override def close (): Unit = {
38
- traceWriter.append(" \n " )
39
43
arrEnd()
40
44
objEnd()
45
+ context.pop()
41
46
traceWriter.close()
42
47
}
43
48
44
49
def traceDurationEvent (name : String , startNanos : Long , durationNanos : Long , tid : String = this .tid()): Unit = {
45
50
val durationMicros = nanosToMicros(durationNanos)
46
51
val startMicros = nanosToMicros(startNanos)
47
- commaIfFirst()
48
52
objStart()
49
53
str(" cat" , " scalac" )
50
54
str(" name" , name)
@@ -58,7 +62,6 @@ final class ChromeTrace(f: Path) extends Closeable {
58
62
}
59
63
60
64
def traceCounterEvent (name : String , counterName : String , count : Long ): Unit = {
61
- commaIfFirst()
62
65
objStart()
63
66
str(" cat" , " scalac" )
64
67
str(" name" , name)
@@ -78,7 +81,6 @@ final class ChromeTrace(f: Path) extends Closeable {
78
81
def traceDurationEventEnd (name : String , colour : String = " " ): Unit = traceAsyncEvent(EventType .Finished , name, colour)
79
82
80
83
private def traceAsyncEvent (eventType : String , name : String , colour : String ): Unit = {
81
- commaIfFirst()
82
84
objStart()
83
85
str(" cat" , " scalac" )
84
86
str(" name" , name)
@@ -99,14 +101,15 @@ final class ChromeTrace(f: Path) extends Closeable {
99
101
100
102
private def microTime (): Long = nanosToMicros(System .nanoTime())
101
103
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
107
109
108
110
private def str (name : String , value : String ): Unit = {
109
111
fld(name)
112
+ traceWriter.write(" \" " )
110
113
traceWriter.write(value) // This assumes no escaping is needed
111
114
traceWriter.write(" \" " )
112
115
}
@@ -115,15 +118,40 @@ final class ChromeTrace(f: Path) extends Closeable {
115
118
traceWriter.write(String .valueOf(value))
116
119
traceWriter.write(" " )
117
120
}
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
+ }
122
143
123
144
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
+ }
124
152
traceWriter.write(" \" " )
125
153
traceWriter.write(name)
126
154
traceWriter.write(" \" " )
127
- traceWriter.write(" : " )
155
+ traceWriter.write(" :" )
128
156
}
129
157
}
0 commit comments