示例#1
0
void gop_dummy_init()
{
    //** Make the variables
    assert_result(apr_pool_create(&gd_pool, NULL), APR_SUCCESS);
    assert_result(apr_thread_mutex_create(&gd_lock, APR_THREAD_MUTEX_DEFAULT, gd_pool), APR_SUCCESS);
    assert_result(apr_thread_cond_create(&gd_cond, gd_pool), APR_SUCCESS);
    gd_stack = new_stack();

    //** and launch the thread
    thread_create_assert(&gd_thread, NULL, gd_thread_func, NULL, gd_pool);
}
示例#2
0
cache_t *lru_cache_create(void *arg, data_attr_t *da, int timeout)
{
    cache_t *cache;
    cache_lru_t *c;

    type_malloc_clear(cache, cache_t, 1);
    type_malloc_clear(c, cache_lru_t, 1);
    cache->fn.priv = c;

    cache_base_create(cache, da, timeout);

    cache->shutdown_request = 0;
    c->stack = new_stack();
    c->waiting_stack = new_stack();
    c->pending_free_tasks = new_stack();
    c->max_bytes = 100*1024*1024;
    c->bytes_used = 0;
    c->dirty_fraction = 0.1;
    cache->n_ppages = 0;
    cache->max_fetch_fraction = 0.1;
    cache->max_fetch_size = cache->max_fetch_fraction * c->max_bytes;
    cache->write_temp_overflow_used = 0;
    cache->write_temp_overflow_fraction = 0.01;
    cache->write_temp_overflow_size = cache->write_temp_overflow_fraction * c->max_bytes;

    c->dirty_bytes_trigger = c->dirty_fraction * c->max_bytes;
    c->dirty_max_wait = apr_time_make(1, 0);
    c->flush_in_progress = 0;
    c->limbo_pages = 0;
    c->free_pending_tables = new_pigeon_coop("free_pending_tables", 50, sizeof(list_t *), cache->mpool, free_pending_table_new, free_pending_table_free);
    c->free_page_tables = new_pigeon_coop("free_page_tables", 50, sizeof(page_table_t), cache->mpool, free_page_tables_new, free_page_tables_free);

    cache->fn.create_empty_page = lru_create_empty_page;
    cache->fn.adjust_dirty = lru_adjust_dirty;
    cache->fn.destroy_pages = lru_pages_destroy;
    cache->fn.cache_update = lru_update;
    cache->fn.cache_miss_tag = lru_miss_tag;
    cache->fn.s_page_access = lru_page_access;
    cache->fn.s_pages_release = lru_pages_release;
    cache->fn.destroy = lru_cache_destroy;
    cache->fn.adding_segment = lru_adding_segment;
    cache->fn.removing_segment = lru_removing_segment;
    cache->fn.get_handle = cache_base_handle;

    apr_thread_cond_create(&(c->dirty_trigger), cache->mpool);
    thread_create_assert(&(c->dirty_thread), NULL, lru_dirty_thread, (void *)cache, cache->mpool);

    return(cache);
}
示例#3
0
data_service_fn_t *ds_ibp_create(void *arg, inip_file_t *ifd, char *section)
{
    int cs_type;
    data_service_fn_t *dsf;
    ds_ibp_priv_t *ds;
    ibp_context_t *ic;

    type_malloc_clear(dsf, data_service_fn_t, 1);
    type_malloc_clear(ds, ds_ibp_priv_t , 1);

    //** Set the default attributes
    memset(&(ds->attr_default), 0, sizeof(ds_ibp_attr_t));
    ds->attr_default.attr.duration = inip_get_integer(ifd, section, "duration", 3600);

    ds->warm_duration = ds->attr_default.attr.duration;
    ds->warm_interval = 0.33 * ds->warm_duration;
    ds->warm_interval = inip_get_integer(ifd, section, "warm_interval", ds->warm_interval);
    ds->warm_duration = inip_get_integer(ifd, section, "warm_duration", ds->warm_duration);

    cs_type = inip_get_integer(ifd, section, "chksum_type", CHKSUM_DEFAULT);
    if ( ! ((chksum_valid_type(cs_type) == 0) || (cs_type == CHKSUM_DEFAULT) || (cs_type == CHKSUM_NONE)))  {
        log_printf(0, "Invalid chksum type=%d resetting to CHKSUM_DEFAULT(%d)\n", cs_type, CHKSUM_DEFAULT);
        cs_type = CHKSUM_DEFAULT;
    }
    ds->attr_default.disk_cs_type = cs_type;

    ds->attr_default.disk_cs_blocksize = inip_get_integer(ifd, section, "chksum_blocksize", 64*1024);
    if (ds->attr_default.disk_cs_blocksize <= 0) {
        log_printf(0, "Invalid chksum blocksize=" XOT " resetting to %d\n", ds->attr_default.disk_cs_blocksize, 64*1024);
        ds->attr_default.disk_cs_blocksize = 64 *1024;
    }
    ds->attr_default.attr.reliability = IBP_HARD;
    ds->attr_default.attr.type = IBP_BYTEARRAY;


    //printf("cfg=%s sec=%s\n", config_file, section);
    ic = ibp_create_context();
    ibp_load_config(ic, ifd, section);
    ds->ic = ic;
    dsf->type = DS_TYPE_IBP;

    dsf->priv = (void *)ds;
    dsf->destroy_service = ds_ibp_destroy;
    dsf->new_cap_set = ds_ibp_new_cap_set;
    dsf->cap_auto_warm = ds_ibp_cap_auto_warm;
    dsf->cap_stop_warm = ds_ibp_cap_stop_warm;
    dsf->get_cap = ds_ibp_get_cap;
    dsf->set_cap = ds_ibp_set_cap;
    dsf->translate_cap_set = ds_ibp_translate_cap_set;
    dsf->destroy_cap_set = ds_ibp_destroy_cap_set;
    dsf->new_probe = ds_ibp_new_probe;
    dsf->destroy_probe = ds_ibp_destroy_probe;
    dsf->get_probe = ds_ibp_get_probe;
    dsf->new_attr = ds_ibp_new_attr;
    dsf->destroy_attr = ds_ibp_destroy_attr;
    dsf->set_attr = ds_ibp_set_attr;
    dsf->get_attr = ds_ibp_get_attr;
    dsf->set_default_attr = ds_ibp_set_default_attr;
    dsf->get_default_attr = ds_ibp_get_default_attr;
    dsf->res2rid = ds_ibp_res2rid;
    dsf->new_inquire = ds_ibp_new_inquire;
    dsf->destroy_inquire = ds_ibp_destroy_inquire;
    dsf->res_inquire_get = ds_ibp_res_inquire_get;
    dsf->res_inquire = ds_ibp_res_inquire;
    dsf->allocate = ds_ibp_allocate;
    dsf->remove = ds_ibp_remove;
    dsf->modify_count = ds_ibp_modify_count;
    dsf->read = ds_ibp_read;
    dsf->write = ds_ibp_write;
    dsf->readv = ds_ibp_readv;
    dsf->writev = ds_ibp_writev;
    dsf->append = ds_ibp_append;
    dsf->copy = ds_ibp_copy;
    dsf->probe = ds_ibp_probe;
    dsf->truncate = ds_ibp_truncate;

    //** Launch the warmer
    { int result = apr_pool_create(&(ds->pool), NULL); assert(result == APR_SUCCESS); }
    apr_thread_mutex_create(&(ds->lock), APR_THREAD_MUTEX_DEFAULT, ds->pool);
    apr_thread_cond_create(&(ds->cond), ds->pool);
    ds->warm_table = apr_hash_make(ds->pool);
    thread_create_assert(&(ds->thread), NULL, ds_ibp_warm_thread, (void *)dsf, ds->pool);

    return(dsf);
}