Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2594bae1 authored by Vasu Nori's avatar Vasu Nori
Browse files

bug:2448371 cursorwindow size moved to resource xml file.

let cursor window size be set per device in device resources file.
default is 1MB.
for SR, it is 2MB.
it can be set to any value (in kB) in the device resource
strings.xml file

Change-Id: I67b1d04a5c9fc18b0cd4da6184d0b814b64d89e9
parent 4c7cc341
Loading
Loading
Loading
Loading
+10 −2
Original line number Diff line number Diff line
@@ -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);
+19 −0
Original line number Diff line number Diff line
@@ -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;
@@ -2670,4 +2671,22 @@ 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
     */

    /** 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.
     */
    static {
        int limit = Resources.getSystem().getInteger(
                com.android.internal.R.integer.config_cursorWindowSize) * 1024 * 4;
        native_setSqliteSoftHeapLimit(limit);
    }
    private final static native void native_setSqliteSoftHeapLimit(int softHeapLimit);
}
+4 −3
Original line number Diff line number Diff line
@@ -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},
+8 −3
Original line number Diff line number Diff line
@@ -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 object, 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",
+3 −0
Original line number Diff line number Diff line
@@ -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>
Loading