
From: Chenghai Huang <huangchenghai2@huawei.com> Using count cannot guarantee that the process is initialized only once. Repeated init and uninit will degrade performance. Therefore, use the destructor to uninit. Signed-off-by: Chenghai Huang <huangchenghai2@huawei.com> Signed-off-by: Qi Tao <taoqi10@huawei.com> --- wd_zlibwrapper.c | 41 ++++++++++------------------------------- 1 file changed, 10 insertions(+), 31 deletions(-) diff --git a/wd_zlibwrapper.c b/wd_zlibwrapper.c index 4dc6c193..330daa44 100644 --- a/wd_zlibwrapper.c +++ b/wd_zlibwrapper.c @@ -24,18 +24,13 @@ enum uadk_init_status { WD_ZLIB_INIT, }; -struct wd_zlibwrapper_config { - int count; - int status; -}; - static pthread_mutex_t wd_zlib_mutex = PTHREAD_MUTEX_INITIALIZER; -static struct wd_zlibwrapper_config zlib_config = {0}; +static int zlib_status; static void wd_zlib_unlock(void) { + zlib_status = WD_ZLIB_UNINIT; pthread_mutex_unlock(&wd_zlib_mutex); - zlib_config.status = WD_ZLIB_UNINIT; } static int wd_zlib_uadk_init(void) @@ -44,7 +39,7 @@ static int wd_zlib_uadk_init(void) struct wd_ctx_nums *ctx_set_num; int ret, i; - if (zlib_config.status == WD_ZLIB_INIT) + if (zlib_status == WD_ZLIB_INIT) return 0; ctx_set_num = calloc(WD_DIR_MAX, sizeof(*ctx_set_num)); @@ -63,7 +58,7 @@ static int wd_zlib_uadk_init(void) if (ret && ret != -WD_EEXIST) ret = Z_STREAM_ERROR; - zlib_config.status = WD_ZLIB_INIT; + zlib_status = WD_ZLIB_INIT; free(ctx_set_num); @@ -73,7 +68,7 @@ static int wd_zlib_uadk_init(void) static void wd_zlib_uadk_uninit(void) { wd_comp_uninit2(); - zlib_config.status = WD_ZLIB_UNINIT; + zlib_status = WD_ZLIB_UNINIT; } static int wd_zlib_analy_alg(int windowbits, int *alg, int *windowsize) @@ -158,16 +153,6 @@ static int wd_zlib_init(z_streamp strm, int level, int windowbits, enum wd_comp_ strm->total_out = 0; ret = wd_zlib_alloc_sess(strm, level, windowbits, type); - if (unlikely(ret < 0)) - goto out_uninit; - - __atomic_add_fetch(&zlib_config.count, 1, __ATOMIC_RELAXED); - pthread_mutex_unlock(&wd_zlib_mutex); - - return Z_OK; - -out_uninit: - wd_zlib_uadk_uninit(); out_unlock: pthread_mutex_unlock(&wd_zlib_mutex); @@ -184,17 +169,6 @@ static int wd_zlib_uninit(z_streamp strm) wd_zlib_free_sess(strm); - pthread_mutex_lock(&wd_zlib_mutex); - - ret = __atomic_sub_fetch(&zlib_config.count, 1, __ATOMIC_RELAXED); - if (ret != 0) - goto out_unlock; - - wd_zlib_uadk_uninit(); - -out_unlock: - pthread_mutex_unlock(&wd_zlib_mutex); - return Z_OK; } @@ -307,3 +281,8 @@ int wd_inflate_end(z_streamp strm) { return wd_zlib_uninit(strm); } + +__attribute__ ((destructor)) static void wd_zlibwrapper_destory(void) +{ + wd_zlib_uadk_uninit(); +} -- 2.33.0