Changeset 684


Ignore:
Timestamp:
2009-09-29T13:25:01+02:00 (5 years ago)
Author:
moo
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.