From 028d82b8a2434cb6d5ad707500f6dea2125ea2fa Mon Sep 17 00:00:00 2001 From: Jeff Darcy Date: Fri, 7 Jul 2017 07:49:45 -0700 Subject: gfapi+libglusterfs: fix mem_pools_fini without mem_pools_init case The change consists of two parts: make sure it doesn't happen (in glfs.c), and make it harmless if it does (in mem-pool.c). Change-Id: Icb7dda7a45dd3d1ade2ee3991bb6a22c8ec88424 BUG: 1468863 Signed-off-by: Jeff Darcy Reviewed-on: https://review.gluster.org/17728 Tested-by: Jeff Darcy CentOS-regression: Gluster Build System Smoke: Gluster Build System Reviewed-by: Jeff Darcy --- libglusterfs/src/mem-pool.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) (limited to 'libglusterfs/src') diff --git a/libglusterfs/src/mem-pool.c b/libglusterfs/src/mem-pool.c index e116437583e..456eb68c060 100644 --- a/libglusterfs/src/mem-pool.c +++ b/libglusterfs/src/mem-pool.c @@ -560,10 +560,24 @@ void mem_pools_fini (void) { pthread_mutex_lock (&init_mutex); - GF_ASSERT (init_count > 0); - if ((--init_count) == 0) { + switch (init_count) { + case 0: + /* + * If init_count is already zero (as e.g. if somebody called + * this before mem_pools_init) then the sweeper was probably + * never even started so we don't need to stop it. Even if + * there's some crazy circumstance where there is a sweeper but + * init_count is still zero, that just means we'll leave it + * running. Not perfect, but far better than any known + * alternative. + */ + break; + case 1: (void) pthread_cancel (sweeper_tid); (void) pthread_join (sweeper_tid, NULL); + /* Fall through. */ + default: + --init_count; } pthread_mutex_unlock (&init_mutex); } -- cgit