1extern void abort (void); 2 3typedef struct PgHdr PgHdr; 4typedef unsigned char u8; 5struct PgHdr { 6int y; 7struct { 8 unsigned int pgno; 9 PgHdr *pNextHash, *pPrevHash; 10 PgHdr *pNextFree, *pPrevFree; 11 PgHdr *pNextAll; 12 u8 inJournal; 13 short int nRef; 14 PgHdr *pDirty, *pPrevDirty; 15 unsigned int notUsed; 16} x; 17}; 18PgHdr **xx; 19volatile int vx; 20static inline PgHdr *merge_pagelist(PgHdr *pA, PgHdr *pB) 21{ 22 PgHdr result; 23 PgHdr *pTail; 24 xx = &result.x.pDirty; 25 pTail = &result; 26 while( pA && pB ){ 27 if( pA->x.pgno<pB->x.pgno ){ 28 pTail->x.pDirty = pA; 29 pTail = pA; 30 pA = pA->x.pDirty; 31 }else{ 32 pTail->x.pDirty = pB; 33 pTail = pB; 34 pB = pB->x.pDirty; 35 } 36 vx = (*xx)->y; 37 } 38 if( pA ){ 39 pTail->x.pDirty = pA; 40 }else if( pB ){ 41 pTail->x.pDirty = pB; 42 }else{ 43 pTail->x.pDirty = 0; 44 } 45 return result.x.pDirty; 46} 47 48PgHdr * __attribute__((noinline)) sort_pagelist(PgHdr *pIn) 49{ 50 PgHdr *a[25], *p; 51 int i; 52 __builtin_memset (a, 0, sizeof (a)); 53 while( pIn ){ 54 p = pIn; 55 pIn = p->x.pDirty; 56 p->x.pDirty = 0; 57 for(i=0; i<25 -1; i++){ 58 if( a[i]==0 ){ 59 a[i] = p; 60 break; 61 }else{ 62 p = merge_pagelist(a[i], p); 63 a[i] = 0; 64 a[i] = 0; 65 } 66 } 67 if( i==25 -1 ){ 68 a[i] = merge_pagelist(a[i], p); 69 } 70 } 71 p = a[0]; 72 for(i=1; i<25; i++){ 73 p = merge_pagelist (p, a[i]); 74 } 75 return p; 76} 77 78int main() 79{ 80 PgHdr a[5]; 81 PgHdr *p; 82 a[0].x.pgno = 5; 83 a[0].x.pDirty = &a[1]; 84 a[1].x.pgno = 4; 85 a[1].x.pDirty = &a[2]; 86 a[2].x.pgno = 1; 87 a[2].x.pDirty = &a[3]; 88 a[3].x.pgno = 3; 89 a[3].x.pDirty = 0; 90 p = sort_pagelist (&a[0]); 91 if (p->x.pDirty == p) 92 abort (); 93 return 0; 94} 95