Changeset 95 in svn for trunk/xcache.c


Ignore:
Timestamp:
2006-07-16T13:07:57+02:00 (9 years ago)
Author:
Xuefer
Message:

fixed #20, default: --enable-xcache-constant=yes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/xcache.c

    r92 r95  
    301301        case XC_TYPE_PHP:
    302302            php = entry->data.php;
    303             add_assoc_long_ex(ei, ZEND_STRS("sourcesize"),   php->sourcesize);
     303            add_assoc_long_ex(ei, ZEND_STRS("sourcesize"),    php->sourcesize);
    304304#ifdef HAVE_INODE
    305             add_assoc_long_ex(ei, ZEND_STRS("device"),       php->device);
    306             add_assoc_long_ex(ei, ZEND_STRS("inode"),        php->inode);
    307 #endif
    308             add_assoc_long_ex(ei, ZEND_STRS("mtime"),        php->mtime);
    309 
    310             add_assoc_long_ex(ei, ZEND_STRS("function_cnt"), php->funcinfo_cnt);
    311             add_assoc_long_ex(ei, ZEND_STRS("class_cnt"),    php->classinfo_cnt);
     305            add_assoc_long_ex(ei, ZEND_STRS("device"),        php->device);
     306            add_assoc_long_ex(ei, ZEND_STRS("inode"),         php->inode);
     307#endif
     308            add_assoc_long_ex(ei, ZEND_STRS("mtime"),         php->mtime);
     309
     310#ifdef HAVE_XCACHE_CONSTANT
     311            add_assoc_long_ex(ei, ZEND_STRS("constinfo_cnt"), php->constinfo_cnt);
     312#endif
     313            add_assoc_long_ex(ei, ZEND_STRS("function_cnt"),  php->funcinfo_cnt);
     314            add_assoc_long_ex(ei, ZEND_STRS("class_cnt"),     php->classinfo_cnt);
    312315            break;
    313316        case XC_TYPE_VAR:
     
    354357    /* new ptr which is stored inside CG(class_table) */
    355358    xc_cest_t **new_cest_ptrs = (xc_cest_t **)do_alloca(sizeof(xc_cest_t*) * p->classinfo_cnt);
     359#endif
     360
     361#ifdef HAVE_XCACHE_CONSTANT
     362    /* install constant */
     363    for (i = 0; i < p->constinfo_cnt; i ++) {
     364        xc_constinfo_t *ci = &p->constinfos[i];
     365        xc_install_constant(xce->name.str.val, &ci->constant,
     366                UNISW(0, ci->type), ci->key, ci->key_size TSRMLS_CC);
     367    }
    356368#endif
    357369
     
    594606    zend_bool catched = 0;
    595607    char *filename;
     608    int old_constinfo_cnt, old_funcinfo_cnt, old_classinfo_cnt;
    596609
    597610    if (!xc_initized) {
     
    675688    xc_sandbox_init(&sandbox, filename TSRMLS_CC);
    676689
     690    old_classinfo_cnt = zend_hash_num_elements(CG(class_table));
     691    old_funcinfo_cnt  = zend_hash_num_elements(CG(function_table));
     692    old_constinfo_cnt  = zend_hash_num_elements(EG(zend_constants));
     693
    677694    zend_try {
    678695        op_array = origin_compile_file(h, type TSRMLS_CC);
     
    703720    php.op_array      = op_array;
    704721
    705     php.funcinfo_cnt  = zend_hash_num_elements(CG(function_table));
    706     php.classinfo_cnt = zend_hash_num_elements(CG(class_table));
    707 
    708     php.funcinfos     = ECALLOC_N(php.funcinfos, php.funcinfo_cnt);
    709     if (!php.funcinfos) {
    710         goto err_func;
    711     }
    712     php.classinfos    = ECALLOC_N(php.classinfos, php.classinfo_cnt);
    713     if (!php.classinfos) {
    714         goto err_class;
    715     }
     722#ifdef HAVE_XCACHE_CONSTANT
     723    php.constinfo_cnt = zend_hash_num_elements(EG(zend_constants)) - old_constinfo_cnt;
     724#endif
     725    php.funcinfo_cnt  = zend_hash_num_elements(CG(function_table)) - old_funcinfo_cnt;
     726    php.classinfo_cnt = zend_hash_num_elements(CG(class_table))    - old_classinfo_cnt;
     727
     728#define X_ALLOC_N(var, cnt) do {     \
     729    if (php.cnt) {                   \
     730        ECALLOC_N(php.var, php.cnt); \
     731        if (!php.var) {              \
     732            goto err_##var;          \
     733        }                            \
     734    }                                \
     735    else {                           \
     736        php.var = NULL;              \
     737    }                                \
     738} while (0)
     739
     740#ifdef HAVE_XCACHE_CONSTANT
     741    X_ALLOC_N(constinfos, constinfo_cnt);
     742#endif
     743    X_ALLOC_N(funcinfos,  funcinfo_cnt);
     744    X_ALLOC_N(classinfos, classinfo_cnt);
     745#undef X_ALLOC
    716746    /* }}} */
    717747    /* {{{ shallow copy, pointers only */ {
     
    719749        unsigned int i;
    720750
    721         b = CG(function_table)->pListHead;
    722         for (i = 0; b; i ++, b = b->pListNext) {
    723             xc_funcinfo_t *fi = &php.funcinfos[i];
    724 
    725             assert(i < php.funcinfo_cnt);
    726             assert(b->pData);
    727             memcpy(&fi->func, b->pData, sizeof(zend_function));
    728             UNISW(NOTHING, fi->type = b->key.type;)
    729             fi->key        = BUCKET_KEY(b);
    730             fi->key_size   = b->nKeyLength;
    731         }
    732 
    733         b = CG(class_table)->pListHead;
    734         for (i = 0; b; i ++, b = b->pListNext) {
    735             xc_classinfo_t *ci = &php.classinfos[i];
    736 
    737             assert(i < php.classinfo_cnt);
    738             assert(b->pData);
    739             memcpy(&ci->cest, b->pData, sizeof(xc_cest_t));
    740             UNISW(NOTHING, ci->type = b->key.type;)
    741             ci->key        = BUCKET_KEY(b);
    742             ci->key_size   = b->nKeyLength;
    743             /* need to fix inside store */
    744         }
     751#define COPY_H(vartype, var, cnt, name, datatype) do {        \
     752    for (i = 0; b; i ++, b = b->pListNext) {                  \
     753        vartype *data = &php.var[i];                          \
     754                                                              \
     755        if (i < old_##cnt) {                                  \
     756            continue;                                         \
     757        }                                                     \
     758                                                              \
     759        assert(i < old_##cnt + php.cnt);                      \
     760        assert(b->pData);                                     \
     761        memcpy(&data->name, b->pData, sizeof(datatype));      \
     762        UNISW(NOTHING, data->type = b->key.type;)             \
     763        data->key        = BUCKET_KEY(b);                     \
     764        data->key_size   = b->nKeyLength;                     \
     765    }                                                         \
     766} while(0)
     767
     768#ifdef HAVE_XCACHE_CONSTANT
     769        b = EG(zend_constants)->pListHead; COPY_H(xc_constinfo_t, constinfos, constinfo_cnt, constant, zend_constant);
     770#endif
     771        b = CG(function_table)->pListHead; COPY_H(xc_funcinfo_t,  funcinfos,  funcinfo_cnt,  func,     zend_function);
     772        b = CG(class_table)->pListHead;    COPY_H(xc_classinfo_t, classinfos, classinfo_cnt, cest,     xc_cest_t);
     773
     774#undef COPY_H
     775        /* for ZE1, cest need to fix inside store */
    745776    }
    746777    /* }}} */
     
    754785#endif
    755786
    756     efree(xce.data.php->classinfos);
    757 err_class:
    758     efree(xce.data.php->funcinfos);
    759 err_func:
     787#define X_FREE(var) \
     788    if (xce.data.php->var) { \
     789        efree(xce.data.php->var); \
     790    } \
     791err_##var:
     792
     793    X_FREE(classinfos)
     794    X_FREE(funcinfos)
     795#ifdef HAVE_XCACHE_CONSTANT
     796    X_FREE(constinfos)
     797#endif
     798#undef X_FREE
     799
    760800err_oparray:
    761801err_bailout:
     
    790830#endif
    791831    xc_processor_restore_xc_entry_t(&xce, stored_xce, xc_readonly_protection TSRMLS_CC);
    792     op_array = xc_entry_install(&xce, h TSRMLS_CC);
    793 
    794     efree(xce.data.php->funcinfos);
    795     efree(xce.data.php->classinfos);
     832
     833    catched = 0;
     834    zend_try {
     835        op_array = xc_entry_install(&xce, h TSRMLS_CC);
     836    } zend_catch {
     837        catched = 1;
     838    } zend_end_try();
     839
     840#define X_FREE(var) \
     841    if (xce.data.php->var) { \
     842        efree(xce.data.php->var); \
     843    }
     844    X_FREE(classinfos)
     845    X_FREE(funcinfos)
     846#ifdef HAVE_XCACHE_CONSTANT
     847    X_FREE(constinfos)
     848#endif
     849#undef X_FREE
    796850    efree(xce.data.php);
     851
     852    if (catched) {
     853        zend_bailout();
     854    }
    797855#ifdef DEBUG
    798856    fprintf(stderr, "restored\n");
Note: See TracChangeset for help on using the changeset viewer.