Example #1
0
cache_item_t *beast_cache_create(cache_key_t *key, int size)
{
    cache_item_t *item, *next;
    int i, msize, bsize;
    int pid = (int)getpid();

    msize = sizeof(*item) + size;
    bsize = sizeof(cache_item_t *) * BUCKETS_DEFAULT_SIZE;

    if ((msize + bsize) > beast_mm_realspace()) {
        beast_write_log(beast_log_error, "Cache item size too big");
        return NULL;
    }

    item = beast_mm_malloc(msize);

    if (!item) {

#if 0
        int index;

        /* clean all caches */

        beast_spinlock(cache_lock, pid);

        for (index = 0; index < BUCKETS_DEFAULT_SIZE; index++) {
            beast_cache_buckets[index] = NULL;
        }

        beast_mm_flush();

        beast_spinunlock(cache_lock, pid);

        item = beast_mm_malloc(msize);
        if (!item) {
            return NULL;
        }
#endif

        beast_write_log(beast_log_notice, "Not enough caches, "
            "please setting <beast.cache_size> bigger in `php.ini' file");
        return NULL;
    }

    item->key.device = key->device;
    item->key.inode = key->inode;
    item->key.fsize = key->fsize;
    item->key.mtime = key->mtime;
    item->next = NULL;

    return item;
}
Example #2
0
cache_item_t *beast_cache_create(cache_key_t *key, int size)
{
    cache_item_t *item, *next;
    int i, msize;

    msize = sizeof(*item) + size;

    if (msize >= beast_mm_realspace()) {
        return NULL;
    }

    item = beast_mm_malloc(msize);
    if (!item)
    {
        beast_locker_lock(beast_cache_locker);
        
        for (i = 0; i < BUCKETS_DEFAULT_SIZE; i++) {
            if (beast_mm_availspace() >= msize) {
                break;
            }
            
            item = beast_cache_buckets[i];
            while (item) {
                next = item->next;
                beast_mm_free(item);
                item = next;
            }
            beast_cache_buckets[i] = NULL;
        }
        
        beast_locker_unlock(beast_cache_locker);
        
        item = beast_mm_malloc(msize);
        if (!item) {
            return NULL;
        }
    }

    item->key.device = key->device;
    item->key.inode = key->inode;
    item->key.fsize = key->fsize;
    item->key.mtime = key->mtime;
    item->next = NULL;

    return item;
}
Example #3
0
cache_item_t *beast_cache_create(cache_key_t *key, int size)
{
    cache_item_t *item, *next;
    int i, msize, bsize;

    msize = sizeof(*item) + size;
    bsize = sizeof(cache_item_t *) * BUCKETS_DEFAULT_SIZE;

    if ((msize + bsize) > beast_mm_realspace()) {
        beast_write_log(beast_log_error, "Cache item size too big");
        return NULL;
    }

    item = beast_mm_malloc(msize);
    if (!item)
    {
        int index;
        
        beast_locker_lock(beast_cache_locker);
        
        for (index = 0; index < BUCKETS_DEFAULT_SIZE; index++) {
            beast_cache_buckets[index] = NULL;
        }

        beast_locker_unlock(beast_cache_locker);

        beast_mm_flush(); /* clean all caches */

        item = beast_mm_malloc(msize);
        if (!item) {
            return NULL;
        }
    }

    item->key.device = key->device;
    item->key.inode = key->inode;
    item->key.fsize = key->fsize;
    item->key.mtime = key->mtime;
    item->next = NULL;

    return item;
}