예제 #1
0
void fc_pool_close(fc_pool_t *pool)
{
    fc_pool_t *tmp;
    struct fc_large_data_s *l;

    for (l = pool->large; l != NULL; l = l->next) {
        if (l->data == NULL)
            continue;

        fc_log_debug(pool->log, FC_LOG_DEBUG,
                     "free: %p", l->data);
        fc_free(l->data);
    }

    for (; pool != NULL; pool = tmp) {
        tmp = pool->d.next;

        // because pool->log will not be allocated
        // in the pool.
        fc_log_debug(pool->log, FC_LOG_DEBUG,
                     "free pool: %p, unused: %zu", pool,
                     pool->d.end - pool->d.last);
        fc_free(pool);
    }
}
예제 #2
0
void fc_pfree(fc_pool_t *pool, void *ptr)
{
    struct fc_large_data_s *l;

    for (l = pool->large; l != NULL; l = l->next) {
        if (l->data != ptr)
            continue;

        fc_log_debug(pool->log, FC_LOG_DEBUG,
                     "free: %p", l->data);
        fc_free(l->data);
        l->data = NULL;
        return;
    }
}
예제 #3
0
void
event_deinit(struct context *ctx)
{
    int status;

    ASSERT(ctx->ep >= 0);

    fc_free(ctx->event);

    status = close(ctx->ep);
    if (status < 0) {
        log_error("close e %d failed, ignored: %s", ctx->ep, strerror(errno));
    }
    ctx->ep = -1;
}
예제 #4
0
void *fc_pmemalign(fc_pool_t *pool, size_t size, size_t alignment)
{
    void *p;
    struct fc_large_data_s *l;

    p = fc_memalign(alignment, size, pool->log);
    if (p == NULL) {
        return NULL;
    }

    l = fc_palloc(pool, sizeof(struct fc_large_data_s));
    if (l == NULL) {
        fc_free(p);
        return NULL;
    }
    l->data = p;
    l->next = pool->large;
    pool->large = l;

    return p;
}