From 73fcf3a874b2049da31d01b8363d1ac85c9488c2 Mon Sep 17 00:00:00 2001 From: Niels de Vos Date: Mon, 17 Apr 2017 15:50:07 +0530 Subject: core: make the per glusterfs_ctx_t timer-wheel refcounted xlators can use a 'global' timer-wheel for scheduling events. This timer-wheel is managed per glusterfs_ctx_t, but does not need to be allocated for every graph. When an xlator wants to use the timer-wheel, it will be instanciated on demand, and provided to xlators that request it later on. By adding a reference counter to the glusterfs_ctx_t for the timer-wheel, the threads and structures can be cleaned up when the last xlator does not have a need for it anymore. In general, the xlators request the timer-wheel in init(), and they should return it in fini(). Because the timer-wheel is managed per glusterfs_ctx_t, the functions can be added to ctx.c and do not need to live in their very minimal tw.[ch] files. Change-Id: I19d225b39aaa272d9005ba7adc3104c3764f1572 BUG: 1442788 Reported-by: Poornima G Signed-off-by: Niels de Vos Reviewed-on: https://review.gluster.org/17068 NetBSD-regression: NetBSD Build System CentOS-regression: Gluster Build System Smoke: Gluster Build System Reviewed-by: Amar Tumballi Reviewed-by: Zhou Zhengping Reviewed-by: Kaleb KEITHLEY --- libglusterfs/src/ctx.c | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) (limited to 'libglusterfs/src/ctx.c') diff --git a/libglusterfs/src/ctx.c b/libglusterfs/src/ctx.c index d3fb39822d1..1c707eb5dfd 100644 --- a/libglusterfs/src/ctx.c +++ b/libglusterfs/src/ctx.c @@ -9,9 +9,10 @@ */ #include -#include "globals.h" +#include "globals.h" #include "glusterfs.h" +#include "timer-wheel.h" glusterfs_ctx_t * glusterfs_ctx_new () @@ -52,3 +53,39 @@ out: 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); +} -- cgit