Changeset 165 in svn for trunk


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

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

Location:
trunk
Files:
4 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)
  • trunk/xcache.h

    r157 r165  
    1919#include "lock.h"
    2020
    21 #ifndef ZEND_WIN32
    22 /* UnDefine if your filesystem doesn't support inodes */
    23 #   define HAVE_INODE
    24 #endif
     21#define HAVE_INODE
    2522#if !defined(ZEND_ENGINE_2_1) && (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION >= 1 || PHP_MAJOR_VERSION > 5)
    2623#   define ZEND_ENGINE_2_1
  • trunk/xcache.ini

    r162 r165  
    5959; per request settings
    6060xcache.cacher =               On
     61xcache.stat   =               On
    6162xcache.optimizer =           Off
    6263
  • trunk/xcache_globals.h

    r117 r165  
    22ZEND_BEGIN_MODULE_GLOBALS(xcache)
    33    zend_bool cacher;      /* true if enabled */
     4    zend_bool stat;
    45#ifdef HAVE_XCACHE_OPTIMIZER
    56    zend_bool optimizer;   /* true if enabled */
Note: See TracChangeset for help on using the changeset viewer.