From 5c912c70e9333298ff48f7ea15424f72ca977b99 Mon Sep 17 00:00:00 2001 From: Fu Juntang <StrongTiger_001@163.com> Date: 星期五, 17 九月 2021 09:43:55 +0800 Subject: [PATCH] Add the heartbeat logic feature. --- src/bus_proxy_start.cpp | 66 +++++++++++++++++++++++++++++++- 1 files changed, 63 insertions(+), 3 deletions(-) diff --git a/src/bus_proxy_start.cpp b/src/bus_proxy_start.cpp index a04edad..c3104a9 100644 --- a/src/bus_proxy_start.cpp +++ b/src/bus_proxy_start.cpp @@ -11,9 +11,13 @@ #include <getopt.h> #include <stdlib.h> +using namespace std; + #define SVR_PORT 5000 -#define TOTAL_THREADS 2 +#define TOTAL_THREADS 3 + +#define MAX_RETRIES 3 static void *gBusServer_socket = NULL; static void *gServer_socket = NULL; @@ -24,8 +28,10 @@ static int gBusServer_act = 0; static int gBusServer_stat = 0; -pthread_t tids[2]; -void *res[2]; +pthread_t tids[TOTAL_THREADS]; +void *res[TOTAL_THREADS]; + +extern list gLinkedList; void *bus_start(void *skptr) { @@ -48,6 +54,58 @@ gServer_socket = net_mod_server_socket_open(port); if(net_mod_server_socket_start(gServer_socket) != 0) { printf("start net mod server failed\n"); + } + + return NULL; +} + +void *check_start(void *skptr) { + int i; + int ret; + int val; + int thres; + int data; + int data_ret; + int total; + void *buf; + int size; + char buf_temp[MAX_STR_LEN] = { 0x00 }; + + struct timespec timeout = {.tv_sec = 3, .tv_nsec = 0}; + + while(true) { + total = gLinkedList.NodeNum(); + for (i = 0; i < total; i++) { + + val = gLinkedList.nodeGet(i); + if (val > 0) { + data_ret = bus_server_socket_wrapper_data_get(gBusServer_socket, val); + thres = gLinkedList.dataGet(val); + if ((data_ret == true) && (thres < MAX_RETRIES)) { + + data = gLinkedList.dataFixGet(val); + sprintf(buf_temp, "%d", i + 1); + ret = bus_server_socket_wrapper_proc_check(gBusServer_socket, data, buf_temp, strlen(buf_temp), &buf, &size, &timeout, BUS_TIMEOUT_FLAG); + if (ret == 0) { + gLinkedList.dataSet(val, 0x00); + + free(buf); + } else { + + gLinkedList.dataSet(val, ++thres); + } + + } else { + + gLinkedList.Delete(val); + if (thres >= MAX_RETRIES) { + bus_server_socket_wrapper_proc_release(gBusServer_socket, val); + } + } + } + } + + sleep(10); } return NULL; @@ -110,6 +168,8 @@ if (gBusServer_stat >= 0) { pthread_create(&tids[1], NULL, svr_start, (void *)&gPort); + + pthread_create(&tids[0], NULL, check_start, NULL); } for (i = 0; i< TOTAL_THREADS; i++) { -- Gitblit v1.8.0