Lines Matching refs:mem3
139 } mem3 = { 97535575 }; variable
141 #define mem3 GLOBAL(struct Mem3Global, mem3) macro
148 u32 next = mem3.aPool[i].u.list.next; in memsys3UnlinkFromList()
149 u32 prev = mem3.aPool[i].u.list.prev; in memsys3UnlinkFromList()
150 assert( sqlite3_mutex_held(mem3.mutex) ); in memsys3UnlinkFromList()
154 mem3.aPool[prev].u.list.next = next; in memsys3UnlinkFromList()
157 mem3.aPool[next].u.list.prev = prev; in memsys3UnlinkFromList()
159 mem3.aPool[i].u.list.next = 0; in memsys3UnlinkFromList()
160 mem3.aPool[i].u.list.prev = 0; in memsys3UnlinkFromList()
169 assert( sqlite3_mutex_held(mem3.mutex) ); in memsys3Unlink()
170 assert( (mem3.aPool[i-1].u.hdr.size4x & 1)==0 ); in memsys3Unlink()
172 size = mem3.aPool[i-1].u.hdr.size4x/4; in memsys3Unlink()
173 assert( size==mem3.aPool[i+size-1].u.hdr.prevSize ); in memsys3Unlink()
176 memsys3UnlinkFromList(i, &mem3.aiSmall[size-2]); in memsys3Unlink()
179 memsys3UnlinkFromList(i, &mem3.aiHash[hash]); in memsys3Unlink()
188 assert( sqlite3_mutex_held(mem3.mutex) ); in memsys3LinkIntoList()
189 mem3.aPool[i].u.list.next = *pRoot; in memsys3LinkIntoList()
190 mem3.aPool[i].u.list.prev = 0; in memsys3LinkIntoList()
192 mem3.aPool[*pRoot].u.list.prev = i; in memsys3LinkIntoList()
203 assert( sqlite3_mutex_held(mem3.mutex) ); in memsys3Link()
205 assert( (mem3.aPool[i-1].u.hdr.size4x & 1)==0 ); in memsys3Link()
206 size = mem3.aPool[i-1].u.hdr.size4x/4; in memsys3Link()
207 assert( size==mem3.aPool[i+size-1].u.hdr.prevSize ); in memsys3Link()
210 memsys3LinkIntoList(i, &mem3.aiSmall[size-2]); in memsys3Link()
213 memsys3LinkIntoList(i, &mem3.aiHash[hash]); in memsys3Link()
223 if( sqlite3GlobalConfig.bMemstat==0 && mem3.mutex==0 ){ in memsys3Enter()
224 mem3.mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MEM); in memsys3Enter()
226 sqlite3_mutex_enter(mem3.mutex); in memsys3Enter()
229 sqlite3_mutex_leave(mem3.mutex); in memsys3Leave()
236 if( !mem3.alarmBusy ){ in memsys3OutOfMemory()
237 mem3.alarmBusy = 1; in memsys3OutOfMemory()
238 assert( sqlite3_mutex_held(mem3.mutex) ); in memsys3OutOfMemory()
239 sqlite3_mutex_leave(mem3.mutex); in memsys3OutOfMemory()
241 sqlite3_mutex_enter(mem3.mutex); in memsys3OutOfMemory()
242 mem3.alarmBusy = 0; in memsys3OutOfMemory()
254 assert( sqlite3_mutex_held(mem3.mutex) ); in memsys3Checkout()
256 assert( mem3.aPool[i-1].u.hdr.size4x/4==nBlock ); in memsys3Checkout()
257 assert( mem3.aPool[i+nBlock-1].u.hdr.prevSize==nBlock ); in memsys3Checkout()
258 x = mem3.aPool[i-1].u.hdr.size4x; in memsys3Checkout()
259 mem3.aPool[i-1].u.hdr.size4x = nBlock*4 | 1 | (x&2); in memsys3Checkout()
260 mem3.aPool[i+nBlock-1].u.hdr.prevSize = nBlock; in memsys3Checkout()
261 mem3.aPool[i+nBlock-1].u.hdr.size4x |= 2; in memsys3Checkout()
262 return &mem3.aPool[i]; in memsys3Checkout()
271 assert( sqlite3_mutex_held(mem3.mutex) ); in memsys3FromKeyBlk()
272 assert( mem3.szKeyBlk>=nBlock ); in memsys3FromKeyBlk()
273 if( nBlock>=mem3.szKeyBlk-1 ){ in memsys3FromKeyBlk()
275 void *p = memsys3Checkout(mem3.iKeyBlk, mem3.szKeyBlk); in memsys3FromKeyBlk()
276 mem3.iKeyBlk = 0; in memsys3FromKeyBlk()
277 mem3.szKeyBlk = 0; in memsys3FromKeyBlk()
278 mem3.mnKeyBlk = 0; in memsys3FromKeyBlk()
283 newi = mem3.iKeyBlk + mem3.szKeyBlk - nBlock; in memsys3FromKeyBlk()
284 assert( newi > mem3.iKeyBlk+1 ); in memsys3FromKeyBlk()
285 mem3.aPool[mem3.iKeyBlk+mem3.szKeyBlk-1].u.hdr.prevSize = nBlock; in memsys3FromKeyBlk()
286 mem3.aPool[mem3.iKeyBlk+mem3.szKeyBlk-1].u.hdr.size4x |= 2; in memsys3FromKeyBlk()
287 mem3.aPool[newi-1].u.hdr.size4x = nBlock*4 + 1; in memsys3FromKeyBlk()
288 mem3.szKeyBlk -= nBlock; in memsys3FromKeyBlk()
289 mem3.aPool[newi-1].u.hdr.prevSize = mem3.szKeyBlk; in memsys3FromKeyBlk()
290 x = mem3.aPool[mem3.iKeyBlk-1].u.hdr.size4x & 2; in memsys3FromKeyBlk()
291 mem3.aPool[mem3.iKeyBlk-1].u.hdr.size4x = mem3.szKeyBlk*4 | x; in memsys3FromKeyBlk()
292 if( mem3.szKeyBlk < mem3.mnKeyBlk ){ in memsys3FromKeyBlk()
293 mem3.mnKeyBlk = mem3.szKeyBlk; in memsys3FromKeyBlk()
295 return (void*)&mem3.aPool[newi]; in memsys3FromKeyBlk()
318 assert( sqlite3_mutex_held(mem3.mutex) ); in memsys3Merge()
320 iNext = mem3.aPool[i].u.list.next; in memsys3Merge()
321 size = mem3.aPool[i-1].u.hdr.size4x; in memsys3Merge()
325 assert( i > mem3.aPool[i-1].u.hdr.prevSize ); in memsys3Merge()
326 prev = i - mem3.aPool[i-1].u.hdr.prevSize; in memsys3Merge()
328 iNext = mem3.aPool[prev].u.list.next; in memsys3Merge()
332 x = mem3.aPool[prev-1].u.hdr.size4x & 2; in memsys3Merge()
333 mem3.aPool[prev-1].u.hdr.size4x = size*4 | x; in memsys3Merge()
334 mem3.aPool[prev+size-1].u.hdr.prevSize = size; in memsys3Merge()
340 if( size>mem3.szKeyBlk ){ in memsys3Merge()
341 mem3.iKeyBlk = i; in memsys3Merge()
342 mem3.szKeyBlk = size; in memsys3Merge()
359 assert( sqlite3_mutex_held(mem3.mutex) ); in memsys3MallocUnsafe()
374 i = mem3.aiSmall[nBlock-2]; in memsys3MallocUnsafe()
376 memsys3UnlinkFromList(i, &mem3.aiSmall[nBlock-2]); in memsys3MallocUnsafe()
381 for(i=mem3.aiHash[hash]; i>0; i=mem3.aPool[i].u.list.next){ in memsys3MallocUnsafe()
382 if( mem3.aPool[i-1].u.hdr.size4x/4==nBlock ){ in memsys3MallocUnsafe()
383 memsys3UnlinkFromList(i, &mem3.aiHash[hash]); in memsys3MallocUnsafe()
393 if( mem3.szKeyBlk>=nBlock ){ in memsys3MallocUnsafe()
405 for(toFree=nBlock*16; toFree<(mem3.nPool*16); toFree *= 2){ in memsys3MallocUnsafe()
407 if( mem3.iKeyBlk ){ in memsys3MallocUnsafe()
408 memsys3Link(mem3.iKeyBlk); in memsys3MallocUnsafe()
409 mem3.iKeyBlk = 0; in memsys3MallocUnsafe()
410 mem3.szKeyBlk = 0; in memsys3MallocUnsafe()
413 memsys3Merge(&mem3.aiHash[i]); in memsys3MallocUnsafe()
416 memsys3Merge(&mem3.aiSmall[i]); in memsys3MallocUnsafe()
418 if( mem3.szKeyBlk ){ in memsys3MallocUnsafe()
419 memsys3Unlink(mem3.iKeyBlk); in memsys3MallocUnsafe()
420 if( mem3.szKeyBlk>=nBlock ){ in memsys3MallocUnsafe()
440 assert( sqlite3_mutex_held(mem3.mutex) ); in memsys3FreeUnsafe()
441 assert( p>mem3.aPool && p<&mem3.aPool[mem3.nPool] ); in memsys3FreeUnsafe()
442 i = p - mem3.aPool; in memsys3FreeUnsafe()
443 assert( (mem3.aPool[i-1].u.hdr.size4x&1)==1 ); in memsys3FreeUnsafe()
444 size = mem3.aPool[i-1].u.hdr.size4x/4; in memsys3FreeUnsafe()
445 assert( i+size<=mem3.nPool+1 ); in memsys3FreeUnsafe()
446 mem3.aPool[i-1].u.hdr.size4x &= ~1; in memsys3FreeUnsafe()
447 mem3.aPool[i+size-1].u.hdr.prevSize = size; in memsys3FreeUnsafe()
448 mem3.aPool[i+size-1].u.hdr.size4x &= ~2; in memsys3FreeUnsafe()
452 if( mem3.iKeyBlk ){ in memsys3FreeUnsafe()
453 while( (mem3.aPool[mem3.iKeyBlk-1].u.hdr.size4x&2)==0 ){ in memsys3FreeUnsafe()
454 size = mem3.aPool[mem3.iKeyBlk-1].u.hdr.prevSize; in memsys3FreeUnsafe()
455 mem3.iKeyBlk -= size; in memsys3FreeUnsafe()
456 mem3.szKeyBlk += size; in memsys3FreeUnsafe()
457 memsys3Unlink(mem3.iKeyBlk); in memsys3FreeUnsafe()
458 x = mem3.aPool[mem3.iKeyBlk-1].u.hdr.size4x & 2; in memsys3FreeUnsafe()
459 mem3.aPool[mem3.iKeyBlk-1].u.hdr.size4x = mem3.szKeyBlk*4 | x; in memsys3FreeUnsafe()
460 mem3.aPool[mem3.iKeyBlk+mem3.szKeyBlk-1].u.hdr.prevSize = mem3.szKeyBlk; in memsys3FreeUnsafe()
462 x = mem3.aPool[mem3.iKeyBlk-1].u.hdr.size4x & 2; in memsys3FreeUnsafe()
463 while( (mem3.aPool[mem3.iKeyBlk+mem3.szKeyBlk-1].u.hdr.size4x&1)==0 ){ in memsys3FreeUnsafe()
464 memsys3Unlink(mem3.iKeyBlk+mem3.szKeyBlk); in memsys3FreeUnsafe()
465 mem3.szKeyBlk += mem3.aPool[mem3.iKeyBlk+mem3.szKeyBlk-1].u.hdr.size4x/4; in memsys3FreeUnsafe()
466 mem3.aPool[mem3.iKeyBlk-1].u.hdr.size4x = mem3.szKeyBlk*4 | x; in memsys3FreeUnsafe()
467 mem3.aPool[mem3.iKeyBlk+mem3.szKeyBlk-1].u.hdr.prevSize = mem3.szKeyBlk; in memsys3FreeUnsafe()
560 mem3.aPool = (Mem3Block *)sqlite3GlobalConfig.pHeap; in memsys3Init()
561 mem3.nPool = (sqlite3GlobalConfig.nHeap / sizeof(Mem3Block)) - 2; in memsys3Init()
564 mem3.szKeyBlk = mem3.nPool; in memsys3Init()
565 mem3.mnKeyBlk = mem3.szKeyBlk; in memsys3Init()
566 mem3.iKeyBlk = 1; in memsys3Init()
567 mem3.aPool[0].u.hdr.size4x = (mem3.szKeyBlk<<2) + 2; in memsys3Init()
568 mem3.aPool[mem3.nPool].u.hdr.prevSize = mem3.nPool; in memsys3Init()
569 mem3.aPool[mem3.nPool].u.hdr.size4x = 1; in memsys3Init()
579 mem3.mutex = 0; in memsys3Shutdown()
606 for(i=1; i<=mem3.nPool; i+=size/4){ in sqlite3Memsys3Dump()
607 size = mem3.aPool[i-1].u.hdr.size4x; in sqlite3Memsys3Dump()
609 fprintf(out, "%p size error\n", &mem3.aPool[i]); in sqlite3Memsys3Dump()
613 if( (size&1)==0 && mem3.aPool[i+size/4-1].u.hdr.prevSize!=size/4 ){ in sqlite3Memsys3Dump()
614 fprintf(out, "%p tail size does not match\n", &mem3.aPool[i]); in sqlite3Memsys3Dump()
618 if( ((mem3.aPool[i+size/4-1].u.hdr.size4x&2)>>1)!=(size&1) ){ in sqlite3Memsys3Dump()
619 fprintf(out, "%p tail checkout bit is incorrect\n", &mem3.aPool[i]); in sqlite3Memsys3Dump()
624 fprintf(out, "%p %6d bytes checked out\n", &mem3.aPool[i], (size/4)*8-8); in sqlite3Memsys3Dump()
626 fprintf(out, "%p %6d bytes free%s\n", &mem3.aPool[i], (size/4)*8-8, in sqlite3Memsys3Dump()
627 i==mem3.iKeyBlk ? " **key**" : ""); in sqlite3Memsys3Dump()
631 if( mem3.aiSmall[i]==0 ) continue; in sqlite3Memsys3Dump()
633 for(j = mem3.aiSmall[i]; j>0; j=mem3.aPool[j].u.list.next){ in sqlite3Memsys3Dump()
634 fprintf(out, " %p(%d)", &mem3.aPool[j], in sqlite3Memsys3Dump()
635 (mem3.aPool[j-1].u.hdr.size4x/4)*8-8); in sqlite3Memsys3Dump()
640 if( mem3.aiHash[i]==0 ) continue; in sqlite3Memsys3Dump()
642 for(j = mem3.aiHash[i]; j>0; j=mem3.aPool[j].u.list.next){ in sqlite3Memsys3Dump()
643 fprintf(out, " %p(%d)", &mem3.aPool[j], in sqlite3Memsys3Dump()
644 (mem3.aPool[j-1].u.hdr.size4x/4)*8-8); in sqlite3Memsys3Dump()
648 fprintf(out, "key=%d\n", mem3.iKeyBlk); in sqlite3Memsys3Dump()
649 fprintf(out, "nowUsed=%d\n", mem3.nPool*8 - mem3.szKeyBlk*8); in sqlite3Memsys3Dump()
650 fprintf(out, "mxUsed=%d\n", mem3.nPool*8 - mem3.mnKeyBlk*8); in sqlite3Memsys3Dump()
651 sqlite3_mutex_leave(mem3.mutex); in sqlite3Memsys3Dump()