| 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() {
|
|
|