Changeset 1460 in svn


Ignore:
Timestamp:
2013-11-09T03:17:15+01:00 (20 months ago)
Author:
Xuefer
Message:

relocate: fix handling hash table, TODO: fix dst/src stuff

Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/mod_cacher/xc_cacher.c

    r1455 r1460  
    177177    php->refcount = 0;
    178178    stored_php = xc_processor_store_xc_entry_data_php_t(cache->shm, cache->allocator, php TSRMLS_CC);
    179 #if 1
     179#if 0
    180180    {
    181181        xc_entry_data_php_t *p = malloc(stored_php->size);
  • trunk/processor/hashtable.m4

    r1459 r1460  
    4848    dnl }}}
    4949    Bucket *srcBucket;
    50     IFCOPY(`Bucket *dstBucket = NULL, *prev = NULL;')
    51     zend_bool first = 1;
     50    IFFIXPOINTER(`Bucket *next;')
     51    IFRELOCATE(`Bucket *dstBucket = NULL;')
     52    IFCOPY(`Bucket *dstBucket = NULL, *first = NULL, *last = NULL;')
    5253    dnl only used for copy
    5354    IFCOPY(`uint n;')
    54     IFCALCCOPY(`size_t bucketsize;')
     55    IFRELOCATE(`uint n;')
     56    IFCALCCOPY(`size_t bucketSize;')
    5557
    5658#if defined(HARDENING_PATCH_HASH_PROTECT) && HARDENING_PATCH_HASH_PROTECT
     
    6769    PROCESS(ulong, nNextFreeElement)
    6870    IFCOPY(`DST(`pInternalPointer') = NULL; /* Used for element traversal */') DONE(pInternalPointer)
    69     IFCOPY(`DST(`pListHead') = NULL;') DONE(pListHead)
    7071#ifdef ZEND_ENGINE_2_4
    7172    if (SRC(`nTableMask')) {
     
    7576        DISABLECHECK(`
    7677        for (srcBucket = SRCPTR_EX(`Bucket', SRC(`pListHead')); srcBucket != NULL; srcBucket = SRCPTR_EX(`Bucket', `srcBucket->pListNext')) {
    77             IFCALCCOPY(`bucketsize = BUCKET_SIZE(srcBucket);')
    78             ALLOC(dstBucket, char, bucketsize, , Bucket)
     78            IFCALCCOPY(`bucketSize = BUCKET_SIZE(srcBucket);')
     79            ALLOC(dstBucket, char, bucketSize, , Bucket)
    7980            IFCOPY(`
    8081#ifdef ZEND_ENGINE_2_4
     
    8889                }
    8990#else
    90                 memcpy(dstBucket, srcBucket, bucketsize);
     91                memcpy(dstBucket, srcBucket, bucketSize);
    9192#endif
    9293                n = srcBucket->h & SRC(`nTableMask');
     
    9899                }
    99100            ')
     101
    100102            IFDPRINT(`
    101103                INDENT()
     
    116118            }
    117119
    118             if (first) {
    119                 IFCOPY(`DST(`pListHead') = dstBucket;')
    120                 first = 0;
    121             }
     120            IFCOPY(`
     121                if (!first) {
     122                    first = dstBucket;
     123                }
    122124
    123             IFCOPY(`
    124125                /* flat link */
    125                 dstBucket->pListLast = prev;
     126                dstBucket->pListLast = last;
    126127                dstBucket->pListNext = NULL;
    127                 if (prev) {
    128                     prev->pListNext = dstBucket;
     128                if (last) {
     129                    last->pListNext = dstBucket;
    129130                }
    130                 prev = dstBucket;
    131             ')
    132             FIXPOINTER_EX(`Bucket', `dstBucket')
    133             IFCOPY(`
     131                last = dstBucket;
     132
     133                n = srcBucket->h & SRC(`nTableMask');
     134                /* dstBucket into hash node chain */
     135                dstBucket->pLast = NULL;
     136                dstBucket->pNext = DST(`arBuckets[n]');
     137                if (dstBucket->pNext) {
     138                    dstBucket->pNext->pLast = dstBucket;
     139                }
    134140                DST(`arBuckets[n]') = dstBucket;
    135141            ')
    136142        }
    137143        ') dnl DISABLECHECK
     144        IFCOPY(`DST(`pListHead') = first;') DONE(pListHead)
     145        IFCOPY(`DST(`pListTail') = dstBucket;') DONE(pListTail)
     146
     147        IFFIXPOINTER(`
     148        for (n = 0; n < SRC(`nTableSize'); ++n) {
     149            if (SRC(`arBuckets[n]')) {
     150                next = DSTPTR_EX(`Bucket', `DST(`arBuckets[n]')');
     151                do {
     152                        dstBucket = next;
     153                        next = DSTPTR_EX(`Bucket', `next->pNext');
     154                        if (dstBucket->pListLast) {
     155                            FIXPOINTER_EX(Bucket, dstBucket->pListLast)
     156                        }
     157                        if (dstBucket->pListNext) {
     158                            FIXPOINTER_EX(Bucket, dstBucket->pListNext)
     159                        }
     160                        if (dstBucket->pNext) {
     161                            FIXPOINTER_EX(Bucket, dstBucket->pNext)
     162                        }
     163                        if (dstBucket->pLast) {
     164                            FIXPOINTER_EX(Bucket, dstBucket->pLast)
     165                        }
     166                } while (next);
     167
     168                FIXPOINTER(Bucket, arBuckets[n])
     169            }
     170        }
     171        ')
     172        FIXPOINTER(Bucket, pListHead)
     173        FIXPOINTER(Bucket, pListTail)
    138174        FIXPOINTER(Bucket *, arBuckets)
    139175#ifdef ZEND_ENGINE_2_4
    140176    }
    141177    else { /* if (SRC(`nTableMask')) */
     178        IFCOPY(`DST(`pListHead') = NULL;') DONE(pListHead)
     179        IFCOPY(`DST(`pListTail') = NULL;') DONE(pListTail)
    142180        DONE(arBuckets)
    143181    }
    144182#endif
    145     IFCOPY(`DST(`pListTail') = dstBucket;') DONE(pListTail)
    146183    IFCOPY(`DST(`pDestructor') = SRC(`pDestructor');') DONE(pDestructor)
    147184    PROCESS(zend_bool, persistent)
  • trunk/processor/head.m4

    r1458 r1460  
    8787    #define notnullable(ptr) (ptr)
    8888#else
    89 static inline void *notnullable(void *ptr)
     89static inline void *notnullable(const void *ptr)
    9090{
    9191    assert(ptr);
    92     return ptr;
     92    return (void *) ptr;
    9393}
    9494#endif
  • trunk/processor/main.m4

    r1458 r1460  
    2626dnl }}}
    2727dnl {{{ SRCPTR_EX(1:type, 2:elm)
    28 define(`SRCPTR_EX', `IFRELOCATE(`ptradd($1 *, notnullable($2), ptrdiff)', `$2')')
     28define(`SRCPTR_EX', `DSTPTR_EX(`$1', `$2')')
     29dnl }}}
     30dnl {{{ DSTPTR_EX(1:type, 2:elm)
     31define(`DSTPTR_EX', `$2')
    2932dnl }}}
    3033dnl {{{ ALLOC(1:dst, 2:type, 3:count=1, 4:clean=false, 5:realtype=$2)
     
    137140dnl }}}
    138141dnl {{{ FIXPOINTER_EX(1:type, 2:dst)
    139 define(`FIXPOINTER_EX', `
    140     IFSTORE(`$2 = ($1 *) processor->shm->handlers->to_readonly(processor->shm, (void *)$2);')
    141     IFRELOCATE(`
    142         pushdef(`relocatee', `patsubst($2, `dst', `src')')
    143         relocatee = ($1 *) (((char *) relocatee) + relocatediff);
    144         popdef(`relocatee')
    145     ')
    146 ')
     142define(`FIXPOINTER_EX', `')
    147143dnl }}}
    148144dnl {{{ IFNOTMEMCPY
     
    243239define(`IFCALCSTORE', `IFSTORE(`$1', `IFCALC(`$1', `$2')')')
    244240define(`IFRESTORE', `ifelse(PROCESSOR_TYPE, `restore', `$1', `$2')')
    245 define(`IFRELOCATE', `ifelse(PROCESSOR_TYPE, `relocate', `$1', `$2')')
    246241define(`IFCOPY', `IFSTORE(`$1', `IFRESTORE(`$1', `$2')')')
    247242define(`IFCALCCOPY', `IFCALC(`$1', `IFCOPY(`$1', `$2')')')
     243define(`IFRELOCATE', `ifelse(PROCESSOR_TYPE, `relocate', `$1', `$2')')
     244define(`IFFIXPOINTER', `IFSTORE(`$1', `IFRELOCATE(`$1', `$2')')')
    248245define(`IFDPRINT', `ifelse(PROCESSOR_TYPE, `dprint', `$1', `$2')')
    249246define(`IFDASM', `ifelse(PROCESSOR_TYPE, `dasm', `$1', `$2')')
     
    262259
    263260REDEF(`PROCESSOR_TYPE', `calc') include(srcdir`/processor/processor.m4')
     261
     262pushdef(`FIXPOINTER_EX', `$2 = ($1 *) processor->shm->handlers->to_readonly(processor->shm, (void *)$2);')
    264263REDEF(`PROCESSOR_TYPE', `store') include(srcdir`/processor/processor.m4')
     264popdef(`FIXPOINTER_EX')
     265
    265266REDEF(`PROCESSOR_TYPE', `restore') include(srcdir`/processor/processor.m4')
     267
     268define(`DSTPTR_EX', `ptradd($1 *, notnullable($2), ptrdiff)')
     269pushdef(`FIXPOINTER_EX', `$2 = ptradd($1 *, notnullable($2), relocatediff);')
     270define(`SRC', `DST(`$1')')
    266271REDEF(`PROCESSOR_TYPE', `relocate') include(srcdir`/processor/processor.m4')
     272popdef(`SRC')
     273popdef(`FIXPOINTER_EX')
     274popdef(`DSTPTR_EX')
    267275
    268276#ifdef HAVE_XCACHE_DPRINT
  • trunk/processor/struct.m4

    r1454 r1460  
    1515        IFSTORE(  `xc_processor_t *processor, $1 *dst, const $1 * const src')
    1616        IFRESTORE(`xc_processor_t *processor, $1 *dst, const $1 * const src')
    17         IFRELOCATE(`$1 *const src, ptrdiff_t ptrdiff, ptrdiff_t relocatediff')
     17        IFRELOCATE(`$1 *const dst, ptrdiff_t ptrdiff, ptrdiff_t relocatediff')
    1818        IFDASM(`xc_dasm_t *dasm, zval *dst, const $1 * const src')
    1919        TSRMLS_DC
     
    149149        IFRESTORE(`processor, $6 $2, $6 $3')
    150150        IFRELOCATE(`
    151             ifelse(`$6', `', `SRCPTR_EX(`$1', `$3')', `$6 $3')
     151            ifelse(`$6', `', `DSTPTR_EX(`$1', `$3')', `$6 $3')
    152152            , ptrdiff
    153153            , relocatediff
Note: See TracChangeset for help on using the changeset viewer.