summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
authorVasu Nori <vnori@google.com>2010-12-21 10:12:16 -0800
committerAndroid (Google) Code Review <android-gerrit@google.com>2010-12-21 10:12:16 -0800
commit34884643b66d2560273b7c29d3eacb59560ab231 (patch)
tree53be47deb2c079969398868197d45f2a27aa2588 /core
parent41e7e6f9339cd9181df26ca96f0ac133371bc524 (diff)
parent34ad57f0e844cd97f59d4ab22087d60d58650ba4 (diff)
downloadframeworks_base-34884643b66d2560273b7c29d3eacb59560ab231.zip
frameworks_base-34884643b66d2560273b7c29d3eacb59560ab231.tar.gz
frameworks_base-34884643b66d2560273b7c29d3eacb59560ab231.tar.bz2
Merge "resubmitting Change-Id: I67b1d04a5c9fc18b0cd4da6184d0b814b64d89e9"
Diffstat (limited to 'core')
-rw-r--r--core/java/android/database/CursorWindow.java12
-rw-r--r--core/java/android/database/sqlite/SQLiteDatabase.java16
-rw-r--r--core/jni/android_database_CursorWindow.cpp7
-rw-r--r--core/jni/android_database_SQLiteDatabase.cpp11
-rw-r--r--core/res/res/values/config.xml3
5 files changed, 41 insertions, 8 deletions
diff --git a/core/java/android/database/CursorWindow.java b/core/java/android/database/CursorWindow.java
index a026eca..9a8f2d2 100644
--- a/core/java/android/database/CursorWindow.java
+++ b/core/java/android/database/CursorWindow.java
@@ -16,6 +16,7 @@
package android.database;
+import android.content.res.Resources;
import android.database.sqlite.SQLiteClosable;
import android.os.IBinder;
import android.os.Parcel;
@@ -25,6 +26,13 @@ import android.os.Parcelable;
* A buffer containing multiple cursor rows.
*/
public class CursorWindow extends SQLiteClosable implements Parcelable {
+ /** The cursor window size. resource xml file specifies the value in kB.
+ * convert it to bytes here by multiplying with 1024.
+ */
+ private static final int sCursorWindowSize =
+ Resources.getSystem().getInteger(
+ com.android.internal.R.integer.config_cursorWindowSize) * 1024;
+
/** The pointer to the native window class */
@SuppressWarnings("unused")
private int nWindow;
@@ -38,7 +46,7 @@ public class CursorWindow extends SQLiteClosable implements Parcelable {
*/
public CursorWindow(boolean localWindow) {
mStartPos = 0;
- native_init(localWindow);
+ native_init(sCursorWindowSize, localWindow);
}
/**
@@ -574,7 +582,7 @@ public class CursorWindow extends SQLiteClosable implements Parcelable {
private native IBinder native_getBinder();
/** Does the native side initialization for an empty window */
- private native void native_init(boolean localOnly);
+ private native void native_init(int cursorWindowSize, boolean localOnly);
/** Does the native side initialization with an existing binder from another process */
private native void native_init(IBinder nativeBinder);
diff --git a/core/java/android/database/sqlite/SQLiteDatabase.java b/core/java/android/database/sqlite/SQLiteDatabase.java
index 184988b..6f59dc9 100644
--- a/core/java/android/database/sqlite/SQLiteDatabase.java
+++ b/core/java/android/database/sqlite/SQLiteDatabase.java
@@ -18,6 +18,7 @@ package android.database.sqlite;
import android.app.AppGlobals;
import android.content.ContentValues;
+import android.content.res.Resources;
import android.database.Cursor;
import android.database.DatabaseErrorHandler;
import android.database.DatabaseUtils;
@@ -1963,6 +1964,15 @@ public class SQLiteDatabase extends SQLiteClosable {
// If the caller sets errorHandler = null, then use default errorhandler.
mErrorHandler = (errorHandler == null) ? new DefaultDatabaseErrorHandler() : errorHandler;
mConnectionNum = connectionNum;
+ /* sqlite soft heap limit http://www.sqlite.org/c3ref/soft_heap_limit64.html
+ * set it to 4 times the default cursor window size.
+ * TODO what is an appropriate value, considring the WAL feature which could burn
+ * a lot of memory with many connections to the database. needs testing to figure out
+ * optimal value for this.
+ */
+ int limit = Resources.getSystem().getInteger(
+ com.android.internal.R.integer.config_cursorWindowSize) * 1024 * 4;
+ native_setSqliteSoftHeapLimit(limit);
}
/**
@@ -2670,4 +2680,10 @@ public class SQLiteDatabase extends SQLiteClosable {
* @param statementId statement to be finzlied by sqlite
*/
private final native void native_finalize(int statementId);
+
+ /**
+ * set sqlite soft heap limit
+ * http://www.sqlite.org/c3ref/soft_heap_limit64.html
+ */
+ private native void native_setSqliteSoftHeapLimit(int softHeapLimit);
}
diff --git a/core/jni/android_database_CursorWindow.cpp b/core/jni/android_database_CursorWindow.cpp
index fad9539..c4cd2a6 100644
--- a/core/jni/android_database_CursorWindow.cpp
+++ b/core/jni/android_database_CursorWindow.cpp
@@ -50,13 +50,14 @@ CursorWindow * get_window_from_object(JNIEnv * env, jobject javaWindow)
return GET_WINDOW(env, javaWindow);
}
-static void native_init_empty(JNIEnv * env, jobject object, jboolean localOnly)
+static void native_init_empty(JNIEnv * env, jobject object, jint cursorWindowSize,
+ jboolean localOnly)
{
uint8_t * data;
size_t size;
CursorWindow * window;
- window = new CursorWindow(MAX_WINDOW_SIZE);
+ window = new CursorWindow(cursorWindowSize);
if (!window) {
jniThrowException(env, "java/lang/RuntimeException", "No memory for native window object");
return;
@@ -614,7 +615,7 @@ static jint getType_native(JNIEnv* env, jobject object, jint row, jint column)
static JNINativeMethod sMethods[] =
{
/* name, signature, funcPtr */
- {"native_init", "(Z)V", (void *)native_init_empty},
+ {"native_init", "(IZ)V", (void *)native_init_empty},
{"native_init", "(Landroid/os/IBinder;)V", (void *)native_init_memory},
{"native_getBinder", "()Landroid/os/IBinder;", (void *)native_getBinder},
{"native_clear", "()V", (void *)native_clear},
diff --git a/core/jni/android_database_SQLiteDatabase.cpp b/core/jni/android_database_SQLiteDatabase.cpp
index 7aeed98..a5878a9 100644
--- a/core/jni/android_database_SQLiteDatabase.cpp
+++ b/core/jni/android_database_SQLiteDatabase.cpp
@@ -46,7 +46,6 @@
#define UTF16_STORAGE 0
#define INVALID_VERSION -1
-#define SQLITE_SOFT_HEAP_LIMIT (4 * 1024 * 1024)
#define ANDROID_TABLE "android_metadata"
/* uncomment the next line to force-enable logging of all statements */
// #define DB_LOG_STATEMENTS
@@ -66,6 +65,7 @@ enum {
static jfieldID offset_db_handle;
static jmethodID method_custom_function_callback;
static jclass string_class = NULL;
+static jint sSqliteSoftHeapLimit = 0;
static char *createStr(const char *path, short extra) {
int len = strlen(path) + extra;
@@ -129,7 +129,7 @@ static void dbopen(JNIEnv* env, jobject object, jstring pathString, jint flags)
// The soft heap limit prevents the page cache allocations from growing
// beyond the given limit, no matter what the max page cache sizes are
// set to. The limit does not, as of 3.5.0, affect any other allocations.
- sqlite3_soft_heap_limit(SQLITE_SOFT_HEAP_LIMIT);
+ sqlite3_soft_heap_limit(sSqliteSoftHeapLimit);
// Set the default busy handler to retry for 1000ms and then return SQLITE_BUSY
err = sqlite3_busy_timeout(handle, 1000 /* ms */);
@@ -379,10 +379,14 @@ done:
if (meta != NULL) sqlite3_free_table(meta);
}
+static void native_setSqliteSoftHeapLimit(JNIEnv* env, jobject clazz, jint limit) {
+ sSqliteSoftHeapLimit = limit;
+}
+
static jint native_releaseMemory(JNIEnv *env, jobject clazz)
{
// Attempt to release as much memory from the
- return sqlite3_release_memory(SQLITE_SOFT_HEAP_LIMIT);
+ return sqlite3_release_memory(sSqliteSoftHeapLimit);
}
static void native_finalize(JNIEnv* env, jobject object, jint statementId)
@@ -466,6 +470,7 @@ static JNINativeMethod sMethods[] =
{"enableSqlProfiling", "(Ljava/lang/String;S)V", (void *)enableSqlProfiling},
{"native_setLocale", "(Ljava/lang/String;I)V", (void *)native_setLocale},
{"native_getDbLookaside", "()I", (void *)native_getDbLookaside},
+ {"native_setSqliteSoftHeapLimit", "(I)V", (void *)native_setSqliteSoftHeapLimit},
{"releaseMemory", "()I", (void *)native_releaseMemory},
{"native_finalize", "(I)V", (void *)native_finalize},
{"native_addCustomFunction",
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 0d2d42f..0d840c2 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -515,4 +515,7 @@
Build.MODEL. The format string shall not be escaped. -->
<string name="config_useragentprofile_url"></string>
+ <!-- When a database query is executed, the results retuned are paginated
+ in pages of size (in KB) indicated by this value -->
+ <integer name="config_cursorWindowSize">2048</integer>
</resources>