/*----------------------------------------------------------------------------*/ 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) { 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; }