2626
2727#include < sqlite3.h>
2828
29- // From mem_mspace.c in libsqlite
30- extern " C" mspace sqlite3_get_mspace ();
31-
3229namespace android {
3330
3431static jfieldID gMemoryUsedField ;
35- static jfieldID gPageCacheOverfloField ;
32+ static jfieldID gPageCacheOverflowField ;
3633static jfieldID gLargestMemAllocField ;
3734
3835
@@ -41,146 +38,18 @@ static jfieldID gLargestMemAllocField;
4138static void getPagerStats (JNIEnv *env, jobject clazz, jobject statsObj)
4239{
4340 int memoryUsed;
44- int pageCacheOverflo ;
41+ int pageCacheOverflow ;
4542 int largestMemAlloc;
4643 int unused;
4744
4845 sqlite3_status (SQLITE_STATUS_MEMORY_USED, &memoryUsed, &unused, 0 );
4946 sqlite3_status (SQLITE_STATUS_MALLOC_SIZE, &unused, &largestMemAlloc, 0 );
50- sqlite3_status (SQLITE_STATUS_PAGECACHE_OVERFLOW, &pageCacheOverflo , &unused, 0 );
47+ sqlite3_status (SQLITE_STATUS_PAGECACHE_OVERFLOW, &pageCacheOverflow , &unused, 0 );
5148 env->SetIntField (statsObj, gMemoryUsedField , memoryUsed);
52- env->SetIntField (statsObj, gPageCacheOverfloField , pageCacheOverflo );
49+ env->SetIntField (statsObj, gPageCacheOverflowField , pageCacheOverflow );
5350 env->SetIntField (statsObj, gLargestMemAllocField , largestMemAlloc);
5451}
5552
56- static jlong getHeapSize (JNIEnv *env, jobject clazz)
57- {
58- #if !NO_MALLINFO
59- struct mallinfo info = mspace_mallinfo (sqlite3_get_mspace ());
60- struct mallinfo info = dlmallinfo ();
61- return (jlong) info.usmblks ;
62- #elif USE_MSPACE
63- mspace space = sqlite3_get_mspace ();
64- if (space != 0 ) {
65- return mspace_footprint (space);
66- } else {
67- return 0 ;
68- }
69- #else
70- return 0 ;
71- #endif
72- }
73-
74- static jlong getHeapAllocatedSize (JNIEnv *env, jobject clazz)
75- {
76- #if !NO_MALLINFO
77- struct mallinfo info = mspace_mallinfo (sqlite3_get_mspace ());
78- return (jlong) info.uordblks ;
79- #else
80- return sqlite3_memory_used ();
81- #endif
82- }
83-
84- static jlong getHeapFreeSize (JNIEnv *env, jobject clazz)
85- {
86- #if !NO_MALLINFO
87- struct mallinfo info = mspace_mallinfo (sqlite3_get_mspace ());
88- return (jlong) info.fordblks ;
89- #else
90- return getHeapSize (env, clazz) - sqlite3_memory_used ();
91- #endif
92- }
93-
94- static int read_mapinfo (FILE *fp,
95- int *sharedPages, int *privatePages)
96- {
97- char line[1024 ];
98- int len;
99- int skip;
100-
101- unsigned start = 0 , size = 0 , resident = 0 ;
102- unsigned shared_clean = 0 , shared_dirty = 0 ;
103- unsigned private_clean = 0 , private_dirty = 0 ;
104- unsigned referenced = 0 ;
105-
106- int isAnon = 0 ;
107- int isHeap = 0 ;
108-
109- again:
110- skip = 0 ;
111-
112- if (fgets (line, 1024 , fp) == 0 ) return 0 ;
113-
114- len = strlen (line);
115- if (len < 1 ) return 0 ;
116- line[--len] = 0 ;
117-
118- /* ignore guard pages */
119- if (line[18 ] == ' -' ) skip = 1 ;
120-
121- start = strtoul (line, 0 , 16 );
122-
123- if (len > 50 && !strncmp (line + 49 , " /tmp/sqlite-heap" , strlen (" /tmp/sqlite-heap" ))) {
124- isHeap = 1 ;
125- }
126-
127- if (fgets (line, 1024 , fp) == 0 ) return 0 ;
128- if (sscanf (line, " Size: %d kB" , &size) != 1 ) return 0 ;
129- if (fgets (line, 1024 , fp) == 0 ) return 0 ;
130- if (sscanf (line, " Rss: %d kB" , &resident) != 1 ) return 0 ;
131- if (fgets (line, 1024 , fp) == 0 ) return 0 ;
132- if (sscanf (line, " Shared_Clean: %d kB" , &shared_clean) != 1 ) return 0 ;
133- if (fgets (line, 1024 , fp) == 0 ) return 0 ;
134- if (sscanf (line, " Shared_Dirty: %d kB" , &shared_dirty) != 1 ) return 0 ;
135- if (fgets (line, 1024 , fp) == 0 ) return 0 ;
136- if (sscanf (line, " Private_Clean: %d kB" , &private_clean) != 1 ) return 0 ;
137- if (fgets (line, 1024 , fp) == 0 ) return 0 ;
138- if (sscanf (line, " Private_Dirty: %d kB" , &private_dirty) != 1 ) return 0 ;
139- if (fgets (line, 1024 , fp) == 0 ) return 0 ;
140- if (sscanf (line, " Referenced: %d kB" , &referenced) != 1 ) return 0 ;
141-
142- if (skip) {
143- goto again;
144- }
145-
146- if (isHeap) {
147- *sharedPages += shared_dirty;
148- *privatePages += private_dirty;
149- }
150- return 1 ;
151- }
152-
153- static void load_maps (int pid, int *sharedPages, int *privatePages)
154- {
155- char tmp[128 ];
156- FILE *fp;
157-
158- sprintf (tmp, " /proc/%d/smaps" , pid);
159- fp = fopen (tmp, " r" );
160- if (fp == 0 ) return ;
161-
162- while (read_mapinfo (fp, sharedPages, privatePages) != 0 ) {
163- // Do nothing
164- }
165- fclose (fp);
166- }
167-
168- static void getHeapDirtyPages (JNIEnv *env, jobject clazz, jintArray pages)
169- {
170- int _pages[2 ];
171-
172- _pages[0 ] = 0 ;
173- _pages[1 ] = 0 ;
174-
175- load_maps (getpid (), &_pages[0 ], &_pages[1 ]);
176-
177- // Convert from kbytes to 4K pages
178- _pages[0 ] /= 4 ;
179- _pages[1 ] /= 4 ;
180-
181- env->SetIntArrayRegion (pages, 0 , 2 , _pages);
182- }
183-
18453/*
18554 * JNI registration.
18655 */
@@ -189,10 +58,6 @@ static JNINativeMethod gMethods[] =
18958{
19059 { " getPagerStats" , " (Landroid/database/sqlite/SQLiteDebug$PagerStats;)V" ,
19160 (void *) getPagerStats },
192- { " getHeapSize" , " ()J" , (void *) getHeapSize },
193- { " getHeapAllocatedSize" , " ()J" , (void *) getHeapAllocatedSize },
194- { " getHeapFreeSize" , " ()J" , (void *) getHeapFreeSize },
195- { " getHeapDirtyPages" , " ([I)V" , (void *) getHeapDirtyPages },
19661};
19762
19863int register_android_database_SQLiteDebug (JNIEnv *env)
@@ -217,9 +82,9 @@ int register_android_database_SQLiteDebug(JNIEnv *env)
21782 return -1 ;
21883 }
21984
220- gPageCacheOverfloField = env->GetFieldID (clazz, " pageCacheOverflo " , " I" );
221- if (gPageCacheOverfloField == NULL ) {
222- ALOGE (" Can't find pageCacheOverflo " );
85+ gPageCacheOverflowField = env->GetFieldID (clazz, " pageCacheOverflow " , " I" );
86+ if (gPageCacheOverflowField == NULL ) {
87+ ALOGE (" Can't find pageCacheOverflow " );
22388 return -1 ;
22489 }
22590
0 commit comments