3 This code implements the tcl "paradyn" command. See the README file for
7 /* $Log: paradyn.tcl.C,v $
8 /* Revision 1.17 1994/06/14 15:20:17 markc
9 /* Added extra arg to enableDataCollection call. This is probably temporaray
10 /* since the data manager or configuration language will specify this info.
12 * Revision 1.16 1994/05/31 19:11:49 hollings
13 * Changes to permit direct access to resources and resourceLists.
15 * Revision 1.15 1994/05/26 21:26:10 karavan
16 * corrected return value for Process command, to return TCL_ERROR if call
17 * to Add_Executable fails.
19 * Revision 1.14 1994/05/18 00:50:12 hollings
20 * added pid argument to core command.
22 * Revision 1.13 1994/05/12 23:34:16 hollings
23 * made path to paradyn.h relative.
25 * Revision 1.12 1994/05/09 20:59:27 hollings
26 * Changed paradyn shg start to clearSHG not init it.
28 * Revision 1.11 1994/05/06 06:40:06 karavan
29 * added shg start command
31 * Revision 1.10 1994/05/05 02:13:29 karavan
32 * moved CmdTabEntry definition from paradyn.tcl.C to UIglobals.h
34 * Revision 1.9 1994/05/02 20:38:31 hollings
35 * added search pause command and shg commands.
37 * Revision 1.8 1994/04/27 22:55:09 hollings
38 * Merged refine auto and search.
40 * Revision 1.7 1994/04/21 23:24:51 hollings
41 * added process command.
43 * Revision 1.6 1994/04/19 22:09:14 rbi
44 * Added new tcl commands and updated "enable" to return met id
46 * Revision 1.5 1994/04/10 19:12:12 newhall
49 * Revision 1.4 1994/04/09 18:37:20 hollings
50 * Fixed paramter to tunable constant to work.
52 * Revision 1.3 1994/04/06 22:40:15 markc
55 * Revision 1.2 1994/04/05 23:49:25 rbi
56 * Fixed a bunch of tcl related stuff.
58 * Revision 1.1 1994/04/05 04:42:38 karavan
59 * initial version of UI thread code and tcl paradyn command
67 #include "../DMthread/DMresource.h"
68 #include "util/h/tunableConst.h"
70 #include "thread/h/thread.h"
71 #include "../pdMain/paradyn.h"
72 #include "UIglobals.h"
75 extern Boolean detachApplication(applicationContext,Boolean);
77 int ParadynPauseCmd(ClientData clientData,
82 dataMgr->pauseApplication(context);
87 int ParadynContCmd(ClientData clientData,
92 dataMgr->continueApplication(context);
96 int ParadynStatusCmd(ClientData clientData,
101 dataMgr->printStatus(context);
105 int ParadynMetricsCmd(ClientData clientData,
113 ml = dataMgr->getAvailableMetrics(context);
114 for (i=0; i < ml.count; i++)
115 Tcl_AppendElement(interp, ml.data[i]);
119 int ParadynResourcesCmd(ClientData clientData,
124 resource *parent, *child;
125 resourceList *resList, *children;
126 int i, j, count, count2;
129 parent = uim_rootRes;
130 resList = parent->getChildren();
132 count = resList->getCount();
134 for (i = 0; i < count; i++) {
135 parent = resList->getNth(i);
137 name = parent->getFullName();
138 Tcl_AppendElement(interp, name);
140 children = parent->getChildren();
141 count2 = children->getCount();
143 for (j = 0; j < count2; j++) {
144 child = children->getNth(j);
145 name = child->getFullName();
146 Tcl_AppendElement(interp, name);
152 int ParadynListCmd(ClientData clientData,
160 List<tunableConstant*> curr;
162 dataMgr->printResources();
163 ml = dataMgr->getAvailableMetrics(context);
164 for (i=0; i < ml.count; i++) {
165 printf("%s\n", ml.data[i]);
167 printf("CONSTANTS\n");
168 assert(tunableConstant::allConstants);
169 for (curr = *tunableConstant::allConstants; c = *curr; curr++) {
170 printf("%s = %f\n", c->getName(), c->getValue());
172 printf("bucketWidth %f\n", dataMgr->getCurrentBucketWidth());
173 printf("number of buckets = %d\n", dataMgr->getMaxBins());
177 int ParadynDetachCmd (ClientData clientData,
182 dataMgr->detachApplication(context, True);
186 int ParadynGetTotalCmd (ClientData clientData,
196 sprintf(interp->result, "USAGE: gettotal <metid>");
200 if (Tcl_GetInt(interp, argv[1], &met) == TCL_ERROR) {
201 sprintf(interp->result, "Could not parse '%s' as an integer", argv[1]);
205 mi = uim_enabled.find((void *) met);
208 sprintf (interp->result, "unable to find metric %d\n", met);
212 val = dataMgr->getTotValue(mi);
213 sprintf(interp->result, "%g", val);
219 int ParadynPrintCmd (ClientData clientData,
224 if (argv[1][0] == 'm') { // print metric
229 if (Tcl_GetInt(interp, argv[2], &met) == TCL_ERROR)
231 mi = uim_enabled.find((void *) met);
233 sprintf (interp->result, "unable to find metric %d\n", met);
236 val = dataMgr->getMetricValue(mi);
237 printf ("metric %s, val = %f\n",
238 dataMgr->getMetricName(dataMgr->getMetric(mi)), val);
240 } else if (argv[1][0] == 's') { //print shg
241 perfConsult->printSHGList();
242 } else if (argv[1][0] == 'r') { // print refine
244 searchHistoryNode *currentSHGNode;
245 SHNptr_Array currentRefinementList;
247 currentSHGNode = perfConsult->getCurrentRefinement();
248 currentRefinementList = perfConsult-> getAllRefinements (currentSHGNode);
250 for (i=0; i < currentRefinementList.count; i++) {
251 currentSHGNode = currentRefinementList.data[i];
252 perfConsult->printSHGNode(currentSHGNode);
256 sprintf (interp->result, "Unknown option: paradyn print %s\n", argv[1]);
264 printf("USAGE: process <-user user> <-machine machine> <-daemon> daemon> \"command\"\n");
269 * Calls data manager service "addExecutable".
270 * Returns TCL_OK or TCL_ERROR
272 int ParadynProcessCmd(ClientData clientData,
279 char *machine = NULL;
280 char *paradynd = NULL;
282 for (i=1; i < argc-1; i++) {
283 if (!strcmp("-user", argv[i])) {
289 } else if (!strcmp("-machine", argv[i])) {
295 } else if (!strcmp("-daemon", argv[i])) {
300 paradynd = argv[++i];
301 } else if (argv[i][0] != '-') {
309 if (dataMgr->addExecutable(context, machine, user, paradynd, argc-i,
317 * build_resource_list
318 * parses string of form <aaa/bbb/ccc,ddd/eee>, building up a
319 * list of resources which is returned.
320 * returns NULL if any resource not defined or if argument does not
321 * match regular expression for the string.
323 resourceList *build_resource_list (Tcl_Interp *interp, char *list)
325 char **argv1, **argv2;
328 resource *parent, *child;
331 printf("list is %s\n",list);
332 ret = new resourceList;
334 if (Tcl_SplitList(interp, list, &argc1, &argv1) != TCL_OK) {
335 printf("Could not split list '%s'", list);
339 for (res = 0; res < argc1; res++) {
340 if (Tcl_SplitList(interp, argv1[res], &argc2, &argv2) != TCL_OK) {
341 printf("Could not split list '%s'", argv1[res]);
344 parent = uim_rootRes;
345 for (el = 0; el < argc2; el++) {
346 child = parent->findChild(argv2[el]);
348 printf ("Resource %s (child of %s) not defined\n", argv2[el],
349 ((el == 0) ? "/" : argv2[el-1]) );
365 int ParadynDisableCmd (ClientData clientData,
374 dataMgr->pauseApplication (context);
377 sprintf(interp->result, "USAGE: disable <metid>");
381 if (Tcl_GetInt(interp, argv[1], &met) == TCL_ERROR) {
382 sprintf(interp->result, "Could not parse '%s' as an integer", argv[1]);
386 mi = uim_enabled.find((void *) met);
389 sprintf (interp->result, "unable to find metric %d\n", met);
393 dataMgr->disableDataCollection (uim_defaultStream, mi);
400 // enable <metric> ?<resource>? ...
403 int ParadynEnableCmd (ClientData clientData,
411 resourceList *resList;
414 dataMgr->pauseApplication (context);
416 // Build a resource list from the tcl list
418 resList = dataMgr->getRootResources();
420 resList = build_resource_list (interp, argv[2]);
421 if (resList == NULL) {
422 sprintf (interp->result, "unable to build resource list for %s",
429 name = resList->getCanonicalName();
430 printf ("enable request for %s\n", name);
433 // Now check the metric
434 met = dataMgr->findMetric (context, argv[1]);
436 sprintf (interp->result, "metric %s is not defined\n", argv[1]);
440 // Finally enable the data collection
441 // ... and specify aggregation style
442 mi = dataMgr->enableDataCollection (uim_defaultStream, resList,
445 uim_enabled.add(mi, (void *) uim_eid);
446 sprintf(interp->result,"%d",uim_eid);
447 printf ("metric %s, id = %d\n", dataMgr->getMetricName(met), uim_eid);
450 sprintf (interp->result, "can't enable metric %s for focus \n", argv[1]);
458 int ParadynCoreCmd (ClientData clientData,
466 printf("usage: paradyn core <pid>\n");
470 dataMgr->coreProcess(context, pid);
474 int ParadynSetCmd (ClientData clientData,
480 tunableConstant *curr;
485 sprintf(interp->result,"USAGE: %s <variable> <value>", argv[0]);
488 assert (tunableConstant::allConstants && tunableConstant::pool);
489 sp = tunableConstant::pool->findAndAdd(argv[1]);
490 curr = tunableConstant::allConstants->find(sp);
492 if (Tcl_GetDouble(interp, argv[2], &d) == TCL_ERROR)
497 if (!curr->setValue(f)) {
498 sprintf (interp->result, "value %f not valid.\n", f);
502 printf ("%s set to %f\n", curr->getName(), curr->getValue());
505 sprintf (interp->result, "variable %s not defined\n", argv[1]);
511 int ParadynSearchCmd (ClientData clientData,
518 if (argc == 2 && !strcmp(argv[1], "pause")) {
520 perfConsult->pauseSearch();
522 } else if (argc == 3) {
523 if (Tcl_GetInt (interp, argv[2], &limit) == TCL_ERROR)
525 } else if (argc == 2) {
528 printf("Usage: paradyn search <false|true> <int>\n");
529 printf(" paradyn search pause\n");
533 if (dataMgr->applicationDefined(context) != True) {
534 sprintf (interp->result, "no program defined, can't search\n");
537 perfConsult->search(True, limit);
543 int ParadynSHGCmd (ClientData clientData,
550 if (argc == 2 && !strcmp(argv[1], "get")) {
551 node = perfConsult->getCurrentNodeId();
552 sprintf(interp->result, "%d", node);
554 } else if (argc == 2 && !strcmp(argv[1], "reset")) {
555 perfConsult->resetRefinement();
556 sprintf(interp->result, "1");
558 } else if (argc == 3 &&
559 !strcmp(argv[1], "set") &&
560 (node = atoi(argv[2]) > 0)) {
561 sprintf(interp->result, "%d", perfConsult->setCurrentSHGnode(node));
563 } else if (argc == 2 && !strcmp(argv[1], "start")) {
564 perfConsult->clearSHG();
567 printf("Usage: paradyn shg set <int>\n");
568 printf(" paradyn shg get\n");
569 printf(" paradyn shg reset\n");
570 printf(" paradyn shg start\n");
575 int ParadynVisiCmd (ClientData clientData,
580 if (argv[1][0] == 'a') {
581 VM_activeVisiInfo_Array temp;
584 temp = vmMgr->VMActiveVisis();
585 for(i=0;i<temp.count;i++){
586 printf("active_info %d: name %s TypeId %d visiNum = %d\n",i,
587 temp.data[i].name,temp.data[i].visiTypeId,temp.data[i].visiNum);
590 else if (argv[1][0] == 'i') {
591 VM_visiInfo_Array visi_info;
594 visi_info = vmMgr->VMAvailableVisis();
595 for(i=0;i<visi_info.count;i++){
596 printf("visi %d: name %s visiTypeId %d\n",i,
597 visi_info.data[i].name,visi_info.data[i].visiTypeId);
600 else if (argv[1][0] == 'c') {
602 if (Tcl_GetInt (interp, argv[2], &i) != TCL_OK)
604 ok = vmMgr->VMCreateVisi(i);
606 else if (argv[1][0] == 'k') {
608 if (Tcl_GetInt (interp, argv[2], &i) != TCL_OK)
610 vmMgr->VMDestroyVisi(i);
613 sprintf(interp->result,
614 "USAGE: visi [kill <ivalue>|create <ivalue>|info|active<cmd>]");
620 static struct cmdTabEntry Pd_Cmds[] = {
621 {"pause", ParadynPauseCmd},
622 {"cont", ParadynContCmd},
623 {"status", ParadynStatusCmd},
624 {"list", ParadynListCmd},
625 {"detach", ParadynDetachCmd},
626 {"disable", ParadynDisableCmd},
627 {"enable", ParadynEnableCmd},
628 {"gettotal", ParadynGetTotalCmd},
629 {"metrics", ParadynMetricsCmd},
630 {"print", ParadynPrintCmd},
631 {"process", ParadynProcessCmd},
632 {"resources", ParadynResourcesCmd},
633 {"set", ParadynSetCmd},
634 {"core", ParadynCoreCmd},
635 {"search", ParadynSearchCmd},
636 {"shg", ParadynSHGCmd},
637 {"visi", ParadynVisiCmd},
641 int ParadynCmd(ClientData clientData,
649 sprintf(interp->result,"USAGE: %s <cmd>", argv[0]);
653 for (i = 0; Pd_Cmds[i].cmdname; i++) {
654 if (strcmp(Pd_Cmds[i].cmdname,argv[1]) == 0) {
655 return ((Pd_Cmds[i].func)(clientData,interp,argc-1,argv+1));
659 sprintf(interp->result,"unknown paradyn cmd '%s'",argv[1]);
663 void initParadynCmd(Tcl_Interp *interp)
665 Tcl_CreateCommand(interp, "paradyn", ParadynCmd, (ClientData) NULL,
666 (Tcl_CmdDeleteProc *) NULL);