blob: d50db1be1b6648566ad72d4f43fc98cbedb5770d [file] [log] [blame]
#ifndef _PRAGMA_COPYRIGHT_
#define _PRAGMA_COPYRIGHT_
#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
#endif /* _PRAGMA_COPYRIGHT_ */
/****************************************************************************
* Copyright (c) 2008, 2010 IBM Corporation.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0s
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
Classes: None
Description: Enhanced Distributed Shell.
Author: Nicole Nie, Tu HongJ, Liu Wei
History:
Date Who ID Description
-------- --- --- -----------
10/22/08 nieyy Initial code (D154050)
****************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <assert.h>
#include <strings.h>
#include "sci.h"
#include <string>
using namespace std;
int num_resp;
void handler(void *user_param, sci_group_t group, void *buffer, int size)
{
int be_id = ((int *) buffer)[0];
char *msg = (char *)((char *) buffer + sizeof(int));
char *pos = NULL;
while (1) {
pos = strstr(msg, "\n");
if (pos == NULL) {
break;
} else {
pos[0] = '\0';
}
printf("%d: %s\n", be_id, msg);
msg = pos + 1;
}
num_resp++;
}
int main(int argc, char **argv)
{
sci_info_t info;
sci_filter_info_t filter_info;
char msg[256];
char *s;
int i, rc, num_bes, sizes[1];
void *bufs[1];
sci_group_t odd_group, even_group;
int odd_size, even_size;
int *odd_list = NULL, *even_list = NULL;
char pwd[256];
char hfile[256], bpath[256], fpath[256];
getcwd(pwd, 256);
sprintf(hfile, "%s/host.list", pwd);
#ifdef __64BIT__
sprintf(bpath, "%s/dsh_be64", pwd);
#else
sprintf(bpath, "%s/dsh_be", pwd);
#endif
bzero(&info, sizeof(info));
info.type = SCI_FRONT_END;
info.fe_info.mode = SCI_INTERRUPT;
info.fe_info.hostfile = hfile;
info.fe_info.bepath = bpath;
info.fe_info.hndlr = (SCI_msg_hndlr *)&handler;
info.fe_info.param = NULL;
rc = SCI_Initialize(&info);
if (rc != SCI_SUCCESS) {
exit(1);
}
rc = SCI_Query(NUM_BACKENDS, &num_bes);
if (rc != SCI_SUCCESS) {
exit(1);
}
odd_size = (num_bes - num_bes%2) / 2;
odd_list = (int *)malloc(sizeof(int) * odd_size);
for (i=0; i<odd_size; i++) {
odd_list[i] = i*2 + 1;
}
rc = SCI_Group_create(odd_size, odd_list, &odd_group);
if (rc != SCI_SUCCESS) {
exit(1);
}
even_size = (num_bes + num_bes%2) / 2;
even_list = (int *)malloc(sizeof(int) * even_size);
for (i=0; i<even_size; i++) {
even_list[i] = i*2;
}
rc = SCI_Group_create(even_size, even_list, &even_group);
if (rc != SCI_SUCCESS) {
exit(1);
}
string cur_grp = "all";
int exp_resp = num_bes;
while (1) {
printf("(%s) ", cur_grp.c_str());
fflush(stdout);
memset(msg, 0 , sizeof(msg));
fgets(msg, sizeof(msg), stdin);
msg[strlen(msg) - 1] = '\0';
if (strcmp(msg, "help") == 0) {
printf("Commands:\n");
printf("\t\thelp -- show help topics\n");
printf("\t\tall -- send commands to all back ends\n");
printf("\t\teven -- send commands to back ends with even id\n");
printf("\t\todd -- send commands to back ends with odd id\n");
printf("\t\tquit -- exit this program\n");
continue;
} else if (strcmp(msg, "all") == 0) {
cur_grp = "all";
exp_resp = num_bes;
continue;
} else if (strcmp(msg, "odd") == 0) {
cur_grp = "odd";
exp_resp = odd_size;
continue;
} else if (strcmp(msg, "even") == 0) {
cur_grp = "even";
exp_resp = even_size;
continue;
} else if (strcmp(msg, "quit") == 0) {
break;
}
num_resp = 0;
bufs[0] = msg;
sizes[0] = strlen(msg) + 1;
if (cur_grp == "all") {
rc = SCI_Bcast(SCI_FILTER_NULL, SCI_GROUP_ALL, 1, bufs, sizes);
} else if (cur_grp == "odd") {
rc = SCI_Bcast(SCI_FILTER_NULL, odd_group, 1, bufs, sizes);
} else if (cur_grp == "even") {
rc = SCI_Bcast(SCI_FILTER_NULL, even_group, 1, bufs, sizes);
} else {
assert(!"Unknown group");
}
if (rc != SCI_SUCCESS) {
exit(1);
}
while (num_resp < exp_resp) {
usleep(500);
}
}
rc = SCI_Group_free(odd_group);
if (rc != SCI_SUCCESS) {
exit(1);
}
rc = SCI_Group_free(even_group);
if (rc != SCI_SUCCESS) {
exit(1);
}
free(odd_list);
free(even_list);
rc = SCI_Terminate();
return rc;
}