added startChildren() in main/fart module, soon to be replaced with a straight fork() call

git-svn-id: svn://anubis/fart/trunk@244 7f9b0f55-74a9-4bce-be96-3c2cd072584d
This commit is contained in:
Josh Holtrop 2009-04-15 02:35:14 +00:00
parent a82110ab24
commit f6c6e8ec36
2 changed files with 49 additions and 1 deletions

View File

@ -29,6 +29,8 @@ class distrib
int send_data(int task, unsigned char * data, int num_bytes); int send_data(int task, unsigned char * data, int num_bytes);
int getNumTasksInProgress() { return m_tasks_in_progress.size(); } int getNumTasksInProgress() { return m_tasks_in_progress.size(); }
void waitAllTasks(); void waitAllTasks();
std::string & getServerName() { return m_servername; }
int getServerPort() { return m_serverport; }
typedef struct typedef struct
{ {

View File

@ -1,7 +1,7 @@
#include <iostream> #include <iostream>
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h> /* sysconf() */
#include <stdlib.h> #include <stdlib.h>
#include <getopt.h> #include <getopt.h>
#include <sys/time.h> /* gettimeofday() */ #include <sys/time.h> /* gettimeofday() */
@ -26,6 +26,40 @@ void usage(const char * progname)
exit(42); exit(42);
} }
void startChildren(const string & servername,
int serverport,
const vector<string> options)
{
char server_port_str[15];
sprintf(server_port_str, "%d", serverport);
vector<string> 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 main(int argc, char * argv[])
{ {
int opt; int opt;
@ -39,6 +73,7 @@ int main(int argc, char * argv[])
int server_port = 0; int server_port = 0;
unsigned char * data = NULL; unsigned char * data = NULL;
const char * output_file_name = "fart.bmp"; const char * output_file_name = "fart.bmp";
bool child = false;
static const struct option long_options[] = { static const struct option long_options[] = {
{ "output-file", required_argument, NULL, 'o' }, { "output-file", required_argument, NULL, 'o' },
@ -51,6 +86,7 @@ int main(int argc, char * argv[])
{ "host", required_argument, NULL, 257 }, { "host", required_argument, NULL, 257 },
{ "port", required_argument, NULL, 258 }, { "port", required_argument, NULL, 258 },
{ "hosts", required_argument, NULL, 259 }, { "hosts", required_argument, NULL, 259 },
{ "child", no_argument, NULL, 260 },
{ NULL, 0, NULL, 0 } { NULL, 0, NULL, 0 }
}; };
@ -103,6 +139,9 @@ int main(int argc, char * argv[])
hosts_file = optarg; hosts_file = optarg;
distributed = true; distributed = true;
break; break;
case 260:
child = true;
break;
default: default:
usage(argv[0]); usage(argv[0]);
break; break;
@ -162,6 +201,13 @@ int main(int argc, char * argv[])
} }
else else
{ {
if (!child)
{
startChildren(the_distrib.getServerName(),
the_distrib.getServerPort(),
client_options);
}
the_distrib.startClient(server_name, server_port); the_distrib.startClient(server_name, server_port);
unsigned char data[3 * UNIT_TASK_SIZE]; unsigned char data[3 * UNIT_TASK_SIZE];