#include "net_mod_server_socket_wrapper.h" #include "net_mod_socket_wrapper.h" #include "bus_server_socket_wrapper.h" #include "shm_mm_wrapper.h" #include "usg_common.h" #include #include #include #include #include #include using namespace std; #define SVR_PORT 5000 #define TOTAL_THREADS 3 #define MAX_RETRIES 3 static void *gBusServer_socket = NULL; static void *gServer_socket = NULL; static int gShm_size = -1; static int gPort = -1; static int gBusServer_act = 0; static int gBusServer_stat = 0; pthread_t tids[TOTAL_THREADS]; void *res[TOTAL_THREADS]; extern list gLinkedList; void *bus_start(void *skptr) { gBusServer_act = 1; gBusServer_socket = bus_server_socket_wrapper_open(); if (bus_server_socket_wrapper_start_bus(gBusServer_socket) != 0) { printf("start bus failed\n"); gBusServer_stat = -1; } return NULL; } void *svr_start(void *skptr) { int port = *(int *)skptr; 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; } int main(int argc, char *argv[]) { char *endptr; char i; int val; sigset_t mask_all, pre; sigfillset(&mask_all); sigprocmask(SIG_BLOCK, &mask_all, &pre); if (argc >= 4) { fprintf(stderr, "Usage: %s [shm size] [server port]\n", argv[0]); exit(0); }; if (argc >= 2) { argc -= 2; for (i = 0; i <= argc; i++) { errno = 0; val = strtol(argv[i + 1], &endptr, 10); if ((errno == ERANGE && (val == LONG_MAX || val == LONG_MIN)) || (errno != 0 && val == 0)) { fprintf(stderr, "invalid parameter: %s\n", argv[i + 1]); exit(0); } if (endptr == argv[i + 1]) { fprintf(stderr, "invalid parameter %s: No digits were found\n", argv[i + 1]); exit(0); } if (i == 0) { gShm_size = val; } else { gPort = val; } } } if (gShm_size == -1) { gShm_size = SHM_RES_SIZE; } shm_mm_wrapper_init(SHM_RES_SIZE); pthread_create(&tids[0], NULL, bus_start, NULL); if (gPort == -1) { gPort = SVR_PORT; } while(gBusServer_act == 0) { sleep(1); } 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++) { if(pthread_join(tids[i], &res[i]) != 0) { perror("bus_proxy pthread_join"); } } bus_server_socket_wrapper_close(gBusServer_socket); net_mod_socket_close(gServer_socket); shm_mm_wrapper_destroy(); return 0; }