Skip to content

Commit db6c49e

Browse files
committed
WIP
1 parent 199da83 commit db6c49e

File tree

1 file changed

+48
-16
lines changed

1 file changed

+48
-16
lines changed

src/reflect/scala/reflect/internal/util/ChromeTrace.scala

Lines changed: 48 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@ package scala.reflect.internal.util
33
import java.io.Closeable
44
import java.lang.management.ManagementFactory
55
import java.nio.file.{Files, Path}
6+
import java.util
67
import java.util.concurrent.TimeUnit
78

9+
import scala.collection.mutable
10+
811
object ChromeTrace {
912

1013
private object EventType {
@@ -27,24 +30,29 @@ object ChromeTrace {
2730
final class ChromeTrace(f: Path) extends Closeable {
2831
import ChromeTrace.EventType
2932
private val traceWriter = Files.newBufferedWriter(f)
33+
private val context = mutable.ArrayStack[JsonContext](TopContext)
34+
private val tidCache = new ThreadLocal[String]() {
35+
override def initialValue(): String = Thread.currentThread().getId.formatted("%05d")
36+
}
3037
objStart()
3138
fld("traceEvents")
39+
context.push(ValueContext)
3240
arrStart()
3341
traceWriter.write("\n")
3442

35-
private val pid = ManagementFactory.getRuntimeMXBean().getName()
43+
private val pid = ManagementFactory.getRuntimeMXBean().getName().replaceAll("@.*", "")
3644

3745
override def close(): Unit = {
38-
traceWriter.append("\n")
3946
arrEnd()
4047
objEnd()
48+
context.pop()
49+
tidCache.remove()
4150
traceWriter.close()
4251
}
4352

4453
def traceDurationEvent(name: String, startNanos: Long, durationNanos: Long, tid: String = this.tid()): Unit = {
4554
val durationMicros = nanosToMicros(durationNanos)
4655
val startMicros = nanosToMicros(startNanos)
47-
commaIfFirst()
4856
objStart()
4957
str("cat", "scalac")
5058
str("name", name)
@@ -58,7 +66,6 @@ final class ChromeTrace(f: Path) extends Closeable {
5866
}
5967

6068
def traceCounterEvent(name: String, counterName: String, count: Long): Unit = {
61-
commaIfFirst()
6269
objStart()
6370
str("cat", "scalac")
6471
str("name", name)
@@ -78,7 +85,6 @@ final class ChromeTrace(f: Path) extends Closeable {
7885
def traceDurationEventEnd(name: String, colour: String = ""): Unit = traceAsyncEvent(EventType.Finished, name, colour)
7986

8087
private def traceAsyncEvent(eventType: String, name: String, colour: String): Unit = {
81-
commaIfFirst()
8288
objStart()
8389
str("cat", "scalac")
8490
str("name", name)
@@ -93,20 +99,21 @@ final class ChromeTrace(f: Path) extends Closeable {
9399
traceWriter.write("\n")
94100
}
95101

96-
private def tid() = Thread.currentThread().getId.toString
102+
private def tid(): String = tidCache.get()
97103

98104
private def nanosToMicros(t: Long): Long = TimeUnit.NANOSECONDS.toMicros(t)
99105

100106
private def microTime(): Long = nanosToMicros(System.nanoTime())
101107

102-
private def commaIfFirst(): Unit = {
103-
if (firstEvent) firstEvent = false else traceWriter.write(",")
104-
}
105-
106-
private var firstEvent = true
108+
sealed abstract class JsonContext
109+
case class ArrayContext(var first: Boolean) extends JsonContext
110+
case class ObjectContext(var first: Boolean) extends JsonContext
111+
case object ValueContext extends JsonContext
112+
case object TopContext extends JsonContext
107113

108114
private def str(name: String, value: String): Unit = {
109115
fld(name)
116+
traceWriter.write("\"")
110117
traceWriter.write(value) // This assumes no escaping is needed
111118
traceWriter.write("\"")
112119
}
@@ -115,15 +122,40 @@ final class ChromeTrace(f: Path) extends Closeable {
115122
traceWriter.write(String.valueOf(value))
116123
traceWriter.write("")
117124
}
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("]")
125+
private def objStart(): Unit = {
126+
context.top match {
127+
case ac @ ArrayContext(first) =>
128+
if (first) ac.first = false
129+
else traceWriter.write(",")
130+
case _ =>
131+
}
132+
context.push(ObjectContext(true))
133+
traceWriter.write("{")
134+
}
135+
private def objEnd(): Unit = {
136+
traceWriter.write("}")
137+
context.pop()
138+
}
139+
private def arrStart(): Unit = {
140+
traceWriter.write("[")
141+
context.push(ArrayContext(true))
142+
}
143+
private def arrEnd(): Unit = {
144+
traceWriter.write("]")
145+
context.pop()
146+
}
122147

123148
private def fld(name: String) = {
149+
context.top match {
150+
case oc @ ObjectContext(first) =>
151+
if (first) oc.first = false
152+
else traceWriter.write(",")
153+
case context =>
154+
throw new IllegalStateException("Wrong context: " + context)
155+
}
124156
traceWriter.write("\"")
125157
traceWriter.write(name)
126158
traceWriter.write("\"")
127-
traceWriter.write(": ")
159+
traceWriter.write(":")
128160
}
129161
}

0 commit comments

Comments
 (0)