From fa61207e4cb183c1e02f08cea6506621a95ea087 Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Fri, 12 Mar 2010 23:09:15 +0000 Subject: [PATCH] fix segfault in the cpu monitor code git-svn-id: http://svn.openzap.org/svn/openzap/trunk@1063 a93c3328-9c30-0410-af19-c9cd2b2d52af --- libs/openzap/src/zap_io.c | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/libs/openzap/src/zap_io.c b/libs/openzap/src/zap_io.c index ea6d987b7a..858635f128 100644 --- a/libs/openzap/src/zap_io.c +++ b/libs/openzap/src/zap_io.c @@ -129,8 +129,8 @@ ZAP_STR2ENUM(zap_str2zap_mdmf_type, zap_mdmf_type2str, zap_mdmf_type_t, MDMF_TYP ZAP_ENUM_NAMES(CHAN_TYPE_NAMES, CHAN_TYPE_STRINGS) ZAP_STR2ENUM(zap_str2zap_chan_type, zap_chan_type2str, zap_chan_type_t, CHAN_TYPE_NAMES, ZAP_CHAN_TYPE_COUNT) -static zap_status_t zap_cpu_monitor_start(cpu_monitor_t* monitor_params); -static void zap_cpu_monitor_stop(cpu_monitor_t* monitor_params); +static zap_status_t zap_cpu_monitor_start(void); +static void zap_cpu_monitor_stop(void); static const char *cut_path(const char *in) { @@ -3059,7 +3059,7 @@ OZ_DECLARE(zap_status_t) zap_global_init(void) globals.running = 1; if (!zap_cpu_monitor_disabled) { - if (zap_cpu_monitor_start(&globals.cpu_monitor) != ZAP_SUCCESS) { + if (zap_cpu_monitor_start() != ZAP_SUCCESS) { return ZAP_FAIL; } } @@ -3080,7 +3080,7 @@ OZ_DECLARE(zap_status_t) zap_global_destroy(void) time_end(); globals.running = 0; - zap_cpu_monitor_stop(&globals.cpu_monitor); + zap_cpu_monitor_stop(); zap_span_close_all(); zap_sleep(1000); @@ -3134,7 +3134,6 @@ OZ_DECLARE(zap_status_t) zap_global_destroy(void) zap_mutex_unlock(globals.mutex); zap_mutex_destroy(&globals.mutex); zap_mutex_destroy(&globals.span_mutex); - zap_interrupt_destroy(&globals.cpu_monitor.interrupt); memset(&globals, 0, sizeof(globals)); return ZAP_SUCCESS; } @@ -3463,26 +3462,40 @@ static void *zap_cpu_monitor_run(zap_thread_t *me, void *obj) } -static zap_status_t zap_cpu_monitor_start(cpu_monitor_t* monitor) +static zap_status_t zap_cpu_monitor_start(void) { - if (zap_interrupt_create(&monitor->interrupt, ZAP_INVALID_SOCKET) != ZAP_SUCCESS) { + if (zap_interrupt_create(&globals.cpu_monitor.interrupt, ZAP_INVALID_SOCKET) != ZAP_SUCCESS) { zap_log(ZAP_LOG_CRIT, "Failed to create CPU monitor interrupt\n"); return ZAP_FAIL; } - if (zap_thread_create_detached(zap_cpu_monitor_run, monitor) != ZAP_SUCCESS) { + if (zap_thread_create_detached(zap_cpu_monitor_run, &globals.cpu_monitor) != ZAP_SUCCESS) { zap_log(ZAP_LOG_CRIT, "Failed to create cpu monitor thread!!\n"); return ZAP_FAIL; } return ZAP_SUCCESS; } -static void zap_cpu_monitor_stop(cpu_monitor_t* monitor) +static void zap_cpu_monitor_stop(void) { - zap_interrupt_signal(monitor->interrupt); - while(monitor->running) { + if (!globals.cpu_monitor.interrupt) { + return; + } + + if (!globals.cpu_monitor.running) { + return; + } + + if (zap_interrupt_signal(globals.cpu_monitor.interrupt) != ZAP_SUCCESS) { + zap_log(ZAP_LOG_CRIT, "Failed to stop CPU monitor\n"); + return; + } + + while(globals.cpu_monitor.running) { zap_sleep(10); } + + zap_interrupt_destroy(&globals.cpu_monitor.interrupt); } OZ_DECLARE(void) zap_cpu_monitor_disable(void)