Bug 716619 - Simplify GC probes (r=sfink)
authorBill McCloskey <wmccloskey@mozilla.com>
Fri, 27 Jan 2012 17:01:04 -0800
changeset 85577 ca20586c4cd4e1ab6a786d20c02770da1cc71f01
parent 85576 5095046dc23cc052fc855cf9b862b3b17b93b208
child 85578 9b81bf7d458c7c36b76d177f9c958e09139bf1b0
push id5407
push userwmccloskey@mozilla.com
push dateSat, 28 Jan 2012 01:01:43 +0000
treeherdermozilla-inbound@9b81bf7d458c [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewerssfink
bugs716619
milestone12.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 716619 - Simplify GC probes (r=sfink)
js/src/ETWProvider.man
js/src/gc/Statistics.cpp
js/src/jsprobes.h
--- a/js/src/ETWProvider.man
+++ b/js/src/ETWProvider.man
@@ -74,39 +74,39 @@
           <event symbol="EvtObjectResize" value="1011" version="1"
                  channel="MozillaChannel" level="win:Verbose"
                  template="ObjectResizeTemplate" task="Allocation" opcode="ObjectResize"
                  keywords="SampleKeyword" message="$(string.SampleProvider.SampleEvent.message)"/>
 
           <!-- GC -->
           <event symbol="EvtGCStart" value="1012" version="1"
                  channel="MozillaChannel" level="win:Informational"
-                 template="CompartmentTemplate" task="Allocation" opcode="GCStart"
+                 template="VoidTemplate" task="Allocation" opcode="GCStart"
                  keywords="SampleKeyword" message="$(string.SampleProvider.SampleEvent.message)"/>
           <event symbol="EvtGCEnd" value="1013" version="1"
                  channel="MozillaChannel" level="win:Informational"
-                 template="CompartmentTemplate" task="Allocation" opcode="GCEnd"
+                 template="VoidTemplate" task="Allocation" opcode="GCEnd"
                  keywords="SampleKeyword" message="$(string.SampleProvider.SampleEvent.message)"/>
 
           <event symbol="EvtGCStartMarkPhase" value="1014" version="1"
                  channel="MozillaChannel" level="win:Informational"
-                 template="CompartmentTemplate" task="Allocation" opcode="GCMarkStart"
+                 template="VoidTemplate" task="Allocation" opcode="GCMarkStart"
                  keywords="SampleKeyword" message="$(string.SampleProvider.SampleEvent.message)"/>
           <event symbol="EvtGCEndMarkPhase" value="1015" version="1"
                  channel="MozillaChannel" level="win:Informational"
-                 template="CompartmentTemplate" task="Allocation" opcode="GCMarkEnd"
+                 template="VoidTemplate" task="Allocation" opcode="GCMarkEnd"
                  keywords="SampleKeyword" message="$(string.SampleProvider.SampleEvent.message)"/>
                     
           <event symbol="EvtGCStartSweepPhase" value="1016" version="1"
                  channel="MozillaChannel" level="win:Informational"
-                 template="CompartmentTemplate" task="Allocation" opcode="GCSweepStart"
+                 template="VoidTemplate" task="Allocation" opcode="GCSweepStart"
                  keywords="SampleKeyword" message="$(string.SampleProvider.SampleEvent.message)"/>
           <event symbol="EvtGCEndSweepPhase" value="1017" version="1"
                  channel="MozillaChannel" level="win:Informational"
-                 template="CompartmentTemplate" task="Allocation" opcode="GCSweepEnd"
+                 template="VoidTemplate" task="Allocation" opcode="GCSweepEnd"
                  keywords="SampleKeyword" message="$(string.SampleProvider.SampleEvent.message)"/>
 
           <event symbol="EvtMemoryAcquire" value="1018" version="1"
                  channel="MozillaChannel" level="win:Verbose"
                  template="MemoryLocationTemplate" task="Allocation" opcode="AcquireMemory"
                  keywords="SampleKeyword" message="$(string.SampleProvider.SampleEvent.message)"/>
           <event symbol="EvtMemoryRelease" value="1019" version="1"
                  channel="MozillaChannel" level="win:Verbose"
@@ -226,20 +226,16 @@
             <data name="Size" inType="win:Int64" outType="xs:long"/>
           </template>
 
           <template tid="StringFinalizeTemplate">
             <data name="Address" inType="win:Int64" outType="xs:long"/>
             <data name="Size" inType="win:Int64" outType="xs:long"/>
           </template>
 
-          <template tid="CompartmentTemplate">
-            <data name="Compartment" inType="win:Int64" outType="xs:long"/>
-          </template>
-
           <template tid="MemoryLocationTemplate">
             <data name="Compartment" inType="win:Int64" outType="xs:long"/>
             <data name="Address" inType="win:Int64" outType="xs:long"/>
             <data name="Size" inType="win:Int64" outType="xs:long"/>
           </template>
 
           <template tid="HeapResizeTemplate">
             <data name="Compartment" inType="win:Int64" outType="xs:long"/>
@@ -254,16 +250,19 @@
           <template tid="StringTemplate">
             <data name="String" inType="win:UnicodeString" outType="xs:string"/>
           </template>
 
           <template tid="IntTemplate">
             <data name="Int" inType="win:Int32" outType="xs:int"/>
           </template>
 
+          <template tid="VoidTemplate">
+          </template>
+
         </templates>
       </provider>
     </events>
   </instrumentation>
 
   <localization>
     <resources culture="en-US">
       <stringTable>
--- a/js/src/gc/Statistics.cpp
+++ b/js/src/gc/Statistics.cpp
@@ -201,17 +201,17 @@ Statistics::beginGC(JSCompartment *comp,
 
     PodArrayZero(phaseStarts);
     PodArrayZero(phaseEnds);
     PodArrayZero(phaseTimes);
 
     triggerReason = reason;
 
     beginPhase(PHASE_GC);
-    Probes::GCStart(compartment);
+    Probes::GCStart();
 
     GCCrashData crashData;
     crashData.isCompartment = !!compartment;
     crash::SaveCrashData(crash::JS_CRASH_TAG_GC, &crashData, sizeof(crashData));
 }
 
 double
 Statistics::t(Phase phase)
@@ -278,17 +278,17 @@ Statistics::printStats()
                 t(PHASE_GC), t(PHASE_MARK), t(PHASE_SWEEP));
     }
     fflush(fp);
 }
 
 void
 Statistics::endGC()
 {
-    Probes::GCEnd(compartment);
+    Probes::GCEnd();
     endPhase(PHASE_GC);
     crash::SnapshotGCStack();
 
     for (int i = 0; i < PHASE_LIMIT; i++)
         totals[i] += phaseTimes[i];
 
     if (JSAccumulateTelemetryDataCallback cb = runtime->telemetryCallback) {
         (*cb)(JS_TELEMETRY_GC_REASON, triggerReason);
@@ -310,40 +310,28 @@ Statistics::endGC()
     PodArrayZero(counts);
 }
 
 void
 Statistics::beginPhase(Phase phase)
 {
     phaseStarts[phase] = PRMJ_Now();
 
-    if (phase == gcstats::PHASE_SWEEP) {
-        Probes::GCStartSweepPhase(NULL);
-        if (!compartment) {
-            for (JSCompartment **c = runtime->compartments.begin();
-                 c != runtime->compartments.end(); ++c)
-            {
-                Probes::GCStartSweepPhase(*c);
-            }
-        }
-    }
+    if (phase == gcstats::PHASE_MARK)
+        Probes::GCStartMarkPhase();
+    else if (phase == gcstats::PHASE_SWEEP)
+        Probes::GCStartSweepPhase();
 }
 
 void
 Statistics::endPhase(Phase phase)
 {
     phaseEnds[phase] = PRMJ_Now();
     phaseTimes[phase] += phaseEnds[phase] - phaseStarts[phase];
 
-    if (phase == gcstats::PHASE_SWEEP) {
-        if (!compartment) {
-            for (JSCompartment **c = runtime->compartments.begin();
-                 c != runtime->compartments.end(); ++c)
-            {
-                Probes::GCEndSweepPhase(*c);
-            }
-        }
-        Probes::GCEndSweepPhase(NULL);
-    }
+    if (phase == gcstats::PHASE_MARK)
+        Probes::GCEndMarkPhase();
+    else if (phase == gcstats::PHASE_SWEEP)
+        Probes::GCEndSweepPhase();
 }
 
 } /* namespace gcstats */
 } /* namespace js */
--- a/js/src/jsprobes.h
+++ b/js/src/jsprobes.h
@@ -185,31 +185,31 @@ bool calloutEnd(JSContext *cx, JSFunctio
 /* Unimplemented */
 bool acquireMemory(JSContext *cx, void *address, size_t nbytes);
 bool releaseMemory(JSContext *cx, void *address, size_t nbytes);
 
 /*
  * Garbage collection probes
  *
  * GC timing is tricky and at the time of this writing is changing frequently.
- * GCStart(NULL)/GCEnd(NULL) are intended to bracket the entire garbage
- * collection (either global or single-compartment), but a separate thread may
- * continue doing work after GCEnd.
+ * GCStart/GCEnd are intended to bracket the entire garbage collection (either
+ * global or single-compartment), but a separate thread may continue doing work
+ * after GCEnd.
  *
  * Multiple compartments' GC will be interleaved during a global collection
  * (eg, compartment 1 starts, compartment 2 starts, compartment 1 ends, ...)
  */
-bool GCStart(JSCompartment *compartment);
-bool GCEnd(JSCompartment *compartment);
+bool GCStart();
+bool GCEnd();
 
-bool GCStartMarkPhase(JSCompartment *compartment);
-bool GCEndMarkPhase(JSCompartment *compartment);
+bool GCStartMarkPhase();
+bool GCEndMarkPhase();
 
-bool GCStartSweepPhase(JSCompartment *compartment);
-bool GCEndSweepPhase(JSCompartment *compartment);
+bool GCStartSweepPhase();
+bool GCEndSweepPhase();
 
 /*
  * Various APIs for inserting custom probe points. These might be used to mark
  * when something starts and stops, or for various other purposes the user has
  * in mind. These are useful to export to JS so that JS code can mark
  * application-meaningful events and phases of execution.
  *
  * Not all backends support these.
@@ -358,22 +358,22 @@ bool ETWResizeObject(JSContext *cx, JSOb
 bool ETWCreateString(JSContext *cx, JSString *string, size_t length);
 bool ETWFinalizeString(JSString *string);
 bool ETWCompileScriptBegin(const char *filename, int lineno);
 bool ETWCompileScriptEnd(const char *filename, int lineno);
 bool ETWCalloutBegin(JSContext *cx, JSFunction *fun);
 bool ETWCalloutEnd(JSContext *cx, JSFunction *fun);
 bool ETWAcquireMemory(JSContext *cx, void *address, size_t nbytes);
 bool ETWReleaseMemory(JSContext *cx, void *address, size_t nbytes);
-bool ETWGCStart(JSCompartment *compartment);
-bool ETWGCEnd(JSCompartment *compartment);
-bool ETWGCStartMarkPhase(JSCompartment *compartment);
-bool ETWGCEndMarkPhase(JSCompartment *compartment);
-bool ETWGCStartSweepPhase(JSCompartment *compartment);
-bool ETWGCEndSweepPhase(JSCompartment *compartment);
+bool ETWGCStart();
+bool ETWGCEnd();
+bool ETWGCStartMarkPhase();
+bool ETWGCEndMarkPhase();
+bool ETWGCStartSweepPhase();
+bool ETWGCEndSweepPhase();
 bool ETWCustomMark(JSString *string);
 bool ETWCustomMark(const char *string);
 bool ETWCustomMark(int marker);
 bool ETWStartExecution(JSContext *cx, JSScript *script);
 bool ETWStopExecution(JSContext *cx, JSScript *script);
 bool ETWResizeHeap(JSCompartment *compartment, size_t oldSize, size_t newSize);
 #endif
 
@@ -639,87 +639,87 @@ Probes::releaseMemory(JSContext *cx, voi
     if (ProfilingActive && !ETWReleaseMemory(cx, address, nbytes))
         ok = false;
 #endif
 
     return ok;
 }
 
 inline bool
-Probes::GCStart(JSCompartment *compartment)
+Probes::GCStart()
 {
     bool ok = true;
 
 #ifdef MOZ_ETW
-    if (ProfilingActive && !ETWGCStart(compartment))
+    if (ProfilingActive && !ETWGCStart())
         ok = false;
 #endif
 
     return ok;
 }
 
 inline bool
-Probes::GCEnd(JSCompartment *compartment)
+Probes::GCEnd()
 {
     bool ok = true;
 
 #ifdef MOZ_ETW
-    if (ProfilingActive && !ETWGCEnd(compartment))
+    if (ProfilingActive && !ETWGCEnd())
         ok = false;
 #endif
 
     return ok;
 }
 
 inline bool
-Probes::GCStartMarkPhase(JSCompartment *compartment)
+Probes::GCStartMarkPhase()
 {
     bool ok = true;
 
 #ifdef MOZ_ETW
-    if (ProfilingActive && !ETWGCStartMarkPhase(compartment))
+    if (ProfilingActive && !ETWGCStartMarkPhase())
         ok = false;
 #endif
 
     return ok;
 }
 
 inline bool
-Probes::GCEndMarkPhase(JSCompartment *compartment)
+Probes::GCEndMarkPhase()
 {
     bool ok = true;
 
 #ifdef MOZ_ETW
-    if (ProfilingActive && !ETWGCEndMarkPhase(compartment))
+    if (ProfilingActive && !ETWGCEndMarkPhase())
         ok = false;
 #endif
 
     return ok;
 }
 
 inline bool
-Probes::GCStartSweepPhase(JSCompartment *compartment)
+Probes::GCStartSweepPhase()
 {
     bool ok = true;
 
 #ifdef MOZ_ETW
-    if (ProfilingActive && !ETWGCStartSweepPhase(compartment))
+    if (ProfilingActive && !ETWGCStartSweepPhase())
         ok = false;
 #endif
 
     return ok;
 }
 
 inline bool
-Probes::GCEndSweepPhase(JSCompartment *compartment)
+Probes::GCEndSweepPhase()
 {
     bool ok = true;
 
 #ifdef MOZ_ETW
-    if (ProfilingActive && !ETWGCEndSweepPhase(compartment))
+    if (ProfilingActive && !ETWGCEndSweepPhase())
         ok = false;
 #endif
 
     return ok;
 }
 
 inline bool
 Probes::CustomMark(JSString *string)