/ bytecode / SuperSampler.cpp
SuperSampler.cpp
  1  /*
  2   * Copyright (C) 2016 Apple Inc. All rights reserved.
  3   *
  4   * Redistribution and use in source and binary forms, with or without
  5   * modification, are permitted provided that the following conditions
  6   * are met:
  7   * 1. Redistributions of source code must retain the above copyright
  8   *    notice, this list of conditions and the following disclaimer.
  9   * 2. Redistributions in binary form must reproduce the above copyright
 10   *    notice, this list of conditions and the following disclaimer in the
 11   *    documentation and/or other materials provided with the distribution.
 12   *
 13   * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
 14   * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 15   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 16   * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
 17   * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 18   * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 19   * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 20   * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 21   * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 22   * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 23   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
 24   */
 25  
 26  #include "config.h"
 27  #include "SuperSampler.h"
 28  
 29  #include "Options.h"
 30  #include <wtf/DataLog.h>
 31  #include <wtf/Lock.h>
 32  #include <wtf/Threading.h>
 33  
 34  namespace JSC {
 35  
 36  volatile uint32_t g_superSamplerCount;
 37  volatile bool g_superSamplerEnabled;
 38  
 39  static Lock lock;
 40  static double in;
 41  static double out;
 42  
 43  void initializeSuperSampler()
 44  {
 45      if (!Options::useSuperSampler())
 46          return;
 47  
 48      Thread::create(
 49          "JSC Super Sampler",
 50          [] () {
 51              const int sleepQuantum = 3;
 52              const int printingPeriod = 3000;
 53              for (;;) {
 54                  for (int ms = 0; ms < printingPeriod; ms += sleepQuantum) {
 55                      if (g_superSamplerEnabled) {
 56                          LockHolder locker(lock);
 57                          if (g_superSamplerCount)
 58                              in++;
 59                          else
 60                              out++;
 61                      }
 62                      sleep(Seconds::fromMilliseconds(sleepQuantum));
 63                  }
 64                  printSuperSamplerState();
 65                  if (static_cast<int32_t>(g_superSamplerCount) < 0)
 66                      dataLog("WARNING: Super sampler undercount detected!\n");
 67              }
 68          });
 69  }
 70  
 71  void resetSuperSamplerState()
 72  {
 73      LockHolder locker(lock);
 74      in = 0;
 75      out = 0;
 76  }
 77  
 78  void printSuperSamplerState()
 79  {
 80      if (!Options::useSuperSampler())
 81          return;
 82  
 83      LockHolder locker(lock);
 84      double percentage = 100.0 * in / (in + out);
 85      if (percentage != percentage)
 86          percentage = 0.0;
 87      dataLog("Percent time behind super sampler flag: ", percentage, "\n");
 88  }
 89  
 90  void enableSuperSampler()
 91  {
 92      LockHolder locker(lock);
 93      g_superSamplerEnabled = true;
 94  }
 95  
 96  void disableSuperSampler()
 97  {
 98      LockHolder locker(lock);
 99      g_superSamplerEnabled = false;
100  }
101  
102  } // namespace JSC
103