diff options
author | vichang <vichang@chromium.org> | 2016-01-28 14:09:03 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-01-28 22:09:52 +0000 |
commit | 7ce37c1ec34e33f7e2c4b87341f16885942c3e5c (patch) | |
tree | b91e0bc688a150d03e12ca8f54cf2d700ecfef5f | |
parent | 12607e58c74926c0480c08f19214908f987a37a3 (diff) | |
download | chromium_src-7ce37c1ec34e33f7e2c4b87341f16885942c3e5c.zip chromium_src-7ce37c1ec34e33f7e2c4b87341f16885942c3e5c.tar.gz chromium_src-7ce37c1ec34e33f7e2c4b87341f16885942c3e5c.tar.bz2 |
Add flag to disable mmap in all sql connection in work build
Work Chrome runs in environment without a proper mmap support.
Disable it for all work chrome.
BUG=554269
Review URL: https://codereview.chromium.org/1637683003
Cr-Commit-Position: refs/heads/master@{#372179}
6 files changed, 36 insertions, 2 deletions
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeVersionInfo.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeVersionInfo.java index 1c778c7..6734c5a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeVersionInfo.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeVersionInfo.java @@ -47,6 +47,13 @@ public class ChromeVersionInfo { } /** + * @return Whether this build is a work build. + */ + public static boolean isWorkBuild() { + return ChromeVersionConstants.CHANNEL == ChromeVersionConstants.CHANNEL_WORK; + } + + /** * @return Whether this is an official (i.e. Google Chrome) build. */ public static boolean isOfficialBuild() { diff --git a/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java b/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java index e19384c..dcd59ea 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java @@ -27,10 +27,12 @@ import org.chromium.base.library_loader.ProcessInitException; import org.chromium.chrome.browser.ChromeApplication; import org.chromium.chrome.browser.ChromeStrictMode; import org.chromium.chrome.browser.ChromeSwitches; +import org.chromium.chrome.browser.ChromeVersionInfo; import org.chromium.chrome.browser.FileProviderHelper; import org.chromium.chrome.browser.device.DeviceClassManager; import org.chromium.chrome.browser.services.GoogleServicesManager; import org.chromium.chrome.browser.tabmodel.document.DocumentTabModelImpl; +import org.chromium.chrome.browser.util.FeatureUtilities; import org.chromium.chrome.browser.webapps.ActivityAssigner; import org.chromium.content.app.ContentApplication; import org.chromium.content.browser.BrowserStartupController; @@ -185,6 +187,12 @@ public class ChromeBrowserInitializer { throws ProcessInitException { assert ThreadUtils.runningOnUiThread() : "Tried to start the browser on the wrong thread"; + // This has to be called to stop mmap in sql connection before any db initialized. + // It applies to Work Chrome only as mmap doesn't work properly. + if (ChromeVersionInfo.isWorkBuild()) { + FeatureUtilities.nativeSetSqlMmapDisabledByDefault(); + } + final LinkedList<Runnable> initQueue = new LinkedList<Runnable>(); abstract class NativeInitTask implements Runnable { diff --git a/chrome/android/java/src/org/chromium/chrome/browser/util/FeatureUtilities.java b/chrome/android/java/src/org/chromium/chrome/browser/util/FeatureUtilities.java index 735c27e..2089a3b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/util/FeatureUtilities.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/util/FeatureUtilities.java @@ -173,4 +173,5 @@ public class FeatureUtilities { private static native void nativeSetDocumentModeEnabled(boolean enabled); private static native void nativeSetCustomTabVisible(boolean visible); + public static native void nativeSetSqlMmapDisabledByDefault(); } diff --git a/chrome/browser/android/feature_utilities.cc b/chrome/browser/android/feature_utilities.cc index 23111c6..41ff282 100644 --- a/chrome/browser/android/feature_utilities.cc +++ b/chrome/browser/android/feature_utilities.cc @@ -6,6 +6,8 @@ #include "jni/FeatureUtilities_jni.h" +#include "sql/connection.h" + namespace { bool document_mode_enabled = false; bool custom_tab_visible = false; @@ -39,6 +41,11 @@ static void SetCustomTabVisible(JNIEnv* env, custom_tab_visible = visible; } +static void SetSqlMmapDisabledByDefault(JNIEnv* env, + const JavaParamRef<jclass>& clazz) { + sql::Connection::set_mmap_disabled_by_default(); +} + bool RegisterFeatureUtilities(JNIEnv* env) { return RegisterNativesImpl(env); } diff --git a/sql/connection.cc b/sql/connection.cc index 003005a..f08560c 100644 --- a/sql/connection.cc +++ b/sql/connection.cc @@ -43,6 +43,8 @@ namespace { // TODO(shess): Better story on this. http://crbug.com/56559 const int kBusyTimeoutSeconds = 1; +bool g_mmap_disabled_default = false; + class ScopedBusyTimeout { public: explicit ScopedBusyTimeout(sqlite3* db) @@ -254,6 +256,12 @@ bool Connection::ShouldIgnoreSqliteCompileError(int error) { basic_error == SQLITE_CORRUPT; } +// static +void Connection::set_mmap_disabled_by_default() { + g_mmap_disabled_default = true; +} + + void Connection::ReportDiagnosticInfo(int extended_error, Statement* stmt) { AssertIOAllowed(); @@ -339,7 +347,7 @@ Connection::Connection() needs_rollback_(false), in_memory_(false), poisoned_(false), - mmap_disabled_(false), + mmap_disabled_(g_mmap_disabled_default), mmap_enabled_(false), total_changes_at_last_release_(0), stats_histogram_(NULL), diff --git a/sql/connection.h b/sql/connection.h index b35e2fa..4606a1f 100644 --- a/sql/connection.h +++ b/sql/connection.h @@ -149,9 +149,12 @@ class SQL_EXPORT Connection { // other platforms. void set_restrict_to_user() { restrict_to_user_ = true; } - // Call to opt out of memory-mapped file I/O. + // Call to opt out of memory-mapped file I/O on per connection basis. void set_mmap_disabled() { mmap_disabled_ = true; } + // Call to opt out of memory-mapped file I/O on all connections. + static void set_mmap_disabled_by_default(); + // Set an error-handling callback. On errors, the error number (and // statement, if available) will be passed to the callback. // |