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