ProfilerExcimer: allow early start
authorTim Starling <tstarling@wikimedia.org>
Fri, 7 Dec 2018 04:13:43 +0000 (15:13 +1100)
committerTim Starling <tstarling@wikimedia.org>
Mon, 17 Dec 2018 03:36:28 +0000 (14:36 +1100)
Allow the profiler to be started elsewhere and passed into
ProfilerExcimer via the configuration array. This allows the profiler to
be started in the auto_prepend_file. XHProf doesn't need this because it
has a single global profiler.

Change-Id: I348499a15d9cc42de0ba1a20afc2283b794931a3

includes/profiler/ProfilerExcimer.php

index 776136f..20f9a78 100644 (file)
@@ -5,24 +5,40 @@ class ProfilerExcimer extends Profiler {
        private $realProf;
        private $period;
 
+       /**
+        * @param array $params Associative array of parameters:
+        *    - period: The sampling period
+        *    - maxDepth: The maximum stack depth collected
+        *    - cpuProfiler: A pre-started ExcimerProfiler instance for CPU
+        *      profiling of the entire request including configuration.
+        *    - realProfiler: A pre-started ExcimerProfiler instance for wall
+        *      clock profiling of the entire request.
+        */
        public function __construct( array $params = [] ) {
                parent::__construct( $params );
 
                $this->period = $params['period'] ?? 0.01;
                $maxDepth = $params['maxDepth'] ?? 100;
 
-               $this->cpuProf = new ExcimerProfiler;
-               $this->cpuProf->setEventType( EXCIMER_CPU );
-               $this->cpuProf->setPeriod( $this->period );
-               $this->cpuProf->setMaxDepth( $maxDepth );
-
-               $this->realProf = new ExcimerProfiler;
-               $this->realProf->setEventType( EXCIMER_REAL );
-               $this->realProf->setPeriod( $this->period );
-               $this->realProf->setMaxDepth( $maxDepth );
+               if ( isset( $params['cpuProfiler'] ) ) {
+                       $this->cpuProf = $params['cpuProfiler'];
+               } else {
+                       $this->cpuProf = new ExcimerProfiler;
+                       $this->cpuProf->setEventType( EXCIMER_CPU );
+                       $this->cpuProf->setPeriod( $this->period );
+                       $this->cpuProf->setMaxDepth( $maxDepth );
+                       $this->cpuProf->start();
+               }
 
-               $this->cpuProf->start();
-               $this->realProf->start();
+               if ( isset( $params['realProfiler'] ) ) {
+                       $this->realProf = $params['realProfiler'];
+               } else {
+                       $this->realProf = new ExcimerProfiler;
+                       $this->realProf->setEventType( EXCIMER_REAL );
+                       $this->realProf->setPeriod( $this->period );
+                       $this->realProf->setMaxDepth( $maxDepth );
+                       $this->realProf->start();
+               }
        }
 
        public function scopedProfileIn( $section ) {