Support for split testsuite, launchmon in testsuite
[dyninst.git] / testsuite / src / dynlmon.C
1 /*
2  * Copyright (c) 1996-2009 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  * By your use of Paradyn, you understand and agree that we (or any
12  * other person or entity with proprietary rights in Paradyn) are
13  * under no obligation to provide either maintenance services,
14  * update services, notices of latent defects, or correction of
15  * defects for Paradyn.
16  * 
17  * This library is free software; you can redistribute it and/or
18  * modify it under the terms of the GNU Lesser General Public
19  * License as published by the Free Software Foundation; either
20  * version 2.1 of the License, or (at your option) any later version.
21  * 
22  * This library is distributed in the hope that it will be useful,
23  * but WITHOUT ANY WARRANTY; without even the implied warranty of
24  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
25  * Lesser General Public License for more details.
26  * 
27  * You should have received a copy of the GNU Lesser General Public
28  * License along with this library; if not, write to the Free Software
29  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
30  */
31
32 #include <sys/types.h>
33 #include <unistd.h>
34 #include "ParameterDict.h"
35 #include "test_info_new.h"
36
37 static pid_t run_local(char **args)
38 {
39    pid_t pid = fork();
40    if (pid != 0) {
41       return pid;
42    }
43
44    execvp(args[0], args);
45    exit(-1);
46 }
47
48 #if defined(cap_launchmon)
49 #include "lmon_api/lmon_fe.h"
50
51 static char **getLaunchParams(char *executable, char *args[], const char *num);
52 static bool init_lmon();
53
54 int LMONInvoke(RunGroup *, ParameterDict params, char *test_args[], char *daemon_args[], bool attach)
55 {
56    lmon_rc_e rc;
57    int session;
58    unsigned proctable_size, actual_proctable_size;
59    MPIR_PROCDESC_EXT *proctable = NULL;
60
61    if (!init_lmon()) {
62       fprintf(stderr, "Failed to init launchmon\n");
63       return -1;
64    }
65
66    char **new_test_args = getLaunchParams(test_args[0], test_args+1, "1");
67
68    rc = LMON_fe_createSession(&session);
69    if (rc != LMON_OK) {
70       fprintf(stderr, "Failed to create session\n");
71       return -1;
72    }
73
74    char *launcher_host = NULL;
75    if (params.find("launcher_host") != params.end())
76       launcher_host = params["launcher_host"]->getString();
77
78    if (attach) {
79       pid_t mpirun_pid = run_local(new_test_args);
80       sleep(1); //Want some better way to let mpirun get running
81       rc = LMON_fe_attachAndSpawnDaemons(session,
82                                          launcher_host,
83                                          mpirun_pid,
84                                          daemon_args[0],
85                                          daemon_args,
86                                          NULL, NULL);
87    }
88    else {
89       rc = LMON_fe_launchAndSpawnDaemons(session, 
90                                          launcher_host,
91                                          new_test_args[0],
92                                          new_test_args,
93                                          daemon_args[0],
94                                          daemon_args,
95                                          NULL, NULL);
96    }
97    
98    free(new_test_args);
99
100    return session;
101 }
102
103 static bool init_lmon()
104 {
105    lmon_rc_e rc;
106
107    static bool initialized = false;
108    if (initialized)
109       return true;
110    initialized = true;
111
112    rc = LMON_fe_init( LMON_VERSION);
113    return (rc == LMON_OK);
114 }
115
116 #if defined(os_cnl_test)
117 static char **getLaunchParams(char *executable, char *args[], int num)
118 {
119    
120    int count = 0;
121    for (char *counter[] = args; *counter; counter++, count++);
122    char **new_args = (char **) malloc(sizeof(char *) * (count+5));
123    char num_str[32];
124    snprintf(num_str, 32, "%d", num);
125    new_args[0] = "aprun";
126    new_args[1] = "-n";
127    new_args[2] = num_str;
128    new_args[3] = executable;
129    for (unsigned i=0; i<=count; i++)
130       new_args[4+i] = args[i];
131    return new_args;
132 }
133 #elif defined(os_linux_test)
134 static char **getLaunchParams(char *executable, char *args[], const char *num)
135 {
136    
137    int count = 0;
138    for (char **counter = args; *counter; counter++, count++);
139    char **new_args = (char **) malloc(sizeof(char *) * (count+5));
140    new_args[0] = "orterun";
141    new_args[1] = "-n";
142    new_args[2] = const_cast<char *>(num);
143    for (unsigned i=0; i<=count; i++)
144       new_args[3+i] = args[i];
145    return new_args;
146 }
147 #endif
148
149 #else
150
151 //This is a test function, for testing the launchmon infrastructure on systems without
152 // actually using launchmon.  It shouldn't see use in normal circumstances.
153 int LMONInvoke(RunGroup *group, ParameterDict params, char *test_args[], char *daemon_args[], bool attach)
154 {
155    if (attach) {
156       pid_t mutatee_pid = run_local(test_args);
157       if (mutatee_pid == -1) {
158          return false;
159       }
160       
161       int count, i;
162       char **cur;
163       for (count = 0, cur = daemon_args; *cur; count++, cur++);
164       char **new_daemon_args = (char **) malloc(sizeof(char *) * (count+2));
165       for (i=0; i<count; i++) {
166          new_daemon_args[i] = daemon_args[i];
167       }
168       char newbuffer[64];
169       snprintf(newbuffer, 64, "%d:%d", group->index, mutatee_pid);
170       
171       new_daemon_args[i++] = "-given_mutatee";
172       new_daemon_args[i++] = newbuffer;
173       new_daemon_args[i++] = NULL;
174
175       pid_t mutator_pid = run_local(new_daemon_args);
176       return mutator_pid;
177    }
178    else {
179       pid_t mutator_pid = run_local(daemon_args);
180       return mutator_pid;
181    }
182 }
183
184 #endif