Bug 716619 - Simplify GC probes (r=sfink)
authorBill McCloskey <wmccloskey@mozilla.com>
Fri, 27 Jan 2012 17:01:04 -0800
changeset 88068 ca20586c4cd4e1ab6a786d20c02770da1cc71f01
parent 88067 5095046dc23cc052fc855cf9b862b3b17b93b208
child 88069 9b81bf7d458c7c36b76d177f9c958e09139bf1b0
push idunknown
push userunknown
push dateunknown
reviewerssfink
bugs716619
milestone12.0a1
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)