Updated processing of pd_flag variable so that startup logic is shared
[dyninst.git] / visiClients / tableVisi / src / main.C
1 /*
2  * Copyright (c) 1996-1999 Barton P. Miller
3  * 
4  * We provide the Paradyn Parallel Performance Tools (below
5  * described as Paradyn") on an AS IS basis, and do not warrant its
6  * validity or performance.  We reserve the right to update, modify,
7  * or discontinue this software at any time.  We shall have no
8  * obligation to supply such updates or modifications or any other
9  * form of support to you.
10  * 
11  * This license is for research uses.  For such uses, there is no
12  * charge. We define "research use" to mean you may freely use it
13  * inside your organization for whatever purposes you see fit. But you
14  * may not re-distribute Paradyn or parts of Paradyn, in any form
15  * source or binary (including derivatives), electronic or otherwise,
16  * to any other organization or entity without our permission.
17  * 
18  * (for other uses, please contact us at paradyn@cs.wisc.edu)
19  * 
20  * All warranties, including without limitation, any warranty of
21  * merchantability or fitness for a particular purpose, are hereby
22  * excluded.
23  * 
24  * By your use of Paradyn, you understand and agree that we (or any
25  * other person or entity with proprietary rights in Paradyn) are
26  * under no obligation to provide either maintenance services,
27  * update services, notices of latent defects, or correction of
28  * defects for Paradyn.
29  * 
30  * Even if advised of the possibility of such damages, under no
31  * circumstances shall we (or any other person or entity with
32  * proprietary rights in the software licensed hereunder) be liable
33  * to you or any third party for direct, indirect, or consequential
34  * damages of any character regardless of type of action, including,
35  * without limitation, loss of profits, loss of use, loss of good
36  * will, or computer failure or malfunction.  You agree to indemnify
37  * us (and any other person or entity with proprietary rights in the
38  * software licensed hereunder) for any and all liability it may
39  * incur to third parties resulting from your use of Paradyn.
40  */
41
42 // $Id: main.C,v 1.17 2000/10/17 17:28:58 schendel Exp $
43
44 #include <assert.h>
45 #include <stdlib.h>
46 #include <iostream.h>
47
48 #include "common/h/headers.h"
49 #include "pdutilOld/h/pdsocket.h"
50 #include "pdutilOld/h/pddesc.h"
51 #include "common/h/Types.h" // Address
52 #include "visi/h/visualization.h"
53
54 #include "tcl.h"
55 #include "tk.h"
56 #include "tkTools.h"
57
58 #include "pdLogo.h"
59 #include "paradyn/xbm/logo.xbm"
60
61 #include "dg2.h"
62
63 #include "tableVisi.h"
64 #include "tableVisiTcl.h"
65
66 #include "common/h/Ident.h"
67 extern "C" const char V_tableVisi[];
68 Ident V_id(V_tableVisi,"Paradyn");
69 extern "C" const char V_libpdutilOld[];
70 Ident V_Uid(V_libpdutilOld,"Paradyn");
71 extern "C" const char V_libvisi[];
72 Ident V_Vid(V_libvisi,"Paradyn");
73
74 Tcl_Interp *mainInterp;
75
76 void panic(const char *msg) {
77    cerr << msg << endl;
78    exit(5);
79 }
80
81 tableVisi *theTableVisi; // our main data structure
82 bool xsynch_flag=false;
83
84 void visiFdReadableHandler(ClientData, int) {
85    // Installed as a file-handler routine for whenever data arrives over
86    // the socket returned from visi_Init()
87    if (visi_callback() == -1)
88       exit(0);
89 }
90
91 int main(int argc, char **argv) {
92
93    if (argc==2 && 0==strcmp(argv[1], "--debug")) {
94       xsynch_flag = true;
95 #if !defined(i386_unknown_nt4_0)
96       cout << "tableVisi at sigpause...pid=" << getpid() << endl;
97       sigpause(0);
98 #endif // !defined(i386_unknown_nt4_0)
99       argc = 1;
100    }
101
102    // tableVisi requires no arguments, thanks to tcl2c.
103    if (argc == 3)
104       cout << "tableVisi notice: argc should no longer be 3 (ignoring args)" << endl;
105
106    if (argc == 2 || argc>3)
107       panic("tableVisi: incorrect #args (should be none)");
108
109    mainInterp = Tcl_CreateInterp();
110    assert(mainInterp);
111
112 #if !defined(i386_unknown_nt4_0)
113    if (xsynch_flag) {
114       cout << "xsynching..." << endl;
115       XSynchronize(Tk_Display(Tk_MainWindow(mainInterp)), 1);
116    }
117 #endif // !defined(i386_unknown_nt4_0)
118
119    if (TCL_OK != Tcl_Init(mainInterp))
120       tclpanic(mainInterp, "Could not Tcl_Init");
121
122    if (TCL_OK != Tk_Init(mainInterp))
123       tclpanic(mainInterp, "Could not Tk_Init");
124
125    if (TCL_OK != Dg2_Init(mainInterp))
126       tclpanic(mainInterp, "Could not Dg2_Init");
127
128    PDSOCKET visi_sock = visi_Init();
129    if (visi_sock < 0)
130       panic("failed to initialize w/ visi lib");
131
132    Tcl_SetVar(mainInterp, "tcl_interactive", "0", TCL_GLOBAL_ONLY);
133
134    // Install our new tcl commands here:
135    installTableVisiCommands(mainInterp);
136
137    if (visi_RegistrationCallback(ADDMETRICSRESOURCES,Dg2AddMetricsCallback)!=0)
138       panic("Dg2_Init() -- couldn't install ADDMETRICSRESOURCES callback");
139
140    if (visi_RegistrationCallback(DATAVALUES, Dg2NewDataCallback) != 0)
141       panic("Dg2_Init() -- couldn't install DATAVALUES callback");
142
143    if (visi_RegistrationCallback(PARADYNEXITED, Dg2ParadynExitedCallback) != 0)
144        panic("Dg2_Init() -- couldn't install PARADYNEXITED callback");
145
146 //   if (visi_RegistrationCallback(PHASEDATA, Dg2PhaseDataCallback) != 0)
147 //      panic("Dg2_Init() -- couldn't install PHASEINFO callback");
148
149         // install a handler to notify us when there is data to be read
150         Tcl_Channel visi_chan = 
151           Tcl_MakeTcpClientChannel((ClientData)(Address)(PDDESC)visi_sock);
152         Tcl_CreateChannelHandler(visi_chan,
153                                  TCL_READABLE,
154                                  (Tcl_FileProc*)visiFdReadableHandler,
155                                  0);
156
157    // Krishna's tcl2c stuff:
158    extern int initialize_tcl_sources(Tcl_Interp *);
159    if (TCL_OK != initialize_tcl_sources(mainInterp))
160       tclpanic(mainInterp, "tableVisi: could not initialize_tcl_sources");
161
162 //if (Tcl_EvalFile(mainInterp, "/p/paradyn/development/tamches/core/visiClients/tableVisi/tcl/tableVisi.tcl") != TCL_OK)
163 //   tclpanic(mainInterp, "could not open tableVisi.tcl");
164
165    pdLogo::install_fixed_logo("paradynLogo", logo_bits, logo_width, logo_height);
166    tcl_cmd_installer createPdLogo(mainInterp, "makeLogo", pdLogo::makeLogoCommand,
167                                   (ClientData)Tk_MainWindow(mainInterp));
168
169    myTclEval(mainInterp, "initializeTableVisi");
170
171    // Create our main data structure:
172    theTableVisi = new tableVisi(mainInterp,
173                                 Tk_NameToWindow(mainInterp, ".body",
174                                                 Tk_MainWindow(mainInterp)),
175                                 "*-Helvetica-*-r-*-14-*", // metric font
176                                 "*-Helvetica-*-r-*-12-*", // metric units font
177                                 "*-Helvetica-*-r-*-14-*", // focus font
178                                 "*-Helvetica-*-r-*-12-*", // cell font
179                                 "lightBlue", // line color
180                                 "blue", // metric color
181                                 "black", // metric units color
182                                 "maroon3", // focus color
183                                 "black", // cell color
184                                 "gray", // background color
185                                 "lightGray", // highlight background color
186                                 3 // initial # sig figs
187                                 );
188    assert(theTableVisi);
189
190    Tk_MainLoop(); // returns when all tk windows are closed
191
192    delete theTableVisi;
193    theTableVisi = NULL;
194
195    return 0;
196 }