diff options
author | Vladislavs Sokurenko <vladislavs.sokurenko@zabbix.com> | 2018-05-28 11:45:32 +0300 |
---|---|---|
committer | Vladislavs Sokurenko <vladislavs.sokurenko@zabbix.com> | 2018-05-28 11:45:32 +0300 |
commit | 3f10c3bf36722b1b7595afcb16732832e1914d77 (patch) | |
tree | 710eb0721074c8d576d07f99ec4eaf0d84ab38b1 | |
parent | d1a7538d1f319843ddcf4f8057b3ddb1dd0d45e3 (diff) |
...G...PS. [DEV-772] wait for all child processes to exit
-rw-r--r-- | include/threads.h | 1 | ||||
-rw-r--r-- | src/libs/zbxsys/threads.c | 29 | ||||
-rw-r--r-- | src/zabbix_agent/zabbix_agentd.c | 29 | ||||
-rw-r--r-- | src/zabbix_proxy/proxy.c | 24 | ||||
-rw-r--r-- | src/zabbix_server/server.c | 25 |
5 files changed, 35 insertions, 73 deletions
diff --git a/include/threads.h b/include/threads.h index 9bc0812b499..4f0e09c7be2 100644 --- a/include/threads.h +++ b/include/threads.h @@ -86,6 +86,7 @@ zbx_thread_args_t; ZBX_THREAD_HANDLE zbx_thread_start(ZBX_THREAD_ENTRY_POINTER(handler), zbx_thread_args_t *thread_args); int zbx_thread_wait(ZBX_THREAD_HANDLE thread); +void zbx_threads_wait(ZBX_THREAD_HANDLE *threads, int threads_num); /* zbx_thread_exit(status) -- declared as define !!! */ long int zbx_get_thread_id(void); diff --git a/src/libs/zbxsys/threads.c b/src/libs/zbxsys/threads.c index a78e179b3be..2c1c0482088 100644 --- a/src/libs/zbxsys/threads.c +++ b/src/libs/zbxsys/threads.c @@ -193,6 +193,35 @@ int zbx_thread_wait(ZBX_THREAD_HANDLE thread) return status; } +void zbx_threads_wait(ZBX_THREAD_HANDLE *threads, int threads_num) +{ + int i; +#if !defined(_WINDOWS) + sigset_t set; + + /* ignore SIGCHLD signals in order for zbx_sleep() to work */ + sigemptyset(&set); + sigaddset(&set, SIGCHLD); + sigprocmask(SIG_BLOCK, &set, NULL); +#else + /* wait for threads to finish first. although listener threads will never end */ + WaitForMultipleObjectsEx(threads_num, threads, TRUE, 1000, FALSE); +#endif + for (i = 0; i < threads_num; i++) + { + if (threads[i]) + zbx_thread_kill(threads[i]); + } + + for (i = 0; i < threads_num; i++) + { + if (threads[i]) + zbx_thread_wait(threads[i]); + + threads[i] = ZBX_THREAD_HANDLE_NULL; + } +} + long int zbx_get_thread_id(void) { #ifdef _WINDOWS diff --git a/src/zabbix_agent/zabbix_agentd.c b/src/zabbix_agent/zabbix_agentd.c index 34d578e6cfe..eec98050e68 100644 --- a/src/zabbix_agent/zabbix_agentd.c +++ b/src/zabbix_agent/zabbix_agentd.c @@ -1108,39 +1108,12 @@ void zbx_free_service_resources(void) { if (NULL != threads) { - int i; -#if !defined(_WINDOWS) - sigset_t set; - - /* ignore SIGCHLD signals in order for zbx_sleep() to work */ - sigemptyset(&set); - sigaddset(&set, SIGCHLD); - sigprocmask(SIG_BLOCK, &set, NULL); -#else - /* wait for threads to finish first. although listener threads will never end */ - WaitForMultipleObjectsEx(threads_num, threads, TRUE, 1000, FALSE); -#endif - for (i = 0; i < threads_num; i++) - { - if (threads[i]) - zbx_thread_kill(threads[i]); - } - - for (i = 0; i < threads_num; i++) - { - if (threads[i]) - zbx_thread_wait(threads[i]); - - threads[i] = ZBX_THREAD_HANDLE_NULL; - } - + zbx_threads_wait(threads, threads_num); /* wait for all child processes to exit */ zbx_free(threads); } - #ifdef ZBX_PTHREAD zbx_locks_disable(); #endif - free_metrics(); alias_list_free(); free_collector_data(); diff --git a/src/zabbix_proxy/proxy.c b/src/zabbix_proxy/proxy.c index 5c2e1300f81..f03e7437f62 100644 --- a/src/zabbix_proxy/proxy.c +++ b/src/zabbix_proxy/proxy.c @@ -1159,33 +1159,13 @@ void zbx_on_exit(void) if (NULL != threads) { - int i; - sigset_t set; - - /* ignore SIGCHLD signals in order for zbx_sleep() to work */ - sigemptyset(&set); - sigaddset(&set, SIGCHLD); - sigprocmask(SIG_BLOCK, &set, NULL); - - for (i = 0; i < threads_num; i++) - { - if (threads[i]) - { - kill(threads[i], SIGTERM); - threads[i] = ZBX_THREAD_HANDLE_NULL; - } - } - + zbx_threads_wait(threads, threads_num); /* wait for all child processes to exit */ zbx_free(threads); } - - free_metrics(); - - zbx_sleep(2); /* wait for all child processes to exit */ #ifdef ZBX_PTHREAD zbx_locks_disable(); #endif - + free_metrics(); #ifdef HAVE_OPENIPMI zbx_ipc_service_free_env(); #endif diff --git a/src/zabbix_server/server.c b/src/zabbix_server/server.c index d3f4e518b49..e44f5b10fd8 100644 --- a/src/zabbix_server/server.c +++ b/src/zabbix_server/server.c @@ -1209,34 +1209,13 @@ void zbx_on_exit(void) if (NULL != threads) { - int i; - sigset_t set; - - /* ignore SIGCHLD signals in order for zbx_sleep() to work */ - sigemptyset(&set); - sigaddset(&set, SIGCHLD); - sigprocmask(SIG_BLOCK, &set, NULL); - - for (i = 0; i < threads_num; i++) - { - if (threads[i]) - { - kill(threads[i], SIGTERM); - threads[i] = ZBX_THREAD_HANDLE_NULL; - } - } - + zbx_threads_wait(threads, threads_num); /* wait for all child processes to exit */ zbx_free(threads); } - - free_metrics(); - - zbx_sleep(2); /* wait for all child processes to exit */ - #ifdef ZBX_PTHREAD zbx_locks_disable(); #endif - + free_metrics(); zbx_ipc_service_free_env(); DBconnect(ZBX_DB_CONNECT_EXIT); |