diff options
-rw-r--r-- | include/threads.h | 7 | ||||
-rw-r--r-- | src/libs/zbxsys/threads.c | 35 | ||||
-rw-r--r-- | src/zabbix_proxy/proxy.c | 4 | ||||
-rw-r--r-- | src/zabbix_server/server.c | 4 |
4 files changed, 32 insertions, 18 deletions
diff --git a/include/threads.h b/include/threads.h index 00edd79ac7b..a926cd8c9d3 100644 --- a/include/threads.h +++ b/include/threads.h @@ -31,8 +31,6 @@ #define ZBX_THREAD_HANDLE HANDLE #define ZBX_THREAD_HANDLE_NULL NULL - #define ZBX_THREAD_WAIT_EXIT 1 - #define ZBX_THREAD_ENTRY_POINTER(pointer_name) \ unsigned (__stdcall *pointer_name)(void *) @@ -57,7 +55,10 @@ #define ZBX_THREAD_HANDLE pid_t #define ZBX_THREAD_HANDLE_NULL 0 - #define ZBX_THREAD_WAIT_EXIT 1 + #define ZBX_THREAD_PRIORITY_NONE 0 + #define ZBX_THREAD_PRIORITY_FIRST 1 + #define ZBX_THREAD_PRIORITY_SECOND 2 + #define ZBX_THREAD_PRIORITY_COUNT 3 #define ZBX_THREAD_ENTRY_POINTER(pointer_name) \ unsigned (* pointer_name)(void *) diff --git a/src/libs/zbxsys/threads.c b/src/libs/zbxsys/threads.c index f9e59941a53..81fdd59345c 100644 --- a/src/libs/zbxsys/threads.c +++ b/src/libs/zbxsys/threads.c @@ -221,7 +221,8 @@ int zbx_thread_wait(ZBX_THREAD_HANDLE thread) * threads to exit immediately on FAIL * * * ******************************************************************************/ -static void threads_kill(ZBX_THREAD_HANDLE *threads, int threads_num, int ret) +static void threads_kill(ZBX_THREAD_HANDLE *threads, int threads_num, const int *threads_flags, int priority, + int ret) { int i; @@ -231,9 +232,15 @@ static void threads_kill(ZBX_THREAD_HANDLE *threads, int threads_num, int ret) continue; if (SUCCEED != ret) + { zbx_thread_kill_fatal(threads[i]); - else - zbx_thread_kill(threads[i]); + continue; + } + + if (priority != threads_flags[i]) + continue; + + zbx_thread_kill(threads[i]); } } @@ -252,27 +259,33 @@ void zbx_threads_wait(ZBX_THREAD_HANDLE *threads, const int *threads_flags, int int i; #if !defined(_WINDOWS) && !defined(__MINGW32__) sigset_t set; + int j; /* ignore SIGCHLD signals in order for zbx_sleep() to work */ sigemptyset(&set); sigaddset(&set, SIGCHLD); sigprocmask(SIG_BLOCK, &set, NULL); - /* signal all threads to go into idle state and wait for flagged threads to exit */ - threads_kill(threads, threads_num, ret); + /* signal all threads to go into idle state and wait for threads with higher priority to exit */ + threads_kill(threads, threads_num, threads_flags, ZBX_THREAD_PRIORITY_NONE, ret); - for (i = 0; i < threads_num; i++) + for (j = ZBX_THREAD_PRIORITY_FIRST; j < ZBX_THREAD_PRIORITY_COUNT; j++) { - if (!threads[i] || ZBX_THREAD_WAIT_EXIT != threads_flags[i]) - continue; + threads_kill(threads, threads_num, threads_flags, j, ret); - zbx_thread_wait(threads[i]); + for (i = 0; i < threads_num; i++) + { + if (!threads[i] || j != threads_flags[i]) + continue; - threads[i] = ZBX_THREAD_HANDLE_NULL; + zbx_thread_wait(threads[i]); + + threads[i] = ZBX_THREAD_HANDLE_NULL; + } } /* signal idle threads to exit */ - threads_kill(threads, threads_num, FAIL); + threads_kill(threads, threads_num, threads_flags, ZBX_THREAD_PRIORITY_NONE, FAIL); #else /* wait for threads to finish first. although listener threads will never end */ WaitForMultipleObjectsEx(threads_num, threads, TRUE, 1000, FALSE); diff --git a/src/zabbix_proxy/proxy.c b/src/zabbix_proxy/proxy.c index f6ce0cae3d9..45bb59e0c5a 100644 --- a/src/zabbix_proxy/proxy.c +++ b/src/zabbix_proxy/proxy.c @@ -1271,7 +1271,7 @@ int MAIN_ZABBIX_ENTRY(int flags) zbx_thread_start(discoverer_thread, &thread_args, &threads[i]); break; case ZBX_PROCESS_TYPE_HISTSYNCER: - threads_flags[i] = ZBX_THREAD_WAIT_EXIT; + threads_flags[i] = ZBX_THREAD_PRIORITY_FIRST; zbx_thread_start(dbsyncer_thread, &thread_args, &threads[i]); break; case ZBX_PROCESS_TYPE_JAVAPOLLER: @@ -1311,7 +1311,7 @@ int MAIN_ZABBIX_ENTRY(int flags) zbx_thread_start(poller_thread, &thread_args, &threads[i]); break; case ZBX_PROCESS_TYPE_AVAILMAN: - threads_flags[i] = ZBX_THREAD_WAIT_EXIT; + threads_flags[i] = ZBX_THREAD_PRIORITY_FIRST; zbx_thread_start(availability_manager_thread, &thread_args, &threads[i]); break; } diff --git a/src/zabbix_server/server.c b/src/zabbix_server/server.c index d92e7d055a6..2a9da70893c 100644 --- a/src/zabbix_server/server.c +++ b/src/zabbix_server/server.c @@ -1346,7 +1346,7 @@ int MAIN_ZABBIX_ENTRY(int flags) switch (thread_args.process_type) { case ZBX_PROCESS_TYPE_SERVICEMAN: - threads_flags[i] = ZBX_THREAD_WAIT_EXIT; + threads_flags[i] = ZBX_THREAD_PRIORITY_SECOND; zbx_thread_start(service_manager_thread, &thread_args, &threads[i]); break; case ZBX_PROCESS_TYPE_CONFSYNCER: @@ -1403,7 +1403,7 @@ int MAIN_ZABBIX_ENTRY(int flags) zbx_thread_start(discoverer_thread, &thread_args, &threads[i]); break; case ZBX_PROCESS_TYPE_HISTSYNCER: - threads_flags[i] = ZBX_THREAD_WAIT_EXIT; + threads_flags[i] = ZBX_THREAD_PRIORITY_FIRST; zbx_thread_start(dbsyncer_thread, &thread_args, &threads[i]); break; case ZBX_PROCESS_TYPE_ESCALATOR: |