Add SyncCustomizationFragmentTest.
[chromium-blink-merge.git] / base / android / library_loader / library_loader_hooks.cc
blob0b59a30429676b131f428de41b5b8e6c3889b483
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "base/android/library_loader/library_loader_hooks.h"
7 #include "base/android/command_line_android.h"
8 #include "base/android/jni_string.h"
9 #include "base/android/library_loader/library_load_from_apk_status_codes.h"
10 #include "base/android/library_loader/library_prefetcher.h"
11 #include "base/at_exit.h"
12 #include "base/metrics/histogram.h"
13 #include "jni/LibraryLoader_jni.h"
15 namespace base {
16 namespace android {
18 namespace {
20 base::AtExitManager* g_at_exit_manager = NULL;
21 const char* g_library_version_number = "";
22 LibraryLoadedHook* g_registration_callback = NULL;
24 enum RendererHistogramCode {
25 // Renderer load at fixed address success, fail, or not attempted.
26 // Renderers do not attempt to load at at fixed address if on a
27 // low-memory device on which browser load at fixed address has already
28 // failed.
29 LFA_SUCCESS = 0,
30 LFA_BACKOFF_USED = 1,
31 LFA_NOT_ATTEMPTED = 2,
33 // End sentinel, also used as nothing-pending indicator.
34 MAX_RENDERER_HISTOGRAM_CODE = 3,
35 NO_PENDING_HISTOGRAM_CODE = MAX_RENDERER_HISTOGRAM_CODE
38 enum BrowserHistogramCode {
39 // Non-low-memory random address browser loads.
40 NORMAL_LRA_SUCCESS = 0,
42 // Low-memory browser loads at fixed address, success or fail.
43 LOW_MEMORY_LFA_SUCCESS = 1,
44 LOW_MEMORY_LFA_BACKOFF_USED = 2,
46 MAX_BROWSER_HISTOGRAM_CODE = 3,
49 RendererHistogramCode g_renderer_histogram_code = NO_PENDING_HISTOGRAM_CODE;
51 } // namespace
53 static void RegisterChromiumAndroidLinkerRendererHistogram(
54 JNIEnv* env,
55 jobject jcaller,
56 jboolean requested_shared_relro,
57 jboolean load_at_fixed_address_failed) {
58 // Note a pending histogram value for later recording.
59 if (requested_shared_relro) {
60 g_renderer_histogram_code = load_at_fixed_address_failed
61 ? LFA_BACKOFF_USED : LFA_SUCCESS;
62 } else {
63 g_renderer_histogram_code = LFA_NOT_ATTEMPTED;
67 void RecordChromiumAndroidLinkerRendererHistogram() {
68 if (g_renderer_histogram_code == NO_PENDING_HISTOGRAM_CODE)
69 return;
70 // Record and release the pending histogram value.
71 UMA_HISTOGRAM_ENUMERATION("ChromiumAndroidLinker.RendererStates",
72 g_renderer_histogram_code,
73 MAX_RENDERER_HISTOGRAM_CODE);
74 g_renderer_histogram_code = NO_PENDING_HISTOGRAM_CODE;
77 static void RecordChromiumAndroidLinkerBrowserHistogram(
78 JNIEnv* env,
79 jobject jcaller,
80 jboolean is_using_browser_shared_relros,
81 jboolean load_at_fixed_address_failed,
82 jint library_load_from_apk_status) {
83 // For low-memory devices, record whether or not we successfully loaded the
84 // browser at a fixed address. Otherwise just record a normal invocation.
85 BrowserHistogramCode histogram_code;
86 if (is_using_browser_shared_relros) {
87 histogram_code = load_at_fixed_address_failed
88 ? LOW_MEMORY_LFA_BACKOFF_USED : LOW_MEMORY_LFA_SUCCESS;
89 } else {
90 histogram_code = NORMAL_LRA_SUCCESS;
92 UMA_HISTOGRAM_ENUMERATION("ChromiumAndroidLinker.BrowserStates",
93 histogram_code,
94 MAX_BROWSER_HISTOGRAM_CODE);
96 // Record the device support for loading a library directly from the APK file.
97 UMA_HISTOGRAM_ENUMERATION("ChromiumAndroidLinker.LibraryLoadFromApkStatus",
98 library_load_from_apk_status,
99 LIBRARY_LOAD_FROM_APK_STATUS_CODES_MAX);
102 void SetLibraryLoadedHook(LibraryLoadedHook* func) {
103 g_registration_callback = func;
106 static void InitCommandLine(JNIEnv* env,
107 jobject jcaller,
108 jobjectArray init_command_line) {
109 InitNativeCommandLineFromJavaArray(env, init_command_line);
112 static jboolean LibraryLoaded(JNIEnv* env, jobject jcaller) {
113 if (g_registration_callback == NULL) {
114 return true;
116 return g_registration_callback(env, NULL);
119 void LibraryLoaderExitHook() {
120 if (g_at_exit_manager) {
121 delete g_at_exit_manager;
122 g_at_exit_manager = NULL;
126 static jboolean ForkAndPrefetchNativeLibrary(JNIEnv* env, jclass clazz) {
127 return NativeLibraryPrefetcher::ForkAndPrefetchNativeLibrary();
130 bool RegisterLibraryLoaderEntryHook(JNIEnv* env) {
131 return RegisterNativesImpl(env);
134 void SetVersionNumber(const char* version_number) {
135 g_library_version_number = strdup(version_number);
138 jstring GetVersionNumber(JNIEnv* env, jobject jcaller) {
139 return ConvertUTF8ToJavaString(env, g_library_version_number).Release();
142 LibraryProcessType GetLibraryProcessType(JNIEnv* env) {
143 return static_cast<LibraryProcessType>(
144 Java_LibraryLoader_getLibraryProcessType(env));
147 void InitAtExitManager() {
148 g_at_exit_manager = new base::AtExitManager();
151 } // namespace android
152 } // namespace base