Index: chrome/browser/chrome_browser_main_mac.mm |
=================================================================== |
--- chrome/browser/chrome_browser_main_mac.mm (revision 167190) |
+++ chrome/browser/chrome_browser_main_mac.mm (working copy) |
@@ -5,6 +5,7 @@ |
#include "chrome/browser/chrome_browser_main_mac.h" |
#import <Cocoa/Cocoa.h> |
+#include <sys/sysctl.h> |
#include "base/command_line.h" |
#include "base/debug/debugger.h" |
@@ -12,6 +13,7 @@ |
#include "base/mac/bundle_locations.h" |
#include "base/mac/mac_util.h" |
#include "base/memory/scoped_nsobject.h" |
+#include "base/metrics/histogram.h" |
#include "base/path_service.h" |
#include "chrome/app/breakpad_mac.h" |
#import "chrome/browser/app_controller_mac.h" |
@@ -49,6 +51,103 @@ |
@"KeychainReauthorizeAtUpdateMay2012"; |
const int kKeychainReauthorizeAtUpdateMaxTries = 3; |
+// This is one enum instead of two so that the values can be correlated in a |
+// histogram. |
+enum CatSixtyFour { |
+ // Older than any expected cat. |
+ SABER_TOOTHED_CAT_32 = 0, |
+ SABER_TOOTHED_CAT_64, |
+ |
+ // Known cats. |
+ SNOW_LEOPARD_32, |
+ SNOW_LEOPARD_64, |
+ LION_32, // Unexpected, Lion requires a 64-bit CPU. |
+ LION_64, |
+ MOUNTAIN_LION_32, // Unexpected, Mountain Lion requires a 64-bit CPU. |
+ MOUNTAIN_LION_64, |
+ |
+ // DON'T add new constants here. It's important to keep the constant values, |
+ // um, constant. Add new constants at the bottom. |
+ |
+ // Newer than any known cat. |
+ FUTURE_CAT_32, // Unexpected, it's unlikely Apple will un-obsolete old CPUs. |
+ FUTURE_CAT_64, |
+ |
+ // What if the bitsiness of the CPU can't be determined? |
+ SABER_TOOTHED_CAT_DUNNO, |
+ SNOW_LEOPARD_DUNNO, |
+ LION_DUNNO, |
+ MOUNTAIN_LION_DUNNO, |
+ FUTURE_CAT_DUNNO, |
+ |
+ // Add new constants here. |
+ |
+ CAT_SIXTY_FOUR_MAX |
+}; |
+ |
+CatSixtyFour CatSixtyFourValue() { |
+#if defined(ARCH_CPU_64_BITS) |
+ // If 64-bit code is running, then it's established that this CPU can run |
+ // 64-bit code, and no further inquiry is necessary. |
+ int cpu64 = 1; |
+ bool cpu64_known = true; |
+#else |
+ // Check a sysctl conveniently provided by the kernel that identifies |
+ // whether the CPU supports 64-bit operation. Note that this tests the |
+ // actual hardware capabilities, not the bitsiness of the running process, |
+ // and not the bitsiness of the running kernel. The value thus determines |
+ // whether the CPU is capable of running 64-bit programs (in the presence of |
+ // proper OS runtime support) without regard to whether the current program |
+ // is 64-bit (it may not be) or whether the current kernel is (the kernel |
+ // can launch cross-bitted user-space tasks). |
+ |
+ int cpu64; |
+ size_t len = sizeof(cpu64); |
+ const char kSysctlName[] = "hw.cpu64bit_capable"; |
+ bool cpu64_known = sysctlbyname(kSysctlName, &cpu64, &len, NULL, 0) == 0; |
+ if (!cpu64_known) { |
+ PLOG(WARNING) << "sysctlbyname(\"" << kSysctlName << "\")"; |
+ } |
+#endif |
+ |
+ if (base::mac::IsOSSnowLeopard()) { |
+ return cpu64_known ? (cpu64 ? SNOW_LEOPARD_64 : SNOW_LEOPARD_32) : |
+ SNOW_LEOPARD_DUNNO; |
+ } |
+ if (base::mac::IsOSLion()) { |
+ return cpu64_known ? (cpu64 ? LION_64 : LION_32) : |
+ LION_DUNNO; |
+ } |
+ if (base::mac::IsOSMountainLion()) { |
+ return cpu64_known ? (cpu64 ? MOUNTAIN_LION_64 : MOUNTAIN_LION_32) : |
+ MOUNTAIN_LION_DUNNO; |
+ } |
+ if (base::mac::IsOSLaterThanMountainLion_DontCallThis()) { |
+ return cpu64_known ? (cpu64 ? FUTURE_CAT_64 : FUTURE_CAT_32) : |
+ FUTURE_CAT_DUNNO; |
+ } |
+ |
+ // If it's not any of the expected OS versions or later than them, it must |
+ // be prehistoric. |
+ return cpu64_known ? (cpu64 ? SABER_TOOTHED_CAT_64 : SABER_TOOTHED_CAT_32) : |
+ SABER_TOOTHED_CAT_DUNNO; |
+} |
+ |
+void RecordCatSixtyFour() { |
+ CatSixtyFour cat_sixty_four = CatSixtyFourValue(); |
+ |
+ // Set this higher than the highest value in the CatSixtyFour enum to |
+ // provide some headroom and then leave it alone. See HISTOGRAM_ENUMERATION |
+ // in base/metrics/histogram.h. |
+ const int kMaxCatsAndSixtyFours = 32; |
+ COMPILE_ASSERT(kMaxCatsAndSixtyFours >= CAT_SIXTY_FOUR_MAX, |
+ CatSixtyFour_enum_grew_too_large); |
+ |
+ UMA_HISTOGRAM_ENUMERATION("OSX.CatSixtyFour", |
+ cat_sixty_four, |
+ kMaxCatsAndSixtyFours); |
+} |
+ |
} // namespace |
void RecordBreakpadStatusUMA(MetricsService* metrics) { |
@@ -102,6 +201,8 @@ |
CommandLine* singleton_command_line = CommandLine::ForCurrentProcess(); |
singleton_command_line->AppendSwitch(switches::kNoStartupWindow); |
} |
+ |
+ RecordCatSixtyFour(); |
} |
void ChromeBrowserMainPartsMac::PreMainMessageLoopStart() { |