#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 <signal.h>
|
#include <limits.h>
|
#include <stdio.h>
|
#include <errno.h>
|
#include <getopt.h>
|
#include <stdlib.h>
|
#include "proc_def.h"
|
#include "msg_mgr.h"
|
|
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(WT_INT);
|
}
|
|
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 defined(MSG_HANDLER)
|
msg_init();
|
#endif
|
|
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[2], NULL, check_start, NULL);
|
|
//pthread_create(&tids[3], NULL, sem_msg_handler, 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;
|
}
|