Changeset 684 in svn


Ignore:
Timestamp:
2009-09-29T11:25:01Z (6 years ago)
Author:
Xuefer
Message:

the logic of implemenation of dir/file path fixing was wrong. file/dir path should be cached before hardlink

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/processor/head.m4

    r667 r684  
    6565    zend_bool reference; /* enable if to deal with reference */
    6666    zend_bool have_references;
     67    const xc_entry_t *entry_src;
     68    const xc_entry_t *entry_dst;
    6769    const xc_entry_data_php_t *php_src;
    6870    const xc_entry_data_php_t *php_dst;
     
    391393}
    392394/* }}} */
    393 /* export: xc_entry_data_php_t *xc_processor_restore_xc_entry_data_php_t(xc_entry_data_php_t *dst, const xc_entry_data_php_t *src, zend_bool readonly_protection TSRMLS_DC); :export {{{ */
    394 xc_entry_data_php_t *xc_processor_restore_xc_entry_data_php_t(xc_entry_data_php_t *dst, const xc_entry_data_php_t *src, zend_bool readonly_protection TSRMLS_DC) {
     395/* export: xc_entry_data_php_t *xc_processor_restore_xc_entry_data_php_t(const xc_entry_t *xce, xc_entry_data_php_t *dst, const xc_entry_data_php_t *src, zend_bool readonly_protection TSRMLS_DC); :export {{{ */
     396xc_entry_data_php_t *xc_processor_restore_xc_entry_data_php_t(const xc_entry_t *xce, xc_entry_data_php_t *dst, const xc_entry_data_php_t *src, zend_bool readonly_protection TSRMLS_DC) {
    395397    xc_processor_t processor;
    396398
     
    401403        processor.reference = 1;
    402404    }
     405    processor.entry_src = xce;
    403406
    404407    if (processor.reference) {
  • trunk/processor/processor.m4

    r666 r684  
    664664#endif
    665665    } while (0);
    666     IFRESTORE(`xc_fix_op_array_info(processor->php_src, dst, !shallow_copy, op_array_info TSRMLS_CC);')
     666    IFRESTORE(`xc_fix_op_array_info(processor->entry_src, processor->php_src, dst, !shallow_copy, op_array_info TSRMLS_CC);')
    667667
    668668#ifdef ZEND_ENGINE_2
     
    819819    DISPATCH(size_t, size)
    820820
    821     DISPATCH(int, filepath_len)
    822     IFRESTORE(`COPY(filepath)', `PROC_STRING_L(filepath, filepath_len)')
    823     DISPATCH(int, dirpath_len)
    824     IFRESTORE(`COPY(dirpath)', `PROC_STRING_L(dirpath, dirpath_len)')
    825 #ifdef IS_UNICODE
    826     DISPATCH(int, ufilepath_len)
    827     IFRESTORE(`COPY(ufilepath)', `PROC_USTRING_L(ufilepath, ufilepath_len)')
    828     DISPATCH(int, udirpath_len)
    829     IFRESTORE(`COPY(udirpath)', `PROC_USTRING_L(udirpath, udirpath_len)')
    830 #endif
    831 
    832821    IFRESTORE(`COPY(op_array_info)', `
    833822        STRUCT(xc_op_array_info_t, op_array_info)
     
    943932    DISPATCH(int, inode)
    944933#endif
     934
     935    DISPATCH(int, filepath_len)
     936    IFRESTORE(`COPY(filepath)', `PROC_STRING_L(filepath, filepath_len)')
     937    DISPATCH(int, dirpath_len)
     938    IFRESTORE(`COPY(dirpath)', `PROC_STRING_L(dirpath, dirpath_len)')
     939#ifdef IS_UNICODE
     940    DISPATCH(int, ufilepath_len)
     941    IFRESTORE(`COPY(ufilepath)', `PROC_USTRING_L(ufilepath, ufilepath_len)')
     942    DISPATCH(int, udirpath_len)
     943    IFRESTORE(`COPY(udirpath)', `PROC_USTRING_L(udirpath, udirpath_len)')
     944#endif
     945
    945946')
    946947dnl }}}
  • trunk/xcache.c

    r683 r684  
    11
    2 #if 0
     2#if 1
    33#define XCACHE_DEBUG
    44#endif
     
    945945}
    946946/* }}} */
    947 static int xc_entry_init_key_php(xc_entry_t *xce, char *filename, char *opened_path_buffer TSRMLS_DC) /* {{{ */
    948 {
     947static void xc_entry_free_key_php(xc_entry_t *xce TSRMLS_DC) /* {{{ */
     948{
     949#define X_FREE(var) do {\
     950    if (xce->var) { \
     951        efree(xce->var); \
     952    } \
     953} while (0)
     954    X_FREE(dirpath);
     955#ifdef IS_UNICODE
     956    X_FREE(ufilepath);
     957    X_FREE(udirpath);
     958#endif
     959
     960#undef X_FREE
     961}
     962/* }}} */
     963
     964static int xc_entry_init_key_php(xc_entry_t *xce, char *filename TSRMLS_DC) /* {{{ */
     965{
     966    char opened_path_buffer[MAXPATHLEN];
    949967    struct stat buf, *pbuf;
    950968    xc_hash_value_t hv;
     
    11061124
    11071125    return SUCCESS;
     1126}
     1127/* }}} */
     1128static void xc_entry_init_key_php_entry(xc_entry_t *xce, char *filepath TSRMLS_DC) /* {{{*/
     1129{
     1130    xce->filepath     = filepath;
     1131    xce->filepath_len = strlen(xce->filepath);
     1132    xce->dirpath      = estrndup(xce->filepath, xce->filepath_len);
     1133    xce->dirpath_len  = zend_dirname(xce->dirpath, xce->filepath_len);
     1134#ifdef IS_UNICODE
     1135    zend_string_to_unicode(ZEND_U_CONVERTER(UG(runtime_encoding_conv)), &xce->ufilepath, &xce->ufilepath_len, xce->filepath, xce->filepath_len TSRMLS_CC);
     1136    zend_string_to_unicode(ZEND_U_CONVERTER(UG(runtime_encoding_conv)), &xce->udirpath,  &xce->udirpath_len,  xce->dirpath,  xce->dirpath_len TSRMLS_CC);
     1137#endif
    11081138}
    11091139/* }}} */
     
    11501180} xc_const_usage_t;
    11511181/* }}} */
    1152 static void xc_collect_op_array_info(xc_entry_data_php_t *php, xc_const_usage_t *usage, xc_op_array_info_t *op_array_info, zend_op_array *op_array TSRMLS_DC) /* {{{ */
     1182static void xc_collect_op_array_info(xc_entry_t *xce, xc_entry_data_php_t *php, xc_const_usage_t *usage, xc_op_array_info_t *op_array_info, zend_op_array *op_array TSRMLS_DC) /* {{{ */
    11531183{
    11541184    int oplineno;
     
    11581188
    11591189#define XCACHE_CHECK_OP(type, op) \
    1160     if (zend_binary_strcmp(Z_STRVAL(opline->op.u.constant), Z_STRLEN(opline->op.u.constant), php->type##path, php->type##path_len) == 0) { \
     1190    if (zend_binary_strcmp(Z_STRVAL(opline->op.u.constant), Z_STRLEN(opline->op.u.constant), xce->type##path, xce->type##path_len) == 0) { \
    11611191        usage->type##path_used = 1; \
    11621192        oplineinfo |= xcache_##op##_is_##type; \
     
    11641194
    11651195#define XCACHE_U_CHECK_OP(type, op) \
    1166     if (zend_u_##binary_strcmp(Z_USTRVAL(opline->op.u.constant), Z_USTRLEN(opline->op.u.constant), php->u##type##path, php->u##type##path_len) == 0) { \
     1196    if (zend_u_##binary_strcmp(Z_USTRVAL(opline->op.u.constant), Z_USTRLEN(opline->op.u.constant), xce->u##type##path, xce->u##type##path_len) == 0) { \
    11671197        usage->u##type##path_used = 1; \
    11681198        oplineinfo |= xcache_##op##_is_##type; \
     
    12091239}
    12101240/* }}} */
    1211 void xc_fix_op_array_info(const xc_entry_data_php_t *php, zend_op_array *op_array, int copy, const xc_op_array_info_t *op_array_info TSRMLS_DC) /* {{{ */
     1241void xc_fix_op_array_info(const xc_entry_t *xce, const xc_entry_data_php_t *php, zend_op_array *op_array, int copy, const xc_op_array_info_t *op_array_info TSRMLS_DC) /* {{{ */
    12121242{
    12131243    int i;
     
    12261256            }
    12271257            if (Z_TYPE(opline->op1.u.constant) == IS_STRING) {
    1228                 assert(php->filepath);
    1229                 ZVAL_STRINGL(&opline->op1.u.constant, php->filepath, php->filepath_len, copy);
     1258                assert(xce->filepath);
     1259                ZVAL_STRINGL(&opline->op1.u.constant, xce->filepath, xce->filepath_len, copy);
     1260                TRACE("fixing op1 to %s", xce->filepath);
    12301261            }
    12311262#ifdef IS_UNICODE
    12321263            else if (Z_TYPE(opline->op1.u.constant) == IS_UNICODE) {
    1233                 assert(php->ufilepath);
    1234                 ZVAL_UNICODEL(&opline->op1.u.constant, php->ufilepath, php->ufilepath_len, copy);
     1264                assert(xce->ufilepath);
     1265                ZVAL_UNICODEL(&opline->op1.u.constant, xce->ufilepath, xce->ufilepath_len, copy);
    12351266            }
    12361267#endif
     
    12451276            }
    12461277            if (Z_TYPE(opline->op1.u.constant) == IS_STRING) {
    1247                 assert(php->dirpath);
    1248                 ZVAL_STRINGL(&opline->op1.u.constant, php->dirpath, php->dirpath_len, copy);
     1278                assert(xce->dirpath);
     1279                TRACE("fixing op1 to %s", xce->dirpath);
     1280                ZVAL_STRINGL(&opline->op1.u.constant, xce->dirpath, xce->dirpath_len, copy);
    12491281            }
    12501282#ifdef IS_UNICODE
    12511283            else if (Z_TYPE(opline->op1.u.constant) == IS_UNICODE) {
    1252                 assert(!php->udirpath);
    1253                 ZVAL_UNICODEL(&opline->op1.u.constant, php->udirpath, php->udirpath_len, copy);
     1284                assert(!xce->udirpath);
     1285                ZVAL_UNICODEL(&opline->op1.u.constant, xce->udirpath, xce->udirpath_len, copy);
    12541286            }
    12551287#endif
     
    12651297            }
    12661298            if (Z_TYPE(opline->op2.u.constant) == IS_STRING) {
    1267                 assert(php->filepath);
    1268                 ZVAL_STRINGL(&opline->op2.u.constant, php->filepath, php->filepath_len, copy);
     1299                assert(xce->filepath);
     1300                TRACE("fixing op2 to %s", xce->filepath);
     1301                ZVAL_STRINGL(&opline->op2.u.constant, xce->filepath, xce->filepath_len, copy);
    12691302            }
    12701303#ifdef IS_UNICODE
    12711304            else if (Z_TYPE(opline->op2.u.constant) == IS_UNICODE) {
    1272                 assert(php->ufilepath);
    1273                 ZVAL_UNICODEL(&opline->op2.u.constant, php->ufilepath, php->ufilepath_len, copy);
     1305                assert(xce->ufilepath);
     1306                ZVAL_UNICODEL(&opline->op2.u.constant, xce->ufilepath, xce->ufilepath_len, copy);
    12741307            }
    12751308#endif
     
    12841317            }
    12851318            if (Z_TYPE(opline->op2.u.constant) == IS_STRING) {
    1286                 assert(!php->dirpath);
    1287                 ZVAL_STRINGL(&opline->op2.u.constant, php->dirpath, php->dirpath_len, copy);
     1319                assert(!xce->dirpath);
     1320                TRACE("fixing op2 to %s", xce->dirpath);
     1321                ZVAL_STRINGL(&opline->op2.u.constant, xce->dirpath, xce->dirpath_len, copy);
    12881322            }
    12891323#ifdef IS_UNICODE
    12901324            else if (Z_TYPE(opline->op2.u.constant) == IS_UNICODE) {
    1291                 assert(!php->udirpath);
    1292                 ZVAL_UNICODEL(&opline->op2.u.constant, php->udirpath, php->udirpath_len, copy);
     1325                assert(!xce->udirpath);
     1326                ZVAL_UNICODEL(&opline->op2.u.constant, xce->udirpath, xce->udirpath_len, copy);
    12931327            }
    12941328#endif
     
    13361370} while (0)
    13371371
    1338     X_FREE(dirpath);
    1339 #ifdef IS_UNICODE
    1340     X_FREE(ufilepath);
    1341     X_FREE(udirpath);
    1342 #endif
    1343 
    13441372#ifdef ZEND_ENGINE_2_1
    13451373    X_FREE(autoglobals);
     
    13531381}
    13541382/* }}} */
    1355 static zend_op_array *xc_compile_php(xc_entry_data_php_t *php, zend_file_handle *h, int type TSRMLS_DC) /* {{{ */
     1383static zend_op_array *xc_compile_php(xc_entry_t *xce, xc_entry_data_php_t *php, zend_file_handle *h, int type TSRMLS_DC) /* {{{ */
    13561384{
    13571385    zend_op_array *op_array;
    13581386    int old_constinfo_cnt, old_funcinfo_cnt, old_classinfo_cnt;
    13591387    zend_bool catched = 0;
    1360     xc_const_usage_t const_usage;
    13611388
    13621389    /* {{{ compile */
     
    14361463    /* }}} */
    14371464
    1438     /* {{{ file/dir path init */
    1439     memset(&const_usage, 0, sizeof(const_usage));
    1440     php->filepath     = zend_get_compiled_filename(TSRMLS_C);
    1441     php->filepath_len = strlen(php->filepath);
    1442     php->dirpath      = estrndup(php->filepath, php->filepath_len);
    1443     php->dirpath_len  = zend_dirname(php->dirpath, php->filepath_len);
    1444 #ifdef IS_UNICODE
    1445     zend_string_to_unicode(ZEND_U_CONVERTER(UG(runtime_encoding_conv)), &php->ufilepath, &php->ufilepath_len, php->filepath, php->filepath_len TSRMLS_CC);
    1446     zend_string_to_unicode(ZEND_U_CONVERTER(UG(runtime_encoding_conv)), &php->udirpath,  &php->udirpath_len,  php->dirpath,  php->dirpath_len TSRMLS_CC);
    1447 #endif
    1448     /* }}} */
    14491465    /* {{{ shallow copy, pointers only */ {
    14501466        Bucket *b;
     
    14821498        b = CG(class_table)->pListHead;    COPY_H(xc_classinfo_t, classinfos, classinfo_cnt, cest,     xc_cest_t);
    14831499
    1484         for (i = 0; i < php->classinfo_cnt; i ++) {
    1485             xc_classinfo_t *classinfo = &php->classinfos[i];
    1486             zend_class_entry *ce = CestToCePtr(classinfo->cest);
    1487             classinfo->methodinfo_cnt = ce->function_table.nTableSize;
    1488             if (classinfo->methodinfo_cnt) {
    1489                 int j;
    1490 
    1491                 ECALLOC_N(classinfo->methodinfos, classinfo->methodinfo_cnt);
    1492                 if (!classinfo->methodinfos) {
    1493                     goto err_alloc;
    1494                 }
    1495 
    1496                 for (j = 0, b = ce->function_table.pListHead; b; j ++, b = b->pListNext) {
    1497                     xc_collect_op_array_info(php, &const_usage, &classinfo->methodinfos[j], (zend_op_array *) b->pData TSRMLS_CC);
    1498                 }
    1499             }
    1500             else {
    1501                 classinfo->methodinfos = NULL;
    1502             }
    1503         }
    1504 
    1505         for (i = 0; i < php->funcinfo_cnt; i ++) {
    1506             xc_collect_op_array_info(php, &const_usage, &php->funcinfos[i].op_array_info, (zend_op_array *) &php->funcinfos[i].func TSRMLS_CC);
    1507         }
    1508 
    1509         xc_collect_op_array_info(php, &const_usage, &php->op_array_info, php->op_array TSRMLS_CC);
    1510 
    15111500#undef COPY_H
    15121501
     
    15381527    }
    15391528    /* }}} */
    1540     /* {{{ file/dir path free unused */
     1529
     1530    /* {{{ collect info for file/dir path */ {
     1531        Bucket *b;
     1532        xc_const_usage_t const_usage;
     1533        unsigned int i;
     1534
     1535        xc_entry_init_key_php_entry(xce, zend_get_compiled_filename(TSRMLS_C) TSRMLS_CC);
     1536        memset(&const_usage, 0, sizeof(const_usage));
     1537
     1538        for (i = 0; i < php->classinfo_cnt; i ++) {
     1539            xc_classinfo_t *classinfo = &php->classinfos[i];
     1540            zend_class_entry *ce = CestToCePtr(classinfo->cest);
     1541            classinfo->methodinfo_cnt = ce->function_table.nTableSize;
     1542            if (classinfo->methodinfo_cnt) {
     1543                int j;
     1544
     1545                ECALLOC_N(classinfo->methodinfos, classinfo->methodinfo_cnt);
     1546                if (!classinfo->methodinfos) {
     1547                    goto err_alloc;
     1548                }
     1549
     1550                for (j = 0, b = ce->function_table.pListHead; b; j ++, b = b->pListNext) {
     1551                    xc_collect_op_array_info(xce, php, &const_usage, &classinfo->methodinfos[j], (zend_op_array *) b->pData TSRMLS_CC);
     1552                }
     1553            }
     1554            else {
     1555                classinfo->methodinfos = NULL;
     1556            }
     1557        }
     1558
     1559        for (i = 0; i < php->funcinfo_cnt; i ++) {
     1560            xc_collect_op_array_info(xce, php, &const_usage, &php->funcinfos[i].op_array_info, (zend_op_array *) &php->funcinfos[i].func TSRMLS_CC);
     1561        }
     1562
     1563        xc_collect_op_array_info(xce, php, &const_usage, &php->op_array_info, php->op_array TSRMLS_CC);
     1564
     1565        /* file/dir path free unused */
    15411566#define X_FREE_UNUSED(var) \
    1542     if (!const_usage.var##path_used) { \
    1543         efree(php->var##path); \
    1544         php->var##path = NULL; \
    1545         php->var##path_len = 0; \
    1546     }
    1547     if (!const_usage.filepath_used) {
    1548         php->filepath = NULL;
    1549         php->filepath_len = 0;
    1550     }
    1551     X_FREE_UNUSED(dir)
     1567        if (!const_usage.var##path_used) { \
     1568            efree(xce->var##path); \
     1569            xce->var##path = NULL; \
     1570            xce->var##path_len = 0; \
     1571        }
     1572        if (!const_usage.filepath_used) {
     1573            xce->filepath = NULL;
     1574            xce->filepath_len = 0;
     1575        }
     1576        X_FREE_UNUSED(dir)
    15521577#ifdef IS_UNICODE
    1553     X_FREE_UNUSED(ufile)
    1554     X_FREE_UNUSED(udir)
     1578        X_FREE_UNUSED(ufile)
     1579        X_FREE_UNUSED(udir)
    15551580#endif
    15561581#undef X_FREE_UNUSED
     1582    }
    15571583    /* }}} */
    15581584#ifdef XCACHE_ERROR_CACHING
     
    16031629    TRACE("restoring %s", stored_xce->name.str.val);
    16041630    xc_processor_restore_xc_entry_t(&xce, stored_xce TSRMLS_CC);
    1605     xc_processor_restore_xc_entry_data_php_t(&php, xce.data.php, xc_readonly_protection TSRMLS_CC);
     1631    xc_processor_restore_xc_entry_data_php_t(stored_xce, &php, xce.data.php, xc_readonly_protection TSRMLS_CC);
    16061632    xce.data.php = &php;
    16071633#ifdef SHOW_DPRINT
     
    16411667}
    16421668/* }}} */
    1643 static zend_op_array *xc_compile_file(zend_file_handle *h, int type TSRMLS_DC) /* {{{ */
     1669static zend_op_array *xc_compile_file_ex(xc_entry_t *xce, zend_file_handle *h, int type TSRMLS_DC) /* {{{ */
    16441670{
    16451671    zend_op_array *op_array;
    1646     xc_entry_t xce, *stored_xce;
    1647     xc_entry_data_php_t php, *stored_php;
    1648     xc_cache_t *cache;
     1672    xc_entry_t *stored_xce;
     1673    xc_entry_data_php_t *stored_php;
     1674    xc_cache_t *cache = xce->cache;
    16491675    zend_bool gaveup = 0;
    16501676    zend_bool catched = 0;
    16511677    zend_bool newlycompiled;
    1652     char *filename;
    1653     char opened_path_buffer[MAXPATHLEN];
    16541678    xc_sandbox_t sandbox;
    1655 
    1656     assert(xc_initized);
    1657 
    1658     TRACE("type = %d\n", h->type);
    1659     if (!XG(cacher)) {
    1660         op_array = old_compile_file(h, type TSRMLS_CC);
    1661         return op_array;
    1662     }
    1663 
    1664     /* {{{ entry_init_key */
    1665     filename = h->opened_path ? h->opened_path : h->filename;
    1666     xce.data.php = &php;
    1667     if (xc_entry_init_key_php(&xce, filename, opened_path_buffer TSRMLS_CC) != SUCCESS) {
    1668         TRACE("failed to init key for %s", filename);
    1669         return old_compile_file(h, type TSRMLS_CC);
    1670     }
    1671     cache = xce.cache;
    1672     /* }}} */
    16731679
    16741680    /* stale clogs precheck */
     
    16811687    stored_php = NULL;
    16821688    ENTER_LOCK_EX(cache) {
    1683         stored_xce = xc_entry_find_dmz(&xce TSRMLS_CC);
     1689        stored_xce = xc_entry_find_dmz(xce TSRMLS_CC);
    16841690        if (stored_xce) {
    16851691            xc_cache_hit_dmz(cache TSRMLS_CC);
     
    16901696        else {
    16911697            cache->misses ++;
    1692             TRACE("miss %s", xce.name.str.val);
    1693 
    1694             if (xc_entry_init_key_php_md5(&php, &xce TSRMLS_CC) != SUCCESS) {
     1698            TRACE("miss %s", xce->name.str.val);
     1699
     1700            if (xc_entry_init_key_php_md5(xce->data.php, xce TSRMLS_CC) != SUCCESS) {
    16951701                gaveup = 1;
    16961702                break;
    16971703            }
    16981704
    1699             stored_php = xc_php_find_dmz(&php TSRMLS_CC);
     1705            stored_php = xc_php_find_dmz(xce->data.php TSRMLS_CC);
    17001706
    17011707            /* miss but compiling */
     
    17361742    if (stored_php) {
    17371743        newlycompiled = 0;
    1738         xce.data.php = stored_php;
     1744        xc_entry_init_key_php_entry(xce, h->opened_path ? h->opened_path : h->filename TSRMLS_CC);
     1745        xce->data.php = stored_php;
    17391746    }
    17401747    else {
     
    17421749
    17431750        /* make compile inside sandbox */
    1744         xc_sandbox_init(&sandbox, filename TSRMLS_CC);
     1751        xc_sandbox_init(&sandbox, h->opened_path ? h->opened_path : h->filename TSRMLS_CC);
    17451752
    17461753#ifdef HAVE_XCACHE_CONSTANT
    1747         php.constinfos  = NULL;
    1748 #endif
    1749         php.funcinfos   = NULL;
    1750         php.classinfos  = NULL;
     1754        xce->data.php->constinfos  = NULL;
     1755#endif
     1756        xce->data.php->funcinfos   = NULL;
     1757        xce->data.php->classinfos  = NULL;
    17511758#ifdef ZEND_ENGINE_2_1
    1752         php.autoglobals = NULL;
    1753 #endif
    1754 
    1755 #ifdef IS_UNICODE
    1756         php.udirpath = NULL;
    1757         php.ufilepath = NULL;
    1758 #endif
    1759         php.dirpath = NULL;
    1760 
    1761         memset(&php.op_array_info, 0, sizeof(php.op_array_info));
     1759        xce->data.php->autoglobals = NULL;
     1760#endif
     1761
     1762        memset(&xce->data.php->op_array_info, 0, sizeof(xce->data.php->op_array_info));
    17621763
    17631764        zend_try {
    1764             op_array = xc_compile_php(&php, h, type TSRMLS_CC);
     1765            op_array = xc_compile_php(xce, xce->data.php, h, type TSRMLS_CC);
    17651766        } zend_catch {
    17661767            catched = 1;
     
    17721773
    17731774        /* not cachable */
    1774         if (!php.op_array) {
     1775        if (!xce->data.php->op_array) {
    17751776            cache->compiling = 0;
    17761777            /* it's not cachable, but don't scare the users with high misses */
     
    17791780            return op_array;
    17801781        }
    1781 
    1782         xce.data.php = &php;
    17831782    }
    17841783    /* }}} */
     
    17891788     * WARNING: this code is required to be after compile
    17901789     */
    1791     if (xce.inode) {
    1792         filename = h->opened_path ? h->opened_path : h->filename;
    1793         if (xce.name.str.val != filename) {
    1794             xce.name.str.val = filename;
    1795             xce.name.str.len = strlen(filename);
     1790    if (xce->inode) {
     1791        char *filename = h->opened_path ? h->opened_path : h->filename;
     1792        if (xce->name.str.val != filename) {
     1793            xce->name.str.val = filename;
     1794            xce->name.str.len = strlen(filename);
    17961795        }
    17971796    }
     
    17991798#endif
    18001799#ifdef SHOW_DPRINT
    1801     xc_dprint(&xce, 0 TSRMLS_CC);
     1800    xc_dprint(xce, 0 TSRMLS_CC);
    18021801#endif
    18031802    stored_xce = NULL;
     
    18051804        /* php_store */
    18061805        if (newlycompiled) {
    1807             stored_php = xc_php_store_dmz(&php TSRMLS_CC);
     1806            stored_php = xc_php_store_dmz(xce->data.php TSRMLS_CC);
    18081807            if (!stored_php) {
    18091808                /* error */
     
    18131812        /* entry_store */
    18141813        xc_php_addref_dmz(stored_php);
    1815         stored_xce = xc_entry_store_dmz(&xce TSRMLS_CC);
     1814        stored_xce = xc_entry_store_dmz(xce TSRMLS_CC);
    18161815        if (stored_xce) {
    18171816            stored_xce->data.php = stored_php;
     
    18311830
    18321831    if (newlycompiled) {
    1833         xc_free_php(&php TSRMLS_CC);
     1832        xc_free_php(xce->data.php TSRMLS_CC);
    18341833    }
    18351834
     
    18621861err_aftersandbox:
    18631862    if (newlycompiled) {
    1864         xc_free_php(&php TSRMLS_CC);
     1863        xc_free_php(xce->data.php TSRMLS_CC);
    18651864        xc_sandbox_free(&sandbox, XC_NoInstall TSRMLS_CC);
    18661865    }
     
    18711870        zend_bailout();
    18721871    }
     1872    return op_array;
     1873}
     1874/* }}} */
     1875static zend_op_array *xc_compile_file(zend_file_handle *h, int type TSRMLS_DC) /* {{{ */
     1876{
     1877    zend_op_array *op_array;
     1878    xc_entry_t xce;
     1879    xc_entry_data_php_t php;
     1880    char *filename;
     1881
     1882    assert(xc_initized);
     1883
     1884    TRACE("type = %d\n", h->type);
     1885    if (!XG(cacher)) {
     1886        op_array = old_compile_file(h, type TSRMLS_CC);
     1887        return op_array;
     1888    }
     1889
     1890    /* {{{ entry_init_key */
     1891    filename = h->opened_path ? h->opened_path : h->filename;
     1892    xce.data.php = &php;
     1893    if (xc_entry_init_key_php(&xce, filename TSRMLS_CC) != SUCCESS) {
     1894        TRACE("failed to init key for %s", filename);
     1895        return old_compile_file(h, type TSRMLS_CC);
     1896    }
     1897    /* }}} */
     1898
     1899    op_array = xc_compile_file_ex(&xce, h, type TSRMLS_CC);
     1900
     1901    xc_entry_free_key_php(&xce TSRMLS_CC);
     1902
    18731903    return op_array;
    18741904}
  • trunk/xcache.h

    r671 r684  
    320320    size_t     size;
    321321
    322     int    filepath_len;
    323     char  *filepath;
    324     int    dirpath_len;
    325     char  *dirpath;
    326 #ifdef IS_UNICODE
    327     UChar *ufilepath;
    328     int    ufilepath_len;
    329     UChar *udirpath;
    330     int    udirpath_len;
    331 #endif
    332 
    333322    xc_op_array_info_t op_array_info;
    334323    zend_op_array *op_array;
     
    399388    int inode;              /* the filesystem inode */
    400389#endif
     390
     391    /* php only */
     392    int    filepath_len;
     393    char  *filepath;
     394    int    dirpath_len;
     395    char  *dirpath;
     396#ifdef IS_UNICODE
     397    UChar *ufilepath;
     398    int    ufilepath_len;
     399    UChar *udirpath;
     400    int    udirpath_len;
     401#endif
     402
    401403};
    402404/* }}} */
     
    419421/* }}} */
    420422void xc_gc_add_op_array(xc_gc_op_array_t *gc_op_array TSRMLS_DC);
    421 void xc_fix_op_array_info(const xc_entry_data_php_t *php, zend_op_array *op_array, int shallow_copied, const xc_op_array_info_t *op_array_info TSRMLS_DC);
     423void xc_fix_op_array_info(const xc_entry_t *xce, const xc_entry_data_php_t *php, zend_op_array *op_array, int shallow_copied, const xc_op_array_info_t *op_array_info TSRMLS_DC);
    422424
    423425#endif /* __XCACHE_H */
Note: See TracChangeset for help on using the changeset viewer.