Changeset 165 for trunk/xcache.c


Ignore:
Timestamp:
2006-09-13T14:22:57+02:00 (8 years ago)
Author:
moo
Message:

implement xcache.stat. and reimpl [160] for trunk to fix win32 hash problem

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/xcache.c

    r164 r165  
    121121                xc_entry_data_php_t *ap = a->data.php; 
    122122                xc_entry_data_php_t *bp = b->data.php; 
    123                 return ap->inode == bp->inode 
    124                     && ap->device == bp->device; 
     123                if (ap->inode) { 
     124                    return ap->inode == bp->inode 
     125                        && ap->device == bp->device; 
     126                } 
    125127            } while(0); 
    126128#endif 
     
    618620static int xc_stat(const char *filename, const char *include_path, struct stat *pbuf TSRMLS_DC) /* {{{ */ 
    619621{ 
    620     char filepath[1024]; 
     622    char filepath[MAXPATHLEN]; 
    621623    char *paths, *path; 
    622624    char *tokbuf; 
     
    628630 
    629631    for (path = php_strtok_r(paths, tokens, &tokbuf); path; path = php_strtok_r(NULL, tokens, &tokbuf)) { 
    630         if (strlen(path) + strlen(filename) + 1 > 1024) { 
     632        if (snprintf(filepath, sizeof(filepath), "%s/%s", path, filename) >= MAXPATHLEN - 1) { 
    631633            continue; 
    632634        } 
    633         snprintf(filepath, sizeof(filepath), "%s/%s", path, filename); 
    634635        if (VCWD_STAT(filepath, pbuf) == 0) { 
    635636            free_alloca(paths); 
     
    649650#define HASH_STR(s) HASH_STR_L(s, strlen(s) + 1) 
    650651#define HASH_NUM(n) HASH(n) 
    651 static inline xc_hash_value_t xc_entry_hash_var(xc_entry_t *xce TSRMLS_DC) /* {{{ */ 
     652static inline xc_hash_value_t xc_entry_hash_name(xc_entry_t *xce TSRMLS_DC) /* {{{ */ 
    652653{ 
    653654    return UNISW(NOTHING, UG(unicode) ? HASH_USTR_L(xce->name_type, xce->name.uni.val, xce->name.uni.len) :) 
     
    655656} 
    656657/* }}} */ 
     658#define xc_entry_hash_var xc_entry_hash_name 
    657659static inline xc_hash_value_t xc_entry_hash_php(xc_entry_t *xce TSRMLS_DC) /* {{{ */ 
    658660{ 
    659661#ifdef HAVE_INODE 
    660     return HASH(xce->data.php->device + xce->data.php->inode); 
    661 #else 
    662     return xc_entry_hash_var(xce TSRMLS_CC); 
    663 #endif 
    664 } 
    665 /* }}} */ 
    666 static int xc_entry_init_key_php(xc_entry_t *xce, char *filename TSRMLS_DC) /* {{{ */ 
     662    if (xce->data.php->inode) { 
     663        return HASH(xce->data.php->device + xce->data.php->inode); 
     664    } 
     665#endif 
     666    return xc_entry_hash_name(xce TSRMLS_CC); 
     667} 
     668/* }}} */ 
     669static int xc_entry_init_key_php(xc_entry_t *xce, char *filename, char *opened_path_buffer TSRMLS_DC) /* {{{ */ 
    667670{ 
    668671    struct stat buf, *pbuf; 
     
    676679    } 
    677680 
    678     do { 
     681    php = xce->data.php; 
     682 
     683    if (XG(stat)) { 
    679684        if (strcmp(SG(request_info).path_translated, filename) == 0) { 
    680685            /* sapi has already done this stat() for us */ 
    681686            pbuf = sapi_get_stat(TSRMLS_C); 
    682687            if (pbuf) { 
    683                 break; 
     688                goto stat_done; 
    684689            } 
    685690        } 
     
    691696                return 0; 
    692697            } 
    693             break; 
     698            goto stat_done; 
    694699        } 
    695700 
     
    707712                return 0; 
    708713            } 
    709             break; 
     714            goto stat_done; 
    710715        } 
    711716not_relative_path: 
     
    715720            return 0; 
    716721        } 
    717     } while (0); 
    718  
    719     if (XG(request_time) - pbuf->st_mtime < 2) { 
    720         return 0; 
     722 
     723        /* fall */ 
     724 
     725stat_done: 
     726        if (XG(request_time) - pbuf->st_mtime < 2) { 
     727            return 0; 
     728        } 
     729 
     730        php->mtime        = pbuf->st_mtime; 
     731#ifdef HAVE_INODE 
     732        php->device       = pbuf->st_dev; 
     733        php->inode        = pbuf->st_ino; 
     734#endif 
     735        php->sourcesize   = pbuf->st_size; 
     736    } 
     737    else { /* XG(inode) */ 
     738        php->mtime        = 0; 
     739#ifdef HAVE_INODE 
     740        php->device       = 0; 
     741        php->inode        = 0; 
     742#endif 
     743        php->sourcesize   = 0; 
     744    } 
     745 
     746#ifdef HAVE_INODE 
     747    if (!php->inode) 
     748#endif 
     749    { 
     750        /* hash on filename, let's expand it to real path */ 
     751        filename = expand_filepath(filename, opened_path_buffer TSRMLS_CC); 
     752        if (filename == NULL) { 
     753            return 0; 
     754        } 
    721755    } 
    722756 
     
    724758    xce->name.str.val = filename; 
    725759    xce->name.str.len = strlen(filename); 
    726  
    727     php = xce->data.php; 
    728     php->mtime        = pbuf->st_mtime; 
    729 #ifdef HAVE_INODE 
    730     php->device       = pbuf->st_dev; 
    731     php->inode        = pbuf->st_ino; 
    732 #endif 
    733     php->sourcesize   = pbuf->st_size; 
    734  
    735760 
    736761    hv = xc_entry_hash_php(xce TSRMLS_CC); 
     
    754779    zend_bool catched = 0; 
    755780    char *filename; 
     781    char opened_path_buffer[MAXPATHLEN]; 
    756782    int old_constinfo_cnt, old_funcinfo_cnt, old_classinfo_cnt; 
    757783 
     
    779805    filename = h->opened_path ? h->opened_path : h->filename; 
    780806    xce.data.php = &php; 
    781     if (!xc_entry_init_key_php(&xce, filename TSRMLS_CC)) { 
     807    if (!xc_entry_init_key_php(&xce, filename, opened_path_buffer TSRMLS_CC)) { 
    782808        return origin_compile_file(h, type TSRMLS_CC); 
    783809    } 
     
    860886 
    861887    filename = h->opened_path ? h->opened_path : h->filename; 
    862     if (xce.name.str.val != filename) { 
    863         xce.name.str.val = filename; 
    864         xce.name.str.len = strlen(filename); 
     888    /* none-inode enabled entry hash/compare on name 
     889     * do not update to its name to real pathname 
     890     */ 
     891#ifdef HAVE_INODE 
     892    if (xce.data.php->inode) 
     893#endif 
     894    { 
     895        if (xce.name.str.val != filename) { 
     896            xce.name.str.val = filename; 
     897            xce.name.str.len = strlen(filename); 
     898        } 
    865899    } 
    866900 
     
    21162150 
    21172151    STD_PHP_INI_BOOLEAN("xcache.cacher",                 "1", PHP_INI_ALL,    OnUpdateBool,        cacher,            zend_xcache_globals, xcache_globals) 
     2152    STD_PHP_INI_BOOLEAN("xcache.stat",                   "1", PHP_INI_ALL,    OnUpdateBool,        stat,              zend_xcache_globals, xcache_globals) 
    21182153#ifdef HAVE_XCACHE_OPTIMIZER 
    21192154    STD_PHP_INI_BOOLEAN("xcache.optimizer",              "0", PHP_INI_ALL,    OnUpdateBool,        optimizer,         zend_xcache_globals, xcache_globals) 
Note: See TracChangeset for help on using the changeset viewer.