/*----------------------------------------------------------------------------*/ int main(int argc, char **argv) { DIR *dir; struct dirent *ent; int fd; int ret; uint64_t total_read; int cores[MAX_CPUS]; int i; num_cores = GetNumCPUs(); core_limit = num_cores; finished = 0; /* initialize mtcp */ ret = mtcp_init("epserver.conf"); if (ret) { TRACE_ERROR("Failed to initialize mtcp\n"); exit(EXIT_FAILURE); } /* register signal handler to mtcp */ mtcp_register_signal(SIGINT, SignalHandler); TRACE_INFO("Application initialization finished.\n"); for (i = 0; i < core_limit; i++) { cores[i] = i; done[i] = FALSE; if (pthread_create(&app_thread[i], NULL, RunServerThread, (void *)&cores[i])) { perror("pthread_create"); TRACE_ERROR("Failed to create server thread.\n"); exit(-1); } } for (i = 0; i < core_limit; i++) { pthread_join(app_thread[i], NULL); } mtcp_destroy(); // closedir(dir); return 0; }
/*----------------------------------------------------------------------------*/ int main(int argc, char **argv) { DIR *dir; struct dirent *ent; int fd; int ret; uint64_t total_read; int cores[MAX_CPUS]; int i; num_cores = GetNumCPUs(); core_limit = num_cores; if (argc < 2) { TRACE_ERROR("$%s directory_to_service\n", argv[0]); return FALSE; } /* open the directory to serve */ www_main = argv[1]; dir = opendir(www_main); if (!dir) { TRACE_ERROR("Failed to open %s.\n", www_main); perror("opendir"); return FALSE; } for (i = 0; i < argc - 1; i++) { if (strcmp(argv[i], "-N") == 0) { core_limit = atoi(argv[i + 1]); if (core_limit > num_cores) { TRACE_CONFIG("CPU limit should be smaller than the " "number of CPUS: %d\n", num_cores); return FALSE; } } } nfiles = 0; while ((ent = readdir(dir)) != NULL) { if (strcmp(ent->d_name, ".") == 0) continue; else if (strcmp(ent->d_name, "..") == 0) continue; strcpy(fcache[nfiles].name, ent->d_name); sprintf(fcache[nfiles].fullname, "%s/%s", www_main, ent->d_name); fd = open(fcache[nfiles].fullname, O_RDONLY); if (fd < 0) { perror("open"); continue; } else { fcache[nfiles].size = lseek64(fd, 0, SEEK_END); lseek64(fd, 0, SEEK_SET); } fcache[nfiles].file = (char *)malloc(fcache[nfiles].size); if (!fcache[nfiles].file) { TRACE_ERROR("Failed to allocate memory for file %s\n", fcache[nfiles].name); perror("malloc"); continue; } TRACE_INFO("Reading %s (%lu bytes)\n", fcache[nfiles].name, fcache[nfiles].size); total_read = 0; while (1) { ret = read(fd, fcache[nfiles].file + total_read, fcache[nfiles].size - total_read); if (ret < 0) { break; } else if (ret == 0) { break; } total_read += ret; } if (total_read < fcache[nfiles].size) { free(fcache[nfiles].file); continue; } close(fd); nfiles++; if (nfiles >= MAX_FILES) break; } finished = 0; /* initialize mtcp */ ret = mtcp_init("epserver.conf"); if (ret) { TRACE_ERROR("Failed to initialize mtcp\n"); exit(EXIT_FAILURE); } /* register signal handler to mtcp */ mtcp_register_signal(SIGINT, SignalHandler); TRACE_INFO("Application initialization finished.\n"); for (i = 0; i < core_limit; i++) { cores[i] = i; done[i] = FALSE; if (pthread_create(&app_thread[i], NULL, RunServerThread, (void *)&cores[i])) { perror("pthread_create"); TRACE_ERROR("Failed to create server thread.\n"); exit(-1); } } for (i = 0; i < core_limit; i++) { pthread_join(app_thread[i], NULL); } mtcp_destroy(); closedir(dir); return 0; }
int main(int argc, char **argv) { int i; int j; int k; int sum; int cores; int connections; long long total_connections; long long total_messages; int active_connections; int timeouts_connect; int timeouts_recv; char buf; int ret; char ifname[64]; long rx_bytes, rx_packets, tx_bytes, tx_packets; prctl(PR_SET_PDEATHSIG, SIGHUP, 0, 0, 0); if (argc != 7) { fprintf(stderr, "Usage: %s IP PORT CORES CONNECTIONS MSG_SIZE MESSAGES_PER_CONNECTION\n", argv[0]); return 1; } server_addr.sin_family = AF_INET; if (!inet_aton(argv[1], &server_addr.sin_addr)) { fprintf(stderr, "Invalid server IP address \"%s\".\n", argv[1]); return 1; } server_addr.sin_port = htons(atoi(argv[2])); cores = atoi(argv[3]); connections = atoi(argv[4]); msg_size = atoi(argv[5]); messages_per_connection = strtol(argv[6], NULL, 10); if (timer_calibrate_tsc()) { fprintf(stderr, "Error: Timer calibration failed.\n"); return 1; } if (mtcp_init("client_mtcp.conf")) { fprintf(stderr, "Error: mTCP initialization failed.\n"); return 1; } get_ifname(&server_addr, ifname); start_threads(cores, connections); puts("ok"); fflush(stdout); while (1) { ret = read(STDIN_FILENO, &buf, 1); if (ret == 0) { fprintf(stderr, "Error: EOF on STDIN.\n"); return 1; } else if (ret == -1) { perror("read"); return 1; } get_eth_stats(ifname, &rx_bytes, &rx_packets, &tx_bytes, &tx_packets); total_connections = 0; total_messages = 0; active_connections = 0; timeouts_connect = 0; timeouts_recv = 0; for (i = 0; i < cores; i++) { total_connections += worker[i].total_connections; total_messages += worker[i].total_messages; active_connections += worker[i].active_connections; timeouts_connect += worker[i].timeouts_connect; timeouts_recv += worker[i].timeouts_recv; } printf("%lld %lld %d %d %d ", total_connections, total_messages, active_connections, timeouts_connect, timeouts_recv); printf("%ld %ld %ld %ld ", rx_bytes, rx_packets, tx_bytes, tx_packets); printf("0 "); for (i = 0; i < MAX_ERRSOURCE; i++) { for (j = 0; j < MAX_ERRNO; j++) { sum = 0; for (k = 0; k < cores; k++) sum += worker[k].errors[i][j]; if (sum) printf("%d %d %d ", i, j, sum); } } puts(""); fflush(stdout); } mtcp_destroy(); return 0; }
/*----------------------------------------------------------------------------*/ int main(int argc, char **argv) { DIR *dir; struct dirent *ent; int fd; int ret; uint64_t total_read; struct mtcp_conf mcfg; int cores[MAX_CPUS]; int process_cpu; int i, o; num_cores = GetNumCPUs(); core_limit = num_cores; process_cpu = -1; dir = NULL; if (argc < 2) { TRACE_CONFIG("$%s directory_to_service\n", argv[0]); return FALSE; } while (-1 != (o = getopt(argc, argv, "N:f:p:c:h"))) { switch (o) { case 'p': /* open the directory to serve */ www_main = optarg; dir = opendir(www_main); if (!dir) { TRACE_CONFIG("Failed to open %s.\n", www_main); perror("opendir"); return FALSE; } break; case 'N': core_limit = atoi(optarg); if (core_limit > num_cores) { TRACE_CONFIG("CPU limit should be smaller than the " "number of CPUs: %d\n", num_cores); return FALSE; } /** * it is important that core limit is set * before mtcp_init() is called. You can * not set core_limit after mtcp_init() */ mtcp_getconf(&mcfg); mcfg.num_cores = core_limit; mtcp_setconf(&mcfg); break; case 'f': conf_file = optarg; break; case 'c': process_cpu = atoi(optarg); if (process_cpu > core_limit) { TRACE_CONFIG("Starting CPU is way off limits!\n"); return FALSE; } break; case 'h': printHelp(argv[0]); break; } } if (dir == NULL) { TRACE_CONFIG("You did not pass a valid www_path!\n"); exit(EXIT_FAILURE); } nfiles = 0; while ((ent = readdir(dir)) != NULL) { if (strcmp(ent->d_name, ".") == 0) continue; else if (strcmp(ent->d_name, "..") == 0) continue; strcpy(fcache[nfiles].name, ent->d_name); sprintf(fcache[nfiles].fullname, "%s/%s", www_main, ent->d_name); fd = open(fcache[nfiles].fullname, O_RDONLY); if (fd < 0) { perror("open"); continue; } else { fcache[nfiles].size = lseek64(fd, 0, SEEK_END); lseek64(fd, 0, SEEK_SET); } fcache[nfiles].file = (char *)malloc(fcache[nfiles].size); if (!fcache[nfiles].file) { TRACE_CONFIG("Failed to allocate memory for file %s\n", fcache[nfiles].name); perror("malloc"); continue; } TRACE_INFO("Reading %s (%lu bytes)\n", fcache[nfiles].name, fcache[nfiles].size); total_read = 0; while (1) { ret = read(fd, fcache[nfiles].file + total_read, fcache[nfiles].size - total_read); if (ret < 0) { break; } else if (ret == 0) { break; } total_read += ret; } if (total_read < fcache[nfiles].size) { free(fcache[nfiles].file); continue; } close(fd); nfiles++; if (nfiles >= MAX_FILES) break; } finished = 0; /* initialize mtcp */ if (conf_file == NULL) { TRACE_CONFIG("You forgot to pass the mTCP startup config file!\n"); exit(EXIT_FAILURE); } ret = mtcp_init(conf_file); if (ret) { TRACE_CONFIG("Failed to initialize mtcp\n"); exit(EXIT_FAILURE); } /* register signal handler to mtcp */ mtcp_register_signal(SIGINT, SignalHandler); TRACE_INFO("Application initialization finished.\n"); for (i = ((process_cpu == -1) ? 0 : process_cpu); i < core_limit; i++) { cores[i] = i; done[i] = FALSE; if (pthread_create(&app_thread[i], NULL, RunServerThread, (void *)&cores[i])) { perror("pthread_create"); TRACE_CONFIG("Failed to create server thread.\n"); exit(EXIT_FAILURE); } if (process_cpu != -1) break; } for (i = ((process_cpu == -1) ? 0 : process_cpu); i < core_limit; i++) { pthread_join(app_thread[i], NULL); if (process_cpu != -1) break; } mtcp_destroy(); closedir(dir); return 0; }