diff options
author | Dmitry Kozlov <xeb@mail.ru> | 2014-04-11 11:08:29 +0400 |
---|---|---|
committer | Dmitry Kozlov <xeb@mail.ru> | 2014-04-11 11:08:53 +0400 |
commit | bf5340291badcc631bd855bb924593cd445ecd26 (patch) | |
tree | 5dc6affeeee486e10af49189199d5d06fa8ddb6c /accel-pppd/extra/net-snmp/agent.c | |
parent | 918f808ecbe871f6c7ca615f296594e995b08697 (diff) | |
download | accel-ppp-bf5340291badcc631bd855bb924593cd445ecd26.tar.gz accel-ppp-bf5340291badcc631bd855bb924593cd445ecd26.zip |
net-snmp: run snmp in "special" thread
NET-SNMP is built on top of stale file descriptor multiplexing mechanism (select)
which prevents to use descriptors with number >= 1024.
Due to accel-ppp uses a lots of descriptors NET-SNMP easy overflows this limit and fails
and even may crash whole accel-ppp process.
This patch runs snmp in special thread which does not share file descritor table
with main process, so it can use less descriptors and live in __FD_SETSIZE limit.
Signed-off-by: Dmitry Kozlov <xeb@mail.ru>
Diffstat (limited to 'accel-pppd/extra/net-snmp/agent.c')
-rw-r--r-- | accel-pppd/extra/net-snmp/agent.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/accel-pppd/extra/net-snmp/agent.c b/accel-pppd/extra/net-snmp/agent.c index cfeb7639..2acc6d7e 100644 --- a/accel-pppd/extra/net-snmp/agent.c +++ b/accel-pppd/extra/net-snmp/agent.c @@ -1,5 +1,6 @@ #include <pthread.h> #include <signal.h> +#include <sys/wait.h> #include <net-snmp/net-snmp-config.h> #include <net-snmp/net-snmp-includes.h> @@ -26,8 +27,8 @@ static int conf_master = 0; static oid* oid_prefix; static size_t oid_prefix_size;*/ -static pthread_t snmp_thr; static int snmp_term = 0; +static int snmp_pid; /*int accel_ppp_alloc_oid(oid tail, size_t size, oid **oid) { @@ -70,7 +71,7 @@ static int agent_log(int major, int minor, void *serv_arg, void *cl_arg) return 0; } -static void *snmp_thread(void *a) +static int snmp_thread(void *a) { sigset_t set; @@ -107,22 +108,22 @@ static void *snmp_thread(void *a) if (conf_master) init_master_agent(); - while (!snmp_term) { + while (!snmp_term) agent_check_and_process(1); - } snmp_shutdown(conf_agent_name); SOCK_CLEANUP; - return NULL; + return 0; } static void snmp_ctx_close(struct triton_context_t *ctx) { + int status; snmp_term = 1; - pthread_cancel(snmp_thr); - pthread_join(snmp_thr, NULL); + kill(snmp_pid, 32); + waitpid(snmp_pid, &status, 0); triton_context_unregister(ctx); } @@ -146,7 +147,8 @@ static void init(void) if (opt) conf_oid_prefix = opt;*/ - pthread_create(&snmp_thr, NULL, snmp_thread, NULL); + snmp_pid = clone(snmp_thread, malloc(1024*1024) + 1024*1024, CLONE_SIGHAND|CLONE_FS|CLONE_VM|CLONE_THREAD, NULL); + triton_context_register(&ctx, NULL); triton_context_wakeup(&ctx); triton_collect_cpu_usage(); |