diff --git a/distrib/distrib.h b/distrib/distrib.h index f87ef97..16fdd14 100644 --- a/distrib/distrib.h +++ b/distrib/distrib.h @@ -29,6 +29,8 @@ class distrib int send_data(int task, unsigned char * data, int num_bytes); int getNumTasksInProgress() { return m_tasks_in_progress.size(); } void waitAllTasks(); + std::string & getServerName() { return m_servername; } + int getServerPort() { return m_serverport; } typedef struct { diff --git a/main/fart.cc b/main/fart.cc index aeb531e..e56486d 100644 --- a/main/fart.cc +++ b/main/fart.cc @@ -1,7 +1,7 @@ #include #include -#include +#include /* sysconf() */ #include #include #include /* gettimeofday() */ @@ -26,6 +26,40 @@ void usage(const char * progname) exit(42); } +void startChildren(const string & servername, + int serverport, + const vector options) +{ + char server_port_str[15]; + sprintf(server_port_str, "%d", serverport); + + vector args; + args.push_back("fart"); + args.push_back("--child"); + args.push_back("--host"); + args.push_back(servername); + args.push_back("--port"); + args.push_back(server_port_str); + for (int i = 0, sz = options.size(); i < sz; i++) + args.push_back(options[i]); + const char * char_star_args[args.size() + 1]; + for (int i = 0, sz = args.size(); i < sz; i++) + char_star_args[i] = args[i].c_str(); + char_star_args[args.size()] = (char *) NULL; + + int num_children = sysconf(_SC_NPROCESSORS_CONF); + + for (int i = 0; i < num_children; i++) + { + int id = fork(); + if (id == 0) + { + /* child process */ + execvp("fart", (char * const *) char_star_args); + } + } +} + int main(int argc, char * argv[]) { int opt; @@ -39,6 +73,7 @@ int main(int argc, char * argv[]) int server_port = 0; unsigned char * data = NULL; const char * output_file_name = "fart.bmp"; + bool child = false; static const struct option long_options[] = { { "output-file", required_argument, NULL, 'o' }, @@ -51,6 +86,7 @@ int main(int argc, char * argv[]) { "host", required_argument, NULL, 257 }, { "port", required_argument, NULL, 258 }, { "hosts", required_argument, NULL, 259 }, + { "child", no_argument, NULL, 260 }, { NULL, 0, NULL, 0 } }; @@ -103,6 +139,9 @@ int main(int argc, char * argv[]) hosts_file = optarg; distributed = true; break; + case 260: + child = true; + break; default: usage(argv[0]); break; @@ -162,6 +201,13 @@ int main(int argc, char * argv[]) } else { + if (!child) + { + startChildren(the_distrib.getServerName(), + the_distrib.getServerPort(), + client_options); + } + the_distrib.startClient(server_name, server_port); unsigned char data[3 * UNIT_TASK_SIZE];