Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/zabbix/zabbix.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVladislavs Sokurenko <vladislavs.sokurenko@zabbix.com>2018-05-28 11:45:32 +0300
committerVladislavs Sokurenko <vladislavs.sokurenko@zabbix.com>2018-05-28 11:45:32 +0300
commit3f10c3bf36722b1b7595afcb16732832e1914d77 (patch)
tree710eb0721074c8d576d07f99ec4eaf0d84ab38b1
parentd1a7538d1f319843ddcf4f8057b3ddb1dd0d45e3 (diff)
...G...PS. [DEV-772] wait for all child processes to exit
-rw-r--r--include/threads.h1
-rw-r--r--src/libs/zbxsys/threads.c29
-rw-r--r--src/zabbix_agent/zabbix_agentd.c29
-rw-r--r--src/zabbix_proxy/proxy.c24
-rw-r--r--src/zabbix_server/server.c25
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);