Пример #1
0
struct vrt_consumer *
vrt_consumer_new(const char *name, struct vrt_queue *q)
{
    struct vrt_consumer  *c = cork_new(struct vrt_consumer);
    memset(c, 0, sizeof(struct vrt_consumer));
    c->name = cork_strdup(name);
    cork_array_init(&c->dependencies);

    ei_check(vrt_queue_add_consumer(q, c));
    c->cursor.value = starting_value;
    c->last_available_id = starting_value;
    c->current_id = starting_value;
    c->eof_count = 0;
    c->batch_count = 0;
    c->yield_count = 0;
    return c;

error:
    if (c->name != NULL) {
        cork_strfree(c->name);
    }

    cork_array_done(&c->dependencies);
    cork_delete(struct vrt_consumer, c);
    return NULL;
}
Пример #2
0
struct bz_repo *
bz_git_repo_new(const char *url, const char *commit)
{
    struct bz_git_repo  *repo;
    struct bz_env  *repo_env;
    struct cork_path  *base_dir;

    repo = cork_new(struct bz_git_repo);
    cork_buffer_init(&repo->slug);
    repo->url = cork_strdup(url);
    repo->commit = cork_strdup(commit);
    bz_git_make_slug(&repo->slug, url, commit);

    repo_env = bz_repo_env_new_empty();
    bz_env_add_override
    (repo_env, "repo.git.url", bz_string_value_new(url));
    bz_env_add_override
    (repo_env, "repo.git.commit", bz_string_value_new(commit));
    bz_env_add_override
    (repo_env, "repo.name",
     bz_interpolated_value_new("${repo.git.url} (${repo.git.commit})"));
    bz_env_add_override
    (repo_env, "repo.slug", bz_string_value_new(repo->slug.buf));
    bz_env_add_override
    (repo_env, "repo.base_dir",
     bz_interpolated_value_new("${repo_dir}/${repo.slug}"));
    bz_env_add_override
    (repo_env, "package_slug",
     bz_interpolated_value_new("${name}-${repo.slug}"));

    repo->repo = bz_repo_new
                 (repo_env, repo, bz_git__free,
                  bz_git__load,
                  bz_git__update);

    ep_check(base_dir = bz_env_get_path(repo_env, "repo.base_dir", true));
    bz_env_set_base_path(repo_env, cork_path_get(base_dir));
    return repo->repo;

error:
    bz_repo_free(repo->repo);
    return NULL;
}
Пример #3
0
struct vrt_producer *
vrt_producer_new(const char *name, unsigned int batch_size,
                 struct vrt_queue *q)
{
    struct vrt_producer  *p;
    unsigned int  maximum_batch_size;

    p = cork_new(struct vrt_producer);
    memset(p, 0, sizeof(struct vrt_producer));

    p->name = cork_strdup(name);
    ei_check(vrt_queue_add_producer(q, p));

    if (batch_size == 0) {
        batch_size = DEFAULT_BATCH_SIZE;
    }
    maximum_batch_size = vrt_queue_size(q) / 4;
    if (batch_size > maximum_batch_size) {
        batch_size = maximum_batch_size;
    }
    clog_trace("<%s> Batch size is %u", name, batch_size);

    p->last_produced_id = starting_value;
    p->last_claimed_id = starting_value;
    p->batch_size = batch_size;
    p->yield = NULL;
    p->batch_count = 0;
    p->yield_count = 0;
    return p;

error:
    if (p->name != NULL) {
        cork_strfree(p->name);
    }

    cork_delete(struct vrt_producer, p);
    return NULL;
}
Пример #4
0
struct vrt_queue *
vrt_queue_new(const char *name, struct vrt_value_type *value_type,
              unsigned int size)
{
    struct vrt_queue  *q = cork_new(struct vrt_queue);
    memset(q, 0, sizeof(struct vrt_queue));
    q->name = cork_strdup(name);

    unsigned int  value_count;
    if (size == 0) {
        value_count = DEFAULT_QUEUE_SIZE;
    } else {
        if (size < MINIMUM_QUEUE_SIZE) {
            size = MINIMUM_QUEUE_SIZE;
        }
        value_count = min_power_of_2(size);
    }
    q->value_mask = value_count - 1;
    q->last_consumed_id = starting_value;
    q->last_claimed_id.value = q->last_consumed_id;
    q->cursor.value = q->last_consumed_id;
    q->value_type = value_type;

    q->values = cork_calloc(value_count, sizeof(struct vrt_value *));
    clog_debug("[%s] Create queue with %u entries", q->name, value_count);

    cork_pointer_array_init(&q->producers, (cork_free_f) vrt_producer_free);
    cork_pointer_array_init(&q->consumers, (cork_free_f) vrt_consumer_free);

    unsigned int  i;
    for (i = 0; i < value_count; i++) {
        q->values[i] = vrt_value_new(value_type);
        cork_abort_if_null(q->values[i], "Cannot allocate values");
    }

    return q;
}