Changeset 623 in svn for branches/1.3/xcache.c


Ignore:
Timestamp:
2009-07-05T10:41:16+02:00 (6 years ago)
Author:
Xuefer
Message:

merged r514-r539 from trunk

Location:
branches/1.3
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/1.3

  • branches/1.3/xcache.c

    r622 r623  
    8787
    8888static zend_bool xc_initized = 0;
     89static time_t xc_init_time = 0;
     90static long unsigned xc_init_instance_id = 0;
     91#ifdef ZTS
     92static long unsigned xc_init_instance_subid = 0;
     93#endif
    8994static zend_compile_file_t *origin_compile_file = NULL;
    9095static zend_compile_file_t *old_compile_file = NULL;
     
    247252/* }}} */
    248253#endif
     254static inline zend_uint advance_wrapped(zend_uint val, zend_uint count) /* {{{ */
     255{
     256    if (val + 1 >= count) {
     257        return 0;
     258    }
     259    return val + 1;
     260}
     261/* }}} */
     262static void xc_counters_inc(time_t *curtime, zend_uint *curslot, time_t period, zend_ulong *counters, zend_uint count TSRMLS_DC) /* {{{ */
     263{
     264    time_t n = XG(request_time) / period;
     265    if (*curtime != n) {
     266        zend_uint target_slot = n % count;
     267        if (n - *curtime > period) {
     268            memset(counters, 0, sizeof(counters[0]) * count);
     269        }
     270        else {
     271            zend_uint slot;
     272            for (slot = advance_wrapped(*curslot, count);
     273                    slot != target_slot;
     274                    slot = advance_wrapped(slot, count)) {
     275                counters[slot] = 0;
     276            }
     277            counters[target_slot] = 0;
     278        }
     279        *curtime = n;
     280        *curslot = target_slot;
     281    }
     282    counters[*curslot] ++;
     283}
     284/* }}} */
     285static void xc_cache_hit_dmz(xc_cache_t *cache TSRMLS_DC) /* {{{ */
     286{
     287    cache->hits ++;
     288
     289    xc_counters_inc(&cache->hits_by_hour_cur_time
     290            , &cache->hits_by_hour_cur_slot, 60 * 60
     291            , cache->hits_by_hour
     292            , sizeof(cache->hits_by_hour) / sizeof(cache->hits_by_hour[0])
     293            TSRMLS_CC);
     294
     295    xc_counters_inc(&cache->hits_by_second_cur_time
     296            , &cache->hits_by_second_cur_slot
     297            , 1
     298            , cache->hits_by_second
     299            , sizeof(cache->hits_by_second) / sizeof(cache->hits_by_second[0])
     300            TSRMLS_CC);
     301}
     302/* }}} */
    249303
    250304/* helper function that loop through each entry */
     
    311365    int i, c;
    312366
    313     if (!xc_php_ttl || !xc_php_gc_interval) {
     367    if (!xc_php_ttl || !xc_php_gc_interval || !xc_php_caches) {
    314368        return;
    315369    }
     
    324378    int i, c;
    325379
    326     if (!xc_var_gc_interval) {
     380    if (!xc_var_gc_interval || !xc_var_caches) {
    327381        return;
    328382    }
     
    372426    int i, c;
    373427
    374     for (i = 0, c = xc_php_hcache.size; i < c; i ++) {
    375         xc_gc_deletes_one(xc_php_caches[i] TSRMLS_CC);
    376     }
    377 
    378     for (i = 0, c = xc_var_hcache.size; i < c; i ++) {
    379         xc_gc_deletes_one(xc_var_caches[i] TSRMLS_CC);
     428    if (xc_php_caches) {
     429        for (i = 0, c = xc_php_hcache.size; i < c; i ++) {
     430            xc_gc_deletes_one(xc_php_caches[i] TSRMLS_CC);
     431        }
     432    }
     433
     434    if (xc_var_caches) {
     435        for (i = 0, c = xc_var_hcache.size; i < c; i ++) {
     436            xc_gc_deletes_one(xc_var_caches[i] TSRMLS_CC);
     437        }
    380438    }
    381439}
     
    385443static void xc_fillinfo_dmz(int cachetype, xc_cache_t *cache, zval *return_value TSRMLS_DC) /* {{{ */
    386444{
    387     zval *blocks;
     445    zval *blocks, *hits;
     446    int i;
    388447    const xc_block_t *b;
    389448#ifndef NDEBUG
     
    417476        add_assoc_null_ex(return_value, ZEND_STRS("gc"));
    418477    }
     478    MAKE_STD_ZVAL(hits);
     479    array_init(hits);
     480    for (i = 0; i < sizeof(cache->hits_by_hour) / sizeof(cache->hits_by_hour[0]); i ++) {
     481        add_next_index_long(hits, (long) cache->hits_by_hour[i]);
     482    }
     483    add_assoc_zval_ex(return_value, ZEND_STRS("hits_by_hour"), hits);
     484
     485    MAKE_STD_ZVAL(hits);
     486    array_init(hits);
     487    for (i = 0; i < sizeof(cache->hits_by_second) / sizeof(cache->hits_by_second[0]); i ++) {
     488        add_next_index_long(hits, (long) cache->hits_by_second[i]);
     489    }
     490    add_assoc_zval_ex(return_value, ZEND_STRS("hits_by_second"), hits);
    419491
    420492    MAKE_STD_ZVAL(blocks);
     
    640712static void xc_entry_unholds(TSRMLS_D) /* {{{ */
    641713{
    642     xc_entry_unholds_real(XG(php_holds), xc_php_caches, xc_php_hcache.size TSRMLS_CC);
    643     xc_entry_unholds_real(XG(var_holds), xc_var_caches, xc_var_hcache.size TSRMLS_CC);
     714    if (xc_php_caches) {
     715        xc_entry_unholds_real(XG(php_holds), xc_php_caches, xc_php_hcache.size TSRMLS_CC);
     716    }
     717
     718    if (xc_var_caches) {
     719        xc_entry_unholds_real(XG(var_holds), xc_var_caches, xc_var_hcache.size TSRMLS_CC);
     720    }
    644721}
    645722/* }}} */
     
    914991            TRACE("found %s, catch it", stored_xce->name.str.val);
    915992            xc_entry_hold_php_dmz(stored_xce TSRMLS_CC);
    916             cache->hits ++;
     993            xc_cache_hit_dmz(cache);
    917994            break;
    918995        }
     
    12221299    xc_shm_t *shm;
    12231300    int i;
    1224     if (!xc_initized) {
    1225         return 0;
    1226     }
    1227     for (i = 0; i < xc_php_hcache.size; i ++) {
    1228         shm = xc_php_caches[i]->shm;
    1229         if (shm->handlers->is_readwrite(shm, p)) {
    1230             return 1;
    1231         }
    1232     }
    1233     for (i = 0; i < xc_var_hcache.size; i ++) {
    1234         shm = xc_var_caches[i]->shm;
    1235         if (shm->handlers->is_readwrite(shm, p)) {
    1236             return 1;
     1301
     1302    if (xc_php_caches) {
     1303        for (i = 0; i < xc_php_hcache.size; i ++) {
     1304            shm = xc_php_caches[i]->shm;
     1305            if (shm->handlers->is_readwrite(shm, p)) {
     1306                return 1;
     1307            }
     1308        }
     1309    }
     1310
     1311    if (xc_var_caches) {
     1312        for (i = 0; i < xc_var_hcache.size; i ++) {
     1313            shm = xc_var_caches[i]->shm;
     1314            if (shm->handlers->is_readwrite(shm, p)) {
     1315                return 1;
     1316            }
    12371317        }
    12381318    }
     
    12441324    xc_shm_t *shm;
    12451325    int i;
    1246     if (!xc_initized) {
    1247         return 0;
    1248     }
    1249     for (i = 0; i < xc_php_hcache.size; i ++) {
    1250         shm = xc_php_caches[i]->shm;
    1251         if (shm->handlers->is_readonly(shm, p)) {
    1252             return 1;
    1253         }
    1254     }
    1255     for (i = 0; i < xc_var_hcache.size; i ++) {
    1256         shm = xc_var_caches[i]->shm;
    1257         if (shm->handlers->is_readonly(shm, p)) {
    1258             return 1;
     1326
     1327    if (xc_php_caches) {
     1328        for (i = 0; i < xc_php_hcache.size; i ++) {
     1329            shm = xc_php_caches[i]->shm;
     1330            if (shm->handlers->is_readonly(shm, p)) {
     1331                return 1;
     1332            }
     1333        }
     1334    }
     1335
     1336    if (xc_var_caches) {
     1337        for (i = 0; i < xc_var_hcache.size; i ++) {
     1338            shm = xc_var_caches[i]->shm;
     1339            if (shm->handlers->is_readonly(shm, p)) {
     1340                return 1;
     1341            }
    12591342        }
    12601343    }
     
    15151598        XG(internal_table_copied) = 1;
    15161599    }
    1517     if (xc_php_hcache.size && !XG(php_holds)) {
     1600    if (xc_php_caches && !XG(php_holds)) {
    15181601        XG(php_holds) = calloc(xc_php_hcache.size, sizeof(xc_stack_t));
    15191602        for (i = 0; i < xc_php_hcache.size; i ++) {
     
    15221605    }
    15231606
    1524     if (xc_initized && xc_var_hcache.size && !XG(var_holds)) {
     1607    if (xc_var_caches && !XG(var_holds)) {
    15251608        XG(var_holds) = calloc(xc_var_hcache.size, sizeof(xc_stack_t));
    15261609        for (i = 0; i < xc_var_hcache.size; i ++) {
     
    16751758    }
    16761759
    1677 #define STR "WWW-authenticate: Basic Realm=\"XCache Administration\""
     1760#define STR "HTTP/1.0 401 Unauthorized"
    16781761    sapi_add_header_ex(STR, sizeof(STR) - 1, 1, 1 TSRMLS_CC);
    16791762#undef STR
    1680 #define STR "HTTP/1.0 401 Unauthorized"
     1763#define STR "WWW-authenticate: Basic Realm=\"XCache Administration\""
    16811764    sapi_add_header_ex(STR, sizeof(STR) - 1, 1, 1 TSRMLS_CC);
    16821765#undef STR
     
    18841967    } LEAVE_LOCK(xce.cache);
    18851968    if (found) {
    1886         xce.cache->hits ++;
     1969        xc_cache_hit_dmz(xce.cache TSRMLS_CC);
    18871970    }
    18881971    else {
     
    19652048    } LEAVE_LOCK(xce.cache);
    19662049    if (found) {
    1967         xce.cache->hits ++;
     2050        xc_cache_hit_dmz(xce.cache TSRMLS_CC);
    19682051    }
    19692052    else {
     
    20982181}
    20992182/* }}} */
     2183#ifdef HAVE_XCACHE_DPRINT
     2184/* {{{ proto bool  xcache_dprint(mixed value)
     2185   Prints variable (or value) internal struct (debug only) */
     2186PHP_FUNCTION(xcache_dprint)
     2187{
     2188    zval *value;
     2189
     2190    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &value) == FAILURE) {
     2191        return;
     2192    }
     2193    xc_dprint_zval(value, 0 TSRMLS_CC);
     2194}
     2195/* }}} */
     2196#endif
    21002197/* {{{ proto string xcache_asm(string filename)
    21012198 */
     
    23232420    PHP_FE(xcache_isset,             NULL)
    23242421    PHP_FE(xcache_unset,             NULL)
     2422#ifdef HAVE_XCACHE_DPRINT
     2423    PHP_FE(xcache_dprint,            NULL)
     2424#endif
    23252425    {NULL, NULL,                     NULL}
    23262426};
     
    24602560    php_info_print_table_row(2, "Modules Built", XCACHE_MODULES);
    24612561    php_info_print_table_row(2, "Readonly Protection", xc_readonly_protection ? "enabled" : "N/A");
     2562    ptr = php_format_date("Y-m-d H:i:s", sizeof("Y-m-d H:i:s") - 1, xc_init_time, 1 TSRMLS_CC);
     2563    php_info_print_table_row(2, "Cache Init Time", ptr);
     2564    efree(ptr);
     2565
     2566#ifdef ZTS
     2567    snprintf(buf, sizeof(buf), "%lu.%lu", xc_init_instance_id, xc_init_instance_subid);
     2568#else
     2569    snprintf(buf, sizeof(buf), "%lu", xc_init_instance_id);
     2570#endif
     2571    php_info_print_table_row(2, "Cache Instance Id", buf);
    24622572
    24632573    if (xc_php_size) {
     
    26942804        }
    26952805        xc_initized = 1;
     2806        xc_init_time = time(NULL);
     2807        xc_init_instance_id = getpid();
     2808#ifdef ZTS
     2809        xc_init_instance_subid = tsrm_thread_id();
     2810#endif
    26962811    }
    26972812
Note: See TracChangeset for help on using the changeset viewer.