@@ -41,6 +41,7 @@ static int json_server = 0;
41
41
static int json_port = JSON_PORT ;
42
42
static FILE * json_output = NULL ;
43
43
static int verbose = 0 ;
44
+ static FILE * lstopo_misc_output = NULL ;
44
45
45
46
void usage (const char * name , FILE * where )
46
47
{
@@ -66,6 +67,7 @@ void usage(const char *name, FILE *where)
66
67
fprintf (where , " --pid-cmd <cmd> Append the output of <cmd> <pid> to each PID line\n" );
67
68
fprintf (where , " --short-name Show only the process short name instead of the path\n" );
68
69
fprintf (where , " --disallowed Include objects disallowed by administrative limitations\n" );
70
+ fprintf (where , " --lstopo-misc <file> Output Misc object to be given to lstopo --misc-from <file>\n" );
69
71
fprintf (where , " --json-server Run as a JSON server\n" );
70
72
fprintf (where , " --json-port <n> Use port <n> for JSON server (default is %d)\n" , JSON_PORT );
71
73
fprintf (where , " -v --verbose Increase verbosity\n" );
@@ -135,6 +137,45 @@ static void print_process(hwloc_topology_t topology,
135
137
print_task (topology , proc -> threads [i ].tid , proc -> threads [i ].name , proc -> threads [i ].cpuset , NULL , 1 );
136
138
}
137
139
140
+ static void print_process_lstopo_misc (hwloc_topology_t topology __hwloc_attribute_unused ,
141
+ struct hwloc_ps_process * proc )
142
+ {
143
+ /* sort of similar to foreach_process_cb() in lstopo.c */
144
+ char name [100 ];
145
+ char * s ;
146
+ unsigned i ;
147
+
148
+ snprintf (name , sizeof (name ), "%ld" , proc -> pid );
149
+ if (* proc -> name )
150
+ snprintf (name , sizeof (name ), "%ld %s" , proc -> pid , proc -> name );
151
+ hwloc_bitmap_asprintf (& s , proc -> cpuset );
152
+ fprintf (lstopo_misc_output ,
153
+ "name=%s\n"
154
+ "cpuset=%s\n"
155
+ "subtype=Process\n"
156
+ "\n" ,
157
+ name , s );
158
+ free (s );
159
+
160
+ if (proc -> nthreads )
161
+ for (i = 0 ; i < proc -> nthreads ; i ++ )
162
+ if (proc -> threads [i ].cpuset ) {
163
+ char task_name [150 ];
164
+ if (* proc -> threads [i ].name )
165
+ snprintf (task_name , sizeof (task_name ), "%s %li %s" , name , proc -> threads [i ].tid , proc -> threads [i ].name );
166
+ else
167
+ snprintf (task_name , sizeof (task_name ), "%s %li" , name , proc -> threads [i ].tid );
168
+ hwloc_bitmap_asprintf (& s , proc -> threads [i ].cpuset );
169
+ fprintf (lstopo_misc_output ,
170
+ "name=%s\n"
171
+ "cpuset=%s\n"
172
+ "subtype=Thread\n"
173
+ "\n" ,
174
+ task_name , s );
175
+ free (s );
176
+ }
177
+ }
178
+
138
179
static void print_process_json (hwloc_topology_t topology ,
139
180
struct hwloc_ps_process * proc )
140
181
{
@@ -207,6 +248,8 @@ static void foreach_process_cb(hwloc_topology_t topology,
207
248
208
249
if (json_output )
209
250
print_process_json (topology , proc );
251
+ else if (lstopo_misc_output )
252
+ print_process_lstopo_misc (topology , proc );
210
253
else
211
254
print_process (topology , proc );
212
255
}
@@ -241,6 +284,8 @@ static int run(hwloc_topology_t topology, hwloc_const_bitmap_t topocpuset,
241
284
242
285
if (json_output )
243
286
print_process_json (topology , & proc );
287
+ else if (lstopo_misc_output )
288
+ print_process_lstopo_misc (topology , & proc );
244
289
else
245
290
print_process (topology , & proc );
246
291
}
@@ -467,6 +512,21 @@ int main(int argc, char *argv[])
467
512
pidcmd = argv [1 ];
468
513
opt = 1 ;
469
514
515
+ } else if (!strcmp (argv [0 ], "--lstopo-misc" )) {
516
+ if (argc < 2 ) {
517
+ usage (callname , stderr );
518
+ exit (EXIT_FAILURE );
519
+ }
520
+ if (!strcmp (argv [1 ], "-" ))
521
+ lstopo_misc_output = stdout ;
522
+ else
523
+ lstopo_misc_output = fopen (argv [1 ], "w" );
524
+ if (!lstopo_misc_output ) {
525
+ fprintf (stderr , "Failed to open --lstopo-misc output `%s' for writing (%s)\n" , argv [1 ], strerror (errno ));
526
+ exit (EXIT_FAILURE );
527
+ }
528
+ opt = 1 ;
529
+
470
530
} else if (!strcmp (argv [0 ], "--json-server" )) {
471
531
json_server = 1 ;
472
532
} else if (!strcmp (argv [0 ], "--json-port" )) {
@@ -540,5 +600,7 @@ int main(int argc, char *argv[])
540
600
out_with_topology :
541
601
hwloc_topology_destroy (topology );
542
602
out :
603
+ if (lstopo_misc_output && lstopo_misc_output != stdout )
604
+ fclose (lstopo_misc_output );
543
605
return err ;
544
606
}
0 commit comments