diff options
Diffstat (limited to 'libglusterfs/src/ctx.c')
| -rw-r--r-- | libglusterfs/src/ctx.c | 99 |
1 files changed, 73 insertions, 26 deletions
diff --git a/libglusterfs/src/ctx.c b/libglusterfs/src/ctx.c index b009e6270a2..3d890b04ec9 100644 --- a/libglusterfs/src/ctx.c +++ b/libglusterfs/src/ctx.c @@ -9,42 +9,89 @@ */ #include <pthread.h> -#include "globals.h" -#include "glusterfs.h" +#include "glusterfs/globals.h" +#include "glusterfs/glusterfs.h" +#include "timer-wheel.h" glusterfs_ctx_t * -glusterfs_ctx_new () +glusterfs_ctx_new() { - int ret = 0; - glusterfs_ctx_t *ctx = NULL; - - /* no GF_CALLOC here, gf_acct_mem_set_enable is not - yet decided at this point */ - ctx = calloc (1, sizeof (*ctx)); - if (!ctx) { - ret = -1; - goto out; - } + glusterfs_ctx_t *ctx = NULL; + + /* no GF_CALLOC here, gf_acct_mem_set_enable is not + yet decided at this point */ + ctx = CALLOC(1, sizeof(*ctx)); + if (!ctx) { + goto out; + } - ctx->mem_acct_enable = gf_global_mem_acct_enable_get(); + ctx->mem_acct_enable = gf_global_mem_acct_enable_get(); - INIT_LIST_HEAD (&ctx->graphs); - INIT_LIST_HEAD (&ctx->mempool_list); + INIT_LIST_HEAD(&ctx->graphs); + INIT_LIST_HEAD(&ctx->mempool_list); + INIT_LIST_HEAD(&ctx->volfile_list); - ctx->daemon_pipe[0] = -1; - ctx->daemon_pipe[1] = -1; + ctx->daemon_pipe[0] = -1; + ctx->daemon_pipe[1] = -1; - ctx->log.loglevel = DEFAULT_LOG_LEVEL; + ctx->log.loglevel = DEFAULT_LOG_LEVEL; - /* lock is never destroyed! */ - ret = LOCK_INIT (&ctx->lock); - if (ret) { - free (ctx); - ctx = NULL; - } +#if defined(RUN_WITH_MEMCHECK) + ctx->cmd_args.vgtool = _gf_memcheck; +#elif defined(RUN_WITH_DRD) + ctx->cmd_args.vgtool = _gf_drd; +#else + ctx->cmd_args.vgtool = _gf_none; +#endif + /* lock is never destroyed! */ + if (LOCK_INIT(&ctx->lock)) { + free(ctx); + ctx = NULL; + goto out; + } + + GF_ATOMIC_INIT(ctx->stats.max_dict_pairs, 0); + GF_ATOMIC_INIT(ctx->stats.total_pairs_used, 0); + GF_ATOMIC_INIT(ctx->stats.total_dicts_used, 0); out: - return ctx; + return ctx; +} + +static void +glusterfs_ctx_tw_destroy(struct gf_ctx_tw *ctx_tw) +{ + if (ctx_tw->timer_wheel) + gf_tw_cleanup_timers(ctx_tw->timer_wheel); + + GF_FREE(ctx_tw); } +struct tvec_base * +glusterfs_ctx_tw_get(glusterfs_ctx_t *ctx) +{ + struct gf_ctx_tw *ctx_tw = NULL; + + LOCK(&ctx->lock); + { + if (ctx->tw) { + ctx_tw = GF_REF_GET(ctx->tw); + } else { + ctx_tw = GF_CALLOC(1, sizeof(struct gf_ctx_tw), + gf_common_mt_tw_ctx); + ctx_tw->timer_wheel = gf_tw_init_timers(); + GF_REF_INIT(ctx_tw, glusterfs_ctx_tw_destroy); + ctx->tw = ctx_tw; + } + } + UNLOCK(&ctx->lock); + + return ctx_tw->timer_wheel; +} + +void +glusterfs_ctx_tw_put(glusterfs_ctx_t *ctx) +{ + GF_REF_PUT(ctx->tw); +} |
