1/* Copyright (C) 2021-2024 Free Software Foundation, Inc. 2 Contributed by Oracle. 3 4 This file is part of GNU Binutils. 5 6 This program is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 3, or (at your option) 9 any later version. 10 11 This program is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with this program; if not, write to the Free Software 18 Foundation, 51 Franklin Street - Fifth Floor, Boston, 19 MA 02110-1301, USA. */ 20 21#include "config.h" 22#include <stdio.h> 23#include <strings.h> 24#include <limits.h> 25#include <sys/param.h> 26 27#include "util.h" 28#include "DbeSession.h" 29#include "Experiment.h" 30#include "Expression.h" 31#include "Metric.h" 32 33Metric::Metric (BaseMetric *item, SubType st) : BaseMetric (*item) 34{ 35 name = NULL; 36 abbr = NULL; 37 abbr_unit = NULL; 38 baseMetric = item; 39 set_subtype (st); 40 visbits = VAL_NA; 41 if (item->get_type () == DERIVED) 42 visbits = VAL_VALUE; 43} 44 45Metric::Metric (const Metric& item) : BaseMetric (item) 46{ 47 baseMetric = item.baseMetric; 48 subtype = item.subtype; 49 name = dbe_strdup (item.name); 50 abbr = dbe_strdup (item.abbr); 51 abbr_unit = dbe_strdup (item.abbr_unit); 52 visbits = item.visbits; 53} 54 55Metric::~Metric () 56{ 57 free (name); 58 free (abbr); 59 free (abbr_unit); 60} 61 62// Note that BaseMetric::get_vtype() has the base value type. 63// Here, we get the value type for the displayed metric, 64// which may be different if comparison is used. 65 66ValueTag 67Metric::get_vtype2 () 68{ 69 ValueTag vtype = get_vtype (); 70 if (visbits & VAL_DELTA) 71 { 72 switch (vtype) 73 { 74 case VT_ULLONG: return VT_LLONG; 75 default: return vtype; 76 } 77 } 78 if (visbits & VAL_RATIO) 79 { 80 switch (vtype) 81 { 82 case VT_INT: 83 case VT_LLONG: 84 case VT_ULLONG: 85 case VT_FLOAT: 86 case VT_DOUBLE: return VT_DOUBLE; 87 default: return vtype; 88 } 89 } 90 return vtype; 91} 92 93void 94Metric::set_subtype (SubType st) 95{ 96 subtype = st; 97 free (name); 98 free (abbr); 99 free (abbr_unit); 100 name = NULL; 101 abbr = NULL; 102 abbr_unit = NULL; 103 104 switch (get_type ()) 105 { 106 case CP_LMS_USER: 107 abbr_unit = dbe_strdup (GTXT ("sec.")); 108 if (st == EXCLUSIVE) 109 { 110 name = dbe_strdup (GTXT ("Exclusive User CPU Time")); 111 abbr = dbe_strdup (GTXT ("Excl. User CPU")); 112 } 113 else if (st == INCLUSIVE) 114 { 115 name = dbe_strdup (GTXT ("Inclusive User CPU Time")); 116 abbr = dbe_strdup (GTXT ("Incl. User CPU")); 117 } 118 else if (st == ATTRIBUTED) 119 { 120 name = dbe_strdup (GTXT ("Attributed User CPU Time")); 121 abbr = dbe_strdup (GTXT ("Attr. User CPU")); 122 } 123 else 124 { 125 name = dbe_sprintf (GTXT ("Unexpected CP_LMS_USER metric subtype %d"), 126 st); 127 abbr = dbe_strdup (NTXT ("??")); 128 abort (); 129 } 130 break; 131 132 case CP_LMS_WAIT_CPU: 133 abbr_unit = dbe_strdup (GTXT ("sec.")); 134 if (st == EXCLUSIVE) 135 { 136 name = dbe_strdup (GTXT ("Exclusive Wait CPU Time")); 137 abbr = dbe_strdup (GTXT ("Excl. Wait CPU")); 138 } 139 else if (st == INCLUSIVE) 140 { 141 name = dbe_strdup (GTXT ("Inclusive Wait CPU Time")); 142 abbr = dbe_strdup (GTXT ("Incl. Wait CPU")); 143 } 144 else if (st == ATTRIBUTED) 145 { 146 name = dbe_strdup (GTXT ("Attributed Wait CPU Time")); 147 abbr = dbe_strdup (GTXT ("Attr. Wait CPU")); 148 } 149 else 150 { 151 name = dbe_sprintf (GTXT ("Unexpected CP_LMS_WAIT_CPU metric subtype %d"), 152 st); 153 abbr = dbe_strdup (NTXT ("??")); 154 } 155 break; 156 157 case CP_LMS_USER_LOCK: 158 abbr_unit = dbe_strdup (GTXT ("sec.")); 159 if (st == EXCLUSIVE) 160 { 161 name = dbe_strdup (GTXT ("Exclusive User Lock Time")); 162 abbr = dbe_strdup (GTXT ("Excl. User Lock")); 163 } 164 else if (st == INCLUSIVE) 165 { 166 name = dbe_strdup (GTXT ("Inclusive User Lock Time")); 167 abbr = dbe_strdup (GTXT ("Incl. User Lock")); 168 } 169 else if (st == ATTRIBUTED) 170 { 171 name = dbe_strdup (GTXT ("Attributed User Lock Time")); 172 abbr = dbe_strdup (GTXT ("Attr. User Lock")); 173 } 174 else 175 { 176 name = dbe_sprintf (GTXT ("Unexpected CP_LMS_USER_LOCK metric subtype %d"), 177 st); 178 abbr = dbe_strdup (NTXT ("??")); 179 } 180 break; 181 182 case CP_LMS_SYSTEM: 183 abbr_unit = dbe_strdup (GTXT ("sec.")); 184 if (st == EXCLUSIVE) 185 { 186 name = dbe_strdup (GTXT ("Exclusive System CPU Time")); 187 abbr = dbe_strdup (GTXT ("Excl. Sys. CPU")); 188 } 189 else if (st == INCLUSIVE) 190 { 191 name = dbe_strdup (GTXT ("Inclusive System CPU Time")); 192 abbr = dbe_strdup (GTXT ("Incl. Sys. CPU")); 193 } 194 else if (st == ATTRIBUTED) 195 { 196 name = dbe_strdup (GTXT ("Attributed System CPU Time")); 197 abbr = dbe_strdup (GTXT ("Attr. Sys. CPU")); 198 } 199 else 200 { 201 name = dbe_sprintf (GTXT ("Unexpected CP_LMS_SYSTEM metric subtype %d"), 202 st); 203 abbr = dbe_strdup (NTXT ("??")); 204 } 205 break; 206 207 case SYNC_WAIT_TIME: 208 abbr_unit = dbe_strdup (GTXT ("sec.")); 209 if (st == EXCLUSIVE) 210 { 211 name = dbe_strdup (GTXT ("Exclusive Sync Wait Time")); 212 abbr = dbe_strdup (GTXT ("Excl. Sync Wait")); 213 } 214 else if (st == INCLUSIVE) 215 { 216 name = dbe_strdup (GTXT ("Inclusive Sync Wait Time")); 217 abbr = dbe_strdup (GTXT ("Incl. Sync Wait")); 218 } 219 else if (st == ATTRIBUTED) 220 { 221 name = dbe_strdup (GTXT ("Attributed Sync Wait Time")); 222 abbr = dbe_strdup (GTXT ("Attr. Sync Wait")); 223 } 224 else 225 { 226 name = dbe_sprintf (GTXT ("Unexpected LWT metric subtype %d"), st); 227 abbr = dbe_strdup (NTXT ("??")); 228 } 229 break; 230 231 case CP_LMS_TFAULT: 232 abbr_unit = dbe_strdup (GTXT ("sec.")); 233 if (st == EXCLUSIVE) 234 { 235 name = dbe_strdup (GTXT ("Exclusive Text Page Fault Time")); 236 abbr = dbe_strdup (GTXT ("Excl. Text Fault")); 237 } 238 else if (st == INCLUSIVE) 239 { 240 name = dbe_strdup (GTXT ("Inclusive Text Page Fault Time")); 241 abbr = dbe_strdup (GTXT ("Incl. Text Fault")); 242 } 243 else if (st == ATTRIBUTED) 244 { 245 name = dbe_strdup (GTXT ("Attributed Text Page Fault Time")); 246 abbr = dbe_strdup (GTXT ("Attr. Text Fault")); 247 } 248 else 249 { 250 name = dbe_sprintf (GTXT ("Unexpected CP_LMS_TFAULT metric subtype %d"), 251 st); 252 abbr = dbe_strdup (NTXT ("??")); 253 } 254 break; 255 256 case CP_LMS_DFAULT: 257 abbr_unit = dbe_strdup (GTXT ("sec.")); 258 if (st == EXCLUSIVE) 259 { 260 name = dbe_strdup (GTXT ("Exclusive Data Page Fault Time")); 261 abbr = dbe_strdup (GTXT ("Excl. Data Fault")); 262 } 263 else if (st == INCLUSIVE) 264 { 265 name = dbe_strdup (GTXT ("Inclusive Data Page Fault Time")); 266 abbr = dbe_strdup (GTXT ("Incl. Data Fault")); 267 } 268 else if (st == ATTRIBUTED) 269 { 270 name = dbe_strdup (GTXT ("Attributed Data Page Fault Time")); 271 abbr = dbe_strdup (GTXT ("Attr. Data Fault")); 272 } 273 else 274 { 275 name = dbe_sprintf (GTXT ("Unexpected CP_LMS_DFAULT metric subtype %d"), 276 st); 277 abbr = dbe_strdup (NTXT ("??")); 278 } 279 break; 280 281 case CP_KERNEL_CPU: 282 abbr_unit = dbe_strdup (GTXT ("sec.")); 283 if (st == EXCLUSIVE) 284 { 285 name = dbe_strdup (GTXT ("Exclusive Kernel CPU Time")); 286 abbr = dbe_strdup (GTXT ("Excl. Kernel CPU")); 287 } 288 else if (st == INCLUSIVE) 289 { 290 name = dbe_strdup (GTXT ("Inclusive Kernel CPU Time")); 291 abbr = dbe_strdup (GTXT ("Incl. Kernel CPU")); 292 } 293 else if (st == ATTRIBUTED) 294 { 295 name = dbe_strdup (GTXT ("Attributed Kernel CPU Time")); 296 abbr = dbe_strdup (GTXT ("Attr. Kernel CPU")); 297 } 298 else 299 { 300 name = dbe_sprintf (GTXT ("Unexpected CP_KERNEL_CPU metric subtype %d"), 301 st); 302 abbr = dbe_strdup (NTXT ("??")); 303 } 304 break; 305 306 case HWCNTR: 307 { 308 char *sstr, *estr1, *estr2; 309 if (get_hw_ctr () == NULL) 310 abort (); 311 sstr = get_username (); 312 if (st == EXCLUSIVE) 313 { 314 estr1 = GTXT ("Exclusive "); 315 estr2 = GTXT ("Excl. "); 316 } 317 else if (st == INCLUSIVE) 318 { 319 estr1 = GTXT ("Inclusive "); 320 estr2 = GTXT ("Incl. "); 321 } 322 else if (st == ATTRIBUTED) 323 { 324 estr1 = GTXT ("Attributed "); 325 estr2 = GTXT ("Attr. "); 326 } 327 else if (st == DATASPACE) 328 { 329 estr1 = GTXT ("Data-derived "); 330 estr2 = GTXT ("Data. "); 331 } 332 else 333 { 334 estr1 = dbe_sprintf (GTXT ("Unexpected hwc %s metric subtype %d"), 335 get_aux (), st); 336 estr2 = dbe_strdup (NTXT ("??")); 337 } 338 name = dbe_sprintf (NTXT ("%s%s"), estr1, sstr); 339 abbr = dbe_sprintf (NTXT ("%s%s"), estr2, sstr); 340 break; 341 } 342 343 case DERIVED: 344 { 345 switch (st) 346 { 347 case EXCLUSIVE: 348 name = dbe_sprintf (GTXT ("Exclusive %s"), get_username ()); 349 abbr = dbe_sprintf (GTXT ("Excl. %s"), get_cmd ()); 350 break; 351 case INCLUSIVE: 352 name = dbe_sprintf (GTXT ("Inclusive %s"), get_username ()); 353 abbr = dbe_sprintf (GTXT ("Incl. %s"), get_cmd ()); 354 break; 355 case ATTRIBUTED: 356 name = dbe_sprintf (GTXT ("Attributed %s"), get_username ()); 357 abbr = dbe_sprintf (GTXT ("Attr. %s"), get_cmd ()); 358 break; 359 default: 360 name = dbe_sprintf (GTXT ("Unexpected derived %s metric subtype %d"), 361 get_username (), st); 362 abbr = dbe_strdup (NTXT ("??")); 363 break; 364 } 365 break; 366 } 367 368 case OMP_MASTER_THREAD: 369 abbr_unit = dbe_strdup (GTXT ("sec.")); 370 if (st == EXCLUSIVE) 371 { 372 name = dbe_strdup (GTXT ("Exclusive Master Thread Time")); 373 abbr = dbe_strdup (GTXT ("Excl. Master Thread")); 374 } 375 else if (st == INCLUSIVE) 376 { 377 name = dbe_strdup (GTXT ("Inclusive Master Thread Time")); 378 abbr = dbe_strdup (GTXT ("Incl. Master Thread")); 379 } 380 else if (st == ATTRIBUTED) 381 { 382 name = dbe_strdup (GTXT ("Attributed Master Thread Time")); 383 abbr = dbe_strdup (GTXT ("Attr. Master Thread")); 384 } 385 else 386 { 387 name = dbe_sprintf (GTXT ("Unexpected Master Thread metric subtype %d"), 388 st); 389 abbr = dbe_strdup (NTXT ("??")); 390 } 391 break; 392 393 case CP_TOTAL: 394 abbr_unit = dbe_strdup (GTXT ("sec.")); 395 if (st == EXCLUSIVE) 396 { 397 name = dbe_strdup (GTXT ("Exclusive Total Thread Time")); 398 abbr = dbe_strdup (GTXT ("Excl. Total Thread")); 399 } 400 else if (st == INCLUSIVE) 401 { 402 name = dbe_strdup (GTXT ("Inclusive Total Thread Time")); 403 abbr = dbe_strdup (GTXT ("Incl. Total Thread")); 404 } 405 else if (st == ATTRIBUTED) 406 { 407 name = dbe_strdup (GTXT ("Attributed Total Thread Time")); 408 abbr = dbe_strdup (GTXT ("Attr. Total Thread")); 409 } 410 else 411 { 412 name = dbe_sprintf (GTXT ("Unexpected TOTAL metric subtype %d"), st); 413 abbr = dbe_strdup (NTXT ("??")); 414 } 415 break; 416 417 case SYNC_WAIT_COUNT: 418 if (st == EXCLUSIVE) 419 { 420 name = dbe_strdup (GTXT ("Exclusive Sync Wait Count")); 421 abbr = dbe_strdup (GTXT ("Excl. Sync Wait Count")); 422 } 423 else if (st == INCLUSIVE) 424 { 425 name = dbe_strdup (GTXT ("Inclusive Sync Wait Count")); 426 abbr = dbe_strdup (GTXT ("Incl. Sync Wait Count")); 427 } 428 else if (st == ATTRIBUTED) 429 { 430 name = dbe_strdup (GTXT ("Attributed Sync Wait Count")); 431 abbr = dbe_strdup (GTXT ("Attr. Sync Wait Count")); 432 } 433 else 434 { 435 name = dbe_sprintf (GTXT ("Unexpected LWCNT metric subtype %d"), st); 436 abbr = dbe_strdup (NTXT ("??")); 437 } 438 break; 439 440 case CP_TOTAL_CPU: 441 abbr_unit = dbe_strdup (GTXT ("sec.")); 442 if (st == EXCLUSIVE) 443 { 444 name = dbe_strdup (GTXT ("Exclusive Total CPU Time")); 445 abbr = dbe_strdup (GTXT ("Excl. Total CPU")); 446 } 447 else if (st == INCLUSIVE) 448 { 449 name = dbe_strdup (GTXT ("Inclusive Total CPU Time")); 450 abbr = dbe_strdup (GTXT ("Incl. Total CPU")); 451 } 452 else if (st == ATTRIBUTED) 453 { 454 name = dbe_strdup (GTXT ("Attributed Total CPU Time")); 455 abbr = dbe_strdup (GTXT ("Attr. Total CPU")); 456 } 457 else 458 { 459 name = dbe_sprintf (GTXT ("Unexpected TOTAL_CPU metric subtype %d"), 460 st); 461 abbr = dbe_strdup (NTXT ("??")); 462 } 463 break; 464 case CP_LMS_TRAP: 465 abbr_unit = dbe_strdup (GTXT ("sec.")); 466 if (st == EXCLUSIVE) 467 { 468 name = dbe_strdup (GTXT ("Exclusive Trap CPU Time")); 469 abbr = dbe_strdup (GTXT ("Excl. Trap CPU")); 470 } 471 else if (st == INCLUSIVE) 472 { 473 name = dbe_strdup (GTXT ("Inclusive Trap CPU Time")); 474 abbr = dbe_strdup (GTXT ("Incl. Trap CPU")); 475 } 476 else if (st == ATTRIBUTED) 477 { 478 name = dbe_strdup (GTXT ("Attributed Trap CPU Time")); 479 abbr = dbe_strdup (GTXT ("Attr. Trap CPU")); 480 } 481 else 482 { 483 name = dbe_sprintf (GTXT ("Unexpected CP_LMS_TRAP metric subtype %d"), 484 st); 485 abbr = dbe_strdup (NTXT ("??")); 486 } 487 break; 488 489 case CP_LMS_KFAULT: 490 abbr_unit = dbe_strdup (GTXT ("sec.")); 491 if (st == EXCLUSIVE) 492 { 493 name = dbe_strdup (GTXT ("Exclusive Kernel Page Fault Time")); 494 abbr = dbe_strdup (GTXT ("Excl. Kernel Page Fault")); 495 } 496 else if (st == INCLUSIVE) 497 { 498 name = dbe_strdup (GTXT ("Inclusive Kernel Page Fault Time")); 499 abbr = dbe_strdup (GTXT ("Incl. Kernel Page Fault")); 500 } 501 else if (st == ATTRIBUTED) 502 { 503 name = dbe_strdup (GTXT ("Attributed Kernel Page Fault Time")); 504 abbr = dbe_strdup (GTXT ("Attr. Kernel Page Fault")); 505 } 506 else 507 { 508 name = dbe_sprintf (GTXT ("Unexpected CP_LMS_KFAULT metric subtype %d"), 509 st); 510 abbr = dbe_strdup (NTXT ("??")); 511 } 512 break; 513 514 case CP_LMS_SLEEP: 515 abbr_unit = dbe_strdup (GTXT ("sec.")); 516 if (st == EXCLUSIVE) 517 { 518 name = dbe_strdup (GTXT ("Exclusive Sleep Time")); 519 abbr = dbe_strdup (GTXT ("Excl. Sleep")); 520 } 521 else if (st == INCLUSIVE) 522 { 523 name = dbe_strdup (GTXT ("Inclusive Sleep Time")); 524 abbr = dbe_strdup (GTXT ("Incl. Sleep")); 525 } 526 else if (st == ATTRIBUTED) 527 { 528 name = dbe_strdup (GTXT ("Attributed Sleep Time")); 529 abbr = dbe_strdup (GTXT ("Attr. Sleep")); 530 } 531 else 532 { 533 name = dbe_sprintf (GTXT ("Unexpected CP_LMS_SLEEP metric subtype %d"), 534 st); 535 abbr = dbe_strdup (NTXT ("??")); 536 } 537 break; 538 539 case CP_LMS_STOPPED: 540 abbr_unit = dbe_strdup (GTXT ("sec.")); 541 if (st == EXCLUSIVE) 542 { 543 name = dbe_strdup (GTXT ("Exclusive Stopped Time")); 544 abbr = dbe_strdup (GTXT ("Excl. Stopped")); 545 } 546 else if (st == INCLUSIVE) 547 { 548 name = dbe_strdup (GTXT ("Inclusive Stopped Time")); 549 abbr = dbe_strdup (GTXT ("Incl. Stopped")); 550 } 551 else if (st == ATTRIBUTED) 552 { 553 name = dbe_strdup (GTXT ("Attributed Stopped Time")); 554 abbr = dbe_strdup (GTXT ("Attr. Stopped")); 555 } 556 else 557 { 558 name = dbe_sprintf (GTXT ("Unexpected CP_LMS_STOPPED metric subtype %d"), 559 st); 560 abbr = dbe_strdup (NTXT ("??")); 561 } 562 break; 563 564 case HEAP_ALLOC_BYTES: 565 if (st == EXCLUSIVE) 566 { 567 name = dbe_strdup (GTXT ("Exclusive Bytes Allocated")); 568 abbr = dbe_strdup (GTXT ("Excl. Bytes Allocated")); 569 } 570 else if (st == INCLUSIVE) 571 { 572 name = dbe_strdup (GTXT ("Inclusive Bytes Allocated")); 573 abbr = dbe_strdup (GTXT ("Incl. Bytes Allocated")); 574 } 575 else if (st == ATTRIBUTED) 576 { 577 name = dbe_strdup (GTXT ("Attributed Bytes Allocated")); 578 abbr = dbe_strdup (GTXT ("Attr. Bytes Allocated")); 579 } 580 else 581 { 582 name = dbe_sprintf (GTXT ("Unexpected BYTES_MALLOCD metric subtype %d"), 583 st); 584 abbr = dbe_strdup (NTXT ("??")); 585 } 586 break; 587 588 case HEAP_ALLOC_CNT: 589 if (st == EXCLUSIVE) 590 { 591 name = dbe_strdup (GTXT ("Exclusive Allocations")); 592 abbr = dbe_strdup (GTXT ("Excl. Allocations")); 593 } 594 else if (st == INCLUSIVE) 595 { 596 name = dbe_strdup (GTXT ("Inclusive Allocations")); 597 abbr = dbe_strdup (GTXT ("Incl. Allocations")); 598 } 599 else if (st == ATTRIBUTED) 600 { 601 name = dbe_strdup (GTXT ("Attributed Allocations")); 602 abbr = dbe_strdup (GTXT ("Attr. Allocations")); 603 } 604 else 605 { 606 name = dbe_sprintf (GTXT ("Unexpected MALLOCS metric subtype %d"), st); 607 abbr = dbe_strdup (NTXT ("??")); 608 } 609 break; 610 611 case HEAP_LEAK_BYTES: 612 if (st == EXCLUSIVE) 613 { 614 name = dbe_strdup (GTXT ("Exclusive Bytes Leaked")); 615 abbr = dbe_strdup (GTXT ("Excl. Bytes Leaked")); 616 } 617 else if (st == INCLUSIVE) 618 { 619 name = dbe_strdup (GTXT ("Inclusive Bytes Leaked")); 620 abbr = dbe_strdup (GTXT ("Incl. Bytes Leaked")); 621 } 622 else if (st == ATTRIBUTED) 623 { 624 name = dbe_strdup (GTXT ("Attributed Bytes Leaked")); 625 abbr = dbe_strdup (GTXT ("Attr. Bytes Leaked")); 626 } 627 else 628 { 629 name = dbe_sprintf (GTXT ("Unexpected BYTES_LEAKED metric subtype %d"), 630 st); 631 abbr = dbe_strdup (NTXT ("??")); 632 } 633 break; 634 635 case HEAP_LEAK_CNT: 636 if (st == EXCLUSIVE) 637 { 638 name = dbe_strdup (GTXT ("Exclusive Leaks")); 639 abbr = dbe_strdup (GTXT ("Excl. Leaks")); 640 } 641 else if (st == INCLUSIVE) 642 { 643 name = dbe_strdup (GTXT ("Inclusive Leaks")); 644 abbr = dbe_strdup (GTXT ("Incl. Leaks")); 645 } 646 else if (st == ATTRIBUTED) 647 { 648 name = dbe_strdup (GTXT ("Attributed Leaks")); 649 abbr = dbe_strdup (GTXT ("Attr. Leaks")); 650 } 651 else 652 { 653 name = dbe_sprintf (GTXT ("Unexpected LEAKS metric subtype %d"), st); 654 abbr = dbe_strdup (NTXT ("??")); 655 } 656 break; 657 658 case IO_READ_BYTES: 659 if (st == EXCLUSIVE) 660 { 661 name = dbe_strdup (GTXT ("Exclusive Read Bytes")); 662 abbr = dbe_strdup (GTXT ("Excl. Read Bytes")); 663 } 664 else if (st == INCLUSIVE) 665 { 666 name = dbe_strdup (GTXT ("Inclusive Read Bytes")); 667 abbr = dbe_strdup (GTXT ("Incl. Read Bytes")); 668 } 669 else if (st == ATTRIBUTED) 670 { 671 name = dbe_strdup (GTXT ("Attributed Read Bytes")); 672 abbr = dbe_strdup (GTXT ("Attr. Read Bytes")); 673 } 674 else 675 { 676 name = dbe_sprintf (GTXT ("Unexpected READ_BYTES metric subtype %d"), st); 677 abbr = dbe_strdup (NTXT ("??")); 678 } 679 break; 680 681 case IO_WRITE_BYTES: 682 if (st == EXCLUSIVE) 683 { 684 name = dbe_strdup (GTXT ("Exclusive Write Bytes")); 685 abbr = dbe_strdup (GTXT ("Excl. Write Bytes")); 686 } 687 else if (st == INCLUSIVE) 688 { 689 name = dbe_strdup (GTXT ("Inclusive Write Bytes")); 690 abbr = dbe_strdup (GTXT ("Incl. Write Bytes")); 691 } 692 else if (st == ATTRIBUTED) 693 { 694 name = dbe_strdup (GTXT ("Attributed Write Bytes")); 695 abbr = dbe_strdup (GTXT ("Attr. Write Bytes")); 696 } 697 else 698 { 699 name = dbe_sprintf (GTXT ("Unexpected WRITE_BYTES metric subtype %d"), st); 700 abbr = dbe_strdup (NTXT ("??")); 701 } 702 break; 703 704 case IO_READ_CNT: 705 if (st == EXCLUSIVE) 706 { 707 name = dbe_strdup (GTXT ("Exclusive Read Count")); 708 abbr = dbe_strdup (GTXT ("Excl. Read Count")); 709 } 710 else if (st == INCLUSIVE) 711 { 712 name = dbe_strdup (GTXT ("Inclusive Read Count")); 713 abbr = dbe_strdup (GTXT ("Incl. Read Count")); 714 } 715 else if (st == ATTRIBUTED) 716 { 717 name = dbe_strdup (GTXT ("Attributed Read Count")); 718 abbr = dbe_strdup (GTXT ("Attr. Read Count")); 719 } 720 else 721 { 722 name = dbe_sprintf (GTXT ("Unexpected READCNT metric subtype %d"), st); 723 abbr = dbe_strdup (NTXT ("??")); 724 } 725 break; 726 727 case IO_WRITE_CNT: 728 if (st == EXCLUSIVE) 729 { 730 name = dbe_strdup (GTXT ("Exclusive Write Count")); 731 abbr = dbe_strdup (GTXT ("Excl. Write Count")); 732 } 733 else if (st == INCLUSIVE) 734 { 735 name = dbe_strdup (GTXT ("Inclusive Write Count")); 736 abbr = dbe_strdup (GTXT ("Incl. Write Count")); 737 } 738 else if (st == ATTRIBUTED) 739 { 740 name = dbe_strdup (GTXT ("Attributed Write Count")); 741 abbr = dbe_strdup (GTXT ("Attr. Write Count")); 742 } 743 else 744 { 745 name = dbe_sprintf (GTXT ("Unexpected WRITECNT metric subtype %d"), st); 746 abbr = dbe_strdup (NTXT ("??")); 747 } 748 break; 749 750 case IO_OTHER_CNT: 751 if (st == EXCLUSIVE) 752 { 753 name = dbe_strdup (GTXT ("Exclusive Other I/O Count")); 754 abbr = dbe_strdup (GTXT ("Excl. Other I/O Count")); 755 } 756 else if (st == INCLUSIVE) 757 { 758 name = dbe_strdup (GTXT ("Inclusive Other I/O Count")); 759 abbr = dbe_strdup (GTXT ("Incl. Other I/O Count")); 760 } 761 else if (st == ATTRIBUTED) 762 { 763 name = dbe_strdup (GTXT ("Attributed Other I/O Count")); 764 abbr = dbe_strdup (GTXT ("Attr. Other I/O Count")); 765 } 766 else 767 { 768 name = dbe_sprintf (GTXT ("Unexpected OTHERIOCNT metric subtype %d"), st); 769 abbr = dbe_strdup (NTXT ("??")); 770 } 771 break; 772 773 case IO_ERROR_CNT: 774 if (st == EXCLUSIVE) 775 { 776 name = dbe_strdup (GTXT ("Exclusive I/O Error Count")); 777 abbr = dbe_strdup (GTXT ("Excl. I/O Error Count")); 778 } 779 else if (st == INCLUSIVE) 780 { 781 name = dbe_strdup (GTXT ("Inclusive I/O Error Count")); 782 abbr = dbe_strdup (GTXT ("Incl. I/O Error Count")); 783 } 784 else if (st == ATTRIBUTED) 785 { 786 name = dbe_strdup (GTXT ("Attributed I/O Error Count")); 787 abbr = dbe_strdup (GTXT ("Attr. I/O Error Count")); 788 } 789 else 790 { 791 name = dbe_sprintf (GTXT ("Unexpected IOERRORCNT metric subtype %d"), st); 792 abbr = dbe_strdup (NTXT ("??")); 793 } 794 break; 795 796 case IO_READ_TIME: 797 abbr_unit = dbe_strdup (GTXT ("sec.")); 798 if (st == EXCLUSIVE) 799 { 800 name = dbe_strdup (GTXT ("Exclusive Read Time")); 801 abbr = dbe_strdup (GTXT ("Excl. Read Time")); 802 } 803 else if (st == INCLUSIVE) 804 { 805 name = dbe_strdup (GTXT ("Inclusive Read Time")); 806 abbr = dbe_strdup (GTXT ("Incl. Read Time")); 807 } 808 else if (st == ATTRIBUTED) 809 { 810 name = dbe_strdup (GTXT ("Attributed Read Time")); 811 abbr = dbe_strdup (GTXT ("Attr. Read Time")); 812 } 813 else 814 { 815 name = dbe_sprintf (GTXT ("Unexpected READ_TIME metric subtype %d"), st); 816 abbr = dbe_strdup (NTXT ("??")); 817 } 818 break; 819 820 case IO_WRITE_TIME: 821 abbr_unit = dbe_strdup (GTXT ("sec.")); 822 if (st == EXCLUSIVE) 823 { 824 name = dbe_strdup (GTXT ("Exclusive Write Time")); 825 abbr = dbe_strdup (GTXT ("Excl. Write Time")); 826 } 827 else if (st == INCLUSIVE) 828 { 829 name = dbe_strdup (GTXT ("Inclusive Write Time")); 830 abbr = dbe_strdup (GTXT ("Incl. Write Time")); 831 } 832 else if (st == ATTRIBUTED) 833 { 834 name = dbe_strdup (GTXT ("Attributed Write Time")); 835 abbr = dbe_strdup (GTXT ("Attr. Write Time")); 836 } 837 else 838 { 839 name = dbe_sprintf (GTXT ("Unexpected WRITE_TIME metric subtype %d"), st); 840 abbr = dbe_strdup (NTXT ("??")); 841 } 842 break; 843 844 case IO_OTHER_TIME: 845 abbr_unit = dbe_strdup (GTXT ("sec.")); 846 if (st == EXCLUSIVE) 847 { 848 name = dbe_strdup (GTXT ("Exclusive Other I/O Time")); 849 abbr = dbe_strdup (GTXT ("Excl. Other I/O Time")); 850 } 851 else if (st == INCLUSIVE) 852 { 853 name = dbe_strdup (GTXT ("Inclusive Other I/O Time")); 854 abbr = dbe_strdup (GTXT ("Incl. Other I/O Time")); 855 } 856 else if (st == ATTRIBUTED) 857 { 858 name = dbe_strdup (GTXT ("Attributed Other I/O Time")); 859 abbr = dbe_strdup (GTXT ("Attr. Other I/O Time")); 860 } 861 else 862 { 863 name = dbe_sprintf (GTXT ("Unexpected OTHERIO_TIME metric subtype %d"), st); 864 abbr = dbe_strdup (NTXT ("??")); 865 } 866 break; 867 868 case IO_ERROR_TIME: 869 abbr_unit = dbe_strdup (GTXT ("sec.")); 870 if (st == EXCLUSIVE) 871 { 872 name = dbe_strdup (GTXT ("Exclusive I/O Error Time")); 873 abbr = dbe_strdup (GTXT ("Excl. I/O Error Time")); 874 } 875 else if (st == INCLUSIVE) 876 { 877 name = dbe_strdup (GTXT ("Inclusive I/O Error Time")); 878 abbr = dbe_strdup (GTXT ("Incl. I/O Error Time")); 879 } 880 else if (st == ATTRIBUTED) 881 { 882 name = dbe_strdup (GTXT ("Attributed I/O Error Time")); 883 abbr = dbe_strdup (GTXT ("Attr. I/O Error Time")); 884 } 885 else 886 { 887 name = dbe_sprintf (GTXT ("Unexpected IOERROR_TIME metric subtype %d"), st); 888 abbr = dbe_strdup (NTXT ("??")); 889 } 890 break; 891 892 case SIZES: 893 name = dbe_strdup (GTXT ("Size")); 894 abbr = dbe_strdup (GTXT ("Size")); 895 abbr_unit = dbe_strdup (GTXT ("bytes")); 896 break; 897 898 case ADDRESS: 899 name = dbe_strdup (GTXT ("PC Address")); 900 abbr = dbe_strdup (GTXT ("PC Addr.")); 901 break; 902 903 case ONAME: 904 name = dbe_strdup (GTXT ("Name")); 905 abbr = dbe_strdup (GTXT ("Name")); 906 break; 907 908 case OMP_NONE: 909 abbr_unit = dbe_strdup (GTXT ("sec.")); 910 if (st == EXCLUSIVE) 911 { 912 name = dbe_strdup (GTXT ("Exclusive Non-OpenMP Time")); 913 abbr = dbe_strdup (GTXT ("Excl. Non-OMP")); 914 } 915 else if (st == INCLUSIVE) 916 { 917 name = dbe_strdup (GTXT ("Inclusive Non-OpenMP Time")); 918 abbr = dbe_strdup (GTXT ("Incl. Non-OMP")); 919 } 920 else if (st == ATTRIBUTED) 921 { 922 name = dbe_strdup (GTXT ("Attributed Non-OpenMP Time")); 923 abbr = dbe_strdup (GTXT ("Attr. Non-OMP")); 924 } 925 else 926 { 927 name = dbe_sprintf (GTXT ("Unexpected Non-OpenMP metric subtype %d"), st); 928 abbr = dbe_strdup (NTXT ("??")); 929 } 930 break; 931 case OMP_OVHD: 932 abbr_unit = dbe_strdup (GTXT ("sec.")); 933 if (st == EXCLUSIVE) 934 { 935 name = dbe_strdup (GTXT ("Exclusive OpenMP Overhead Time")); 936 abbr = dbe_strdup (GTXT ("Excl. OMP ovhd.")); 937 } 938 else if (st == INCLUSIVE) 939 { 940 name = dbe_strdup (GTXT ("Inclusive OpenMP Overhead Time")); 941 abbr = dbe_strdup (GTXT ("Incl. OMP ovhd.")); 942 } 943 else if (st == ATTRIBUTED) 944 { 945 name = dbe_strdup (GTXT ("Attributed OpenMP Overhead Time")); 946 abbr = dbe_strdup (GTXT ("Attr. OMP ovhd.")); 947 } 948 else 949 { 950 name = dbe_sprintf (GTXT ("Unexpected OpenMP Overhead metric subtype %d"), st); 951 abbr = dbe_strdup (NTXT ("??")); 952 } 953 break; 954 case OMP_WORK: 955 abbr_unit = dbe_strdup (GTXT ("sec.")); 956 if (st == EXCLUSIVE) 957 { 958 name = dbe_strdup (GTXT ("Exclusive OpenMP Work Time")); 959 abbr = dbe_strdup (GTXT ("Excl. OMP Work")); 960 } 961 else if (st == INCLUSIVE) 962 { 963 name = dbe_strdup (GTXT ("Inclusive OpenMP Work Time")); 964 abbr = dbe_strdup (GTXT ("Incl. OMP Work")); 965 } 966 else if (st == ATTRIBUTED) 967 { 968 name = dbe_strdup (GTXT ("Attributed OpenMP Work Time")); 969 abbr = dbe_strdup (GTXT ("Attr. OMP Work")); 970 } 971 else 972 { 973 name = dbe_sprintf (GTXT ("Unexpected OpenMP Work metric subtype %d"), st); 974 abbr = dbe_strdup (NTXT ("??")); 975 } 976 break; 977 case OMP_IBAR: 978 abbr_unit = dbe_strdup (GTXT ("sec.")); 979 if (st == EXCLUSIVE) 980 { 981 name = dbe_strdup (GTXT ("Exclusive OpenMP Implicit Barrier Time")); 982 abbr = dbe_strdup (GTXT ("Excl. OMP i-barr.")); 983 } 984 else if (st == INCLUSIVE) 985 { 986 name = dbe_strdup (GTXT ("Inclusive OpenMP Implicit Barrier Time")); 987 abbr = dbe_strdup (GTXT ("Incl. OMP i-barr.")); 988 } 989 else if (st == ATTRIBUTED) 990 { 991 name = dbe_strdup (GTXT ("Attributed OpenMP Implicit Barrier Time")); 992 abbr = dbe_strdup (GTXT ("Attr. OMP i-barr.")); 993 } 994 else 995 { 996 name = dbe_sprintf (GTXT ("Unexpected OpenMP Implicit Barrier metric subtype %d"), st); 997 abbr = dbe_strdup (NTXT ("??")); 998 } 999 break; 1000 case OMP_EBAR: 1001 abbr_unit = dbe_strdup (GTXT ("sec.")); 1002 if (st == EXCLUSIVE) 1003 { 1004 name = dbe_strdup (GTXT ("Exclusive OpenMP Explicit Barrier Time")); 1005 abbr = dbe_strdup (GTXT ("Excl. OMP e-barr.")); 1006 } 1007 else if (st == INCLUSIVE) 1008 { 1009 name = dbe_strdup (GTXT ("Inclusive OpenMP Explicit Barrier Time")); 1010 abbr = dbe_strdup (GTXT ("Incl. OMP e-barr.")); 1011 } 1012 else if (st == ATTRIBUTED) 1013 { 1014 name = dbe_strdup (GTXT ("Attributed OpenMP Explicit Barrier Time")); 1015 abbr = dbe_strdup (GTXT ("Attr. OMP e-barr.")); 1016 } 1017 else 1018 { 1019 name = dbe_sprintf (GTXT ("Unexpected OpenMP Explicit Barrier metric subtype %d"), st); 1020 abbr = dbe_strdup (NTXT ("??")); 1021 } 1022 break; 1023 case OMP_WAIT: 1024 abbr_unit = dbe_strdup (GTXT ("sec.")); 1025 if (st == EXCLUSIVE) 1026 { 1027 name = dbe_strdup (GTXT ("Exclusive OpenMP Wait Time")); 1028 abbr = dbe_strdup (GTXT ("Excl. OMP Wait")); 1029 } 1030 else if (st == INCLUSIVE) 1031 { 1032 name = dbe_strdup (GTXT ("Inclusive OpenMP Wait Time")); 1033 abbr = dbe_strdup (GTXT ("Incl. OMP Wait")); 1034 } 1035 else if (st == ATTRIBUTED) 1036 { 1037 name = dbe_strdup (GTXT ("Attributed OpenMP Wait Time")); 1038 abbr = dbe_strdup (GTXT ("Attr. OMP Wait")); 1039 } 1040 else 1041 { 1042 name = dbe_sprintf (GTXT ("Unexpected OpenMP Wait metric subtype %d"), st); 1043 abbr = dbe_strdup (NTXT ("??")); 1044 } 1045 break; 1046 case OMP_SERL: 1047 abbr_unit = dbe_strdup (GTXT ("sec.")); 1048 if (st == EXCLUSIVE) 1049 { 1050 name = dbe_strdup (GTXT ("Exclusive OpenMP Serial Time")); 1051 abbr = dbe_strdup (GTXT ("Excl. OMP serl")); 1052 } 1053 else if (st == INCLUSIVE) 1054 { 1055 name = dbe_strdup (GTXT ("Inclusive OpenMP Serial Time")); 1056 abbr = dbe_strdup (GTXT ("Incl. OMP serl")); 1057 } 1058 else if (st == ATTRIBUTED) 1059 { 1060 name = dbe_strdup (GTXT ("Attributed OpenMP Serial Time")); 1061 abbr = dbe_strdup (GTXT ("Attr. OMP serl")); 1062 } 1063 else 1064 { 1065 name = dbe_sprintf (GTXT ("Unexpected OpenMP Slave Idle metric subtype %d"), st); 1066 abbr = dbe_strdup (NTXT ("??")); 1067 } 1068 break; 1069 case OMP_RDUC: 1070 abbr_unit = dbe_strdup (GTXT ("sec.")); 1071 if (st == EXCLUSIVE) 1072 { 1073 name = dbe_strdup (GTXT ("Exclusive OpenMP Reduction Time")); 1074 abbr = dbe_strdup (GTXT ("Excl. OMP rduc")); 1075 } 1076 else if (st == INCLUSIVE) 1077 { 1078 name = dbe_strdup (GTXT ("Inclusive OpenMP Reduction Time")); 1079 abbr = dbe_strdup (GTXT ("Incl. OMP rduc")); 1080 } 1081 else if (st == ATTRIBUTED) 1082 { 1083 name = dbe_strdup (GTXT ("Attributed OpenMP Reduction Time")); 1084 abbr = dbe_strdup (GTXT ("Attr. OMP rduc")); 1085 } 1086 else 1087 { 1088 name = dbe_sprintf (GTXT ("Unexpected OpenMP Reduction metric subtype %d"), st); 1089 abbr = dbe_strdup (NTXT ("??")); 1090 } 1091 break; 1092 case OMP_LKWT: 1093 abbr_unit = dbe_strdup (GTXT ("sec.")); 1094 if (st == EXCLUSIVE) 1095 { 1096 name = dbe_strdup (GTXT ("Exclusive OpenMP Lock Wait Time")); 1097 abbr = dbe_strdup (GTXT ("Excl. OMP lkwt")); 1098 } 1099 else if (st == INCLUSIVE) 1100 { 1101 name = dbe_strdup (GTXT ("Inclusive OpenMP Lock Wait Time")); 1102 abbr = dbe_strdup (GTXT ("Incl. OMP lkwt")); 1103 } 1104 else if (st == ATTRIBUTED) 1105 { 1106 name = dbe_strdup (GTXT ("Attributed OpenMP Lock Wait Time")); 1107 abbr = dbe_strdup (GTXT ("Attr. OMP lkwt")); 1108 } 1109 else 1110 { 1111 name = dbe_sprintf (GTXT ("Unexpected OpenMP Lock Wait metric subtype %d"), st); 1112 abbr = dbe_strdup (NTXT ("??")); 1113 } 1114 break; 1115 case OMP_CTWT: 1116 abbr_unit = dbe_strdup (GTXT ("sec.")); 1117 if (st == EXCLUSIVE) 1118 { 1119 name = dbe_strdup (GTXT ("Exclusive OpenMP Critical Section Wait Time")); 1120 abbr = dbe_strdup (GTXT ("Excl. OMP ctwt")); 1121 } 1122 else if (st == INCLUSIVE) 1123 { 1124 name = dbe_strdup (GTXT ("Inclusive OpenMP Critical Section Wait Time")); 1125 abbr = dbe_strdup (GTXT ("Incl. OMP ctwt")); 1126 } 1127 else if (st == ATTRIBUTED) 1128 { 1129 name = dbe_strdup (GTXT ("Attributed OpenMP Critical Section Wait Time")); 1130 abbr = dbe_strdup (GTXT ("Attr. OMP ctwt")); 1131 } 1132 else 1133 { 1134 name = dbe_sprintf (GTXT ("Unexpected OpenMP Critical Section Wait metric subtype %d"), st); 1135 abbr = dbe_strdup (NTXT ("??")); 1136 } 1137 break; 1138 case OMP_ODWT: 1139 abbr_unit = dbe_strdup (GTXT ("sec.")); 1140 if (st == EXCLUSIVE) 1141 { 1142 name = dbe_strdup (GTXT ("Exclusive OpenMP Ordered Section Wait Time")); 1143 abbr = dbe_strdup (GTXT ("Excl. OMP odwt")); 1144 } 1145 else if (st == INCLUSIVE) 1146 { 1147 name = dbe_strdup (GTXT ("Inclusive OpenMP Ordered Section Wait Time")); 1148 abbr = dbe_strdup (GTXT ("Incl. OMP odwt")); 1149 } 1150 else if (st == ATTRIBUTED) 1151 { 1152 name = dbe_strdup (GTXT ("Attributed OpenMP Ordered Section Wait Time")); 1153 abbr = dbe_strdup (GTXT ("Attr. OMP odwt")); 1154 } 1155 else 1156 { 1157 name = dbe_sprintf (GTXT ("Unexpected OpenMP Ordered Section Wait metric subtype %d"), st); 1158 abbr = dbe_strdup (NTXT ("??")); 1159 } 1160 break; 1161 case OMP_MSTR: 1162 abbr_unit = dbe_strdup (GTXT ("sec.")); 1163 if (st == EXCLUSIVE) 1164 { 1165 name = dbe_strdup (GTXT ("Exclusive OpenMP Master Serial Time")); 1166 abbr = dbe_strdup (GTXT ("Excl. OMP ser.")); 1167 } 1168 else if (st == INCLUSIVE) 1169 { 1170 name = dbe_strdup (GTXT ("Inclusive OpenMP Master Serial Time")); 1171 abbr = dbe_strdup (GTXT ("Incl. OMP ser.")); 1172 } 1173 else if (st == ATTRIBUTED) 1174 { 1175 name = dbe_strdup (GTXT ("Attributed OpenMP Master Serial Time")); 1176 abbr = dbe_strdup (GTXT ("Attr. OMP ser.")); 1177 } 1178 else 1179 { 1180 name = dbe_sprintf (GTXT ("Unexpected OpenMP Master Serial metric subtype %d"), st); 1181 abbr = dbe_strdup (NTXT ("??")); 1182 } 1183 break; 1184 case OMP_SNGL: 1185 abbr_unit = dbe_strdup (GTXT ("sec.")); 1186 if (st == EXCLUSIVE) 1187 { 1188 name = dbe_strdup (GTXT ("Exclusive OpenMP Single Region Time")); 1189 abbr = dbe_strdup (GTXT ("Excl. OMP sngl")); 1190 } 1191 else if (st == INCLUSIVE) 1192 { 1193 name = dbe_strdup (GTXT ("Inclusive OpenMP Single Region Time")); 1194 abbr = dbe_strdup (GTXT ("Incl. OMP sngl")); 1195 } 1196 else if (st == ATTRIBUTED) 1197 { 1198 name = dbe_strdup (GTXT ("Attributed OpenMP Single Region Time")); 1199 abbr = dbe_strdup (GTXT ("Attr. OMP sngl")); 1200 } 1201 else 1202 { 1203 name = dbe_sprintf (GTXT ("Unexpected OpenMP Single Region metric subtype %d"), st); 1204 abbr = dbe_strdup (NTXT ("??")); 1205 } 1206 break; 1207 case OMP_ORDD: 1208 abbr_unit = dbe_strdup (GTXT ("sec.")); 1209 if (st == EXCLUSIVE) 1210 { 1211 name = dbe_strdup (GTXT ("Exclusive OpenMP Ordered Region Time")); 1212 abbr = dbe_strdup (GTXT ("Excl. OMP ordd")); 1213 } 1214 else if (st == INCLUSIVE) 1215 { 1216 name = dbe_strdup (GTXT ("Inclusive OpenMP Ordered Region Time")); 1217 abbr = dbe_strdup (GTXT ("Incl. OMP ordd")); 1218 } 1219 else if (st == ATTRIBUTED) 1220 { 1221 name = dbe_strdup (GTXT ("Attributed OpenMP Ordered Region Time")); 1222 abbr = dbe_strdup (GTXT ("Attr. OMP ordd")); 1223 } 1224 else 1225 { 1226 name = dbe_sprintf (GTXT ("Unexpected OpenMP Ordered Region metric subtype %d"), st); 1227 abbr = dbe_strdup (NTXT ("??")); 1228 } 1229 break; 1230 case RACCESS: 1231 if (st == EXCLUSIVE) 1232 { 1233 name = dbe_strdup (GTXT ("Exclusive Race Accesses")); 1234 abbr = dbe_strdup (GTXT ("Excl. Race Accesses")); 1235 } 1236 else if (st == INCLUSIVE) 1237 { 1238 name = dbe_strdup (GTXT ("Inclusive Race Accesses")); 1239 abbr = dbe_strdup (GTXT ("Incl. Race Accesses")); 1240 } 1241 else if (st == ATTRIBUTED) 1242 { 1243 name = dbe_strdup (GTXT ("Attributed Race Accesses")); 1244 abbr = dbe_strdup (GTXT ("Attr. Race Accesses")); 1245 } 1246 else 1247 { 1248 name = dbe_sprintf (GTXT ("Unexpected Race Access metric subtype %d"), st); 1249 abbr = dbe_strdup (NTXT ("??")); 1250 } 1251 break; 1252 case DEADLOCKS: 1253 if (st == EXCLUSIVE) 1254 { 1255 name = dbe_strdup (GTXT ("Exclusive Deadlocks")); 1256 abbr = dbe_strdup (GTXT ("Excl. Deadlocks")); 1257 } 1258 else if (st == INCLUSIVE) 1259 { 1260 name = dbe_strdup (GTXT ("Inclusive Deadlocks")); 1261 abbr = dbe_strdup (GTXT ("Incl. Deadlocks")); 1262 } 1263 else if (st == ATTRIBUTED) 1264 { 1265 name = dbe_strdup (GTXT ("Attributed Deadlocks")); 1266 abbr = dbe_strdup (GTXT ("Attr. Deadlocks")); 1267 } 1268 else 1269 { 1270 name = dbe_sprintf (GTXT ("Unexpected Deadlocks metric subtype %d"), st); 1271 abbr = dbe_strdup (NTXT ("??")); 1272 } 1273 break; 1274 default: 1275 abort (); 1276 } 1277} //Metric::set_subtype 1278 1279static bool 1280is_width_ok (int lines, size_t width, size_t *tlen, int last) 1281{ 1282 size_t len = 0; 1283 for (int i = 0; i <= last; i++) 1284 { 1285 if (len != 0) 1286 len++; 1287 if (len + tlen[i] > width) 1288 { 1289 if (--lines == 0) 1290 return false; 1291 len = 0; 1292 } 1293 len += tlen[i]; 1294 } 1295 return true; 1296} 1297 1298void 1299Metric::legend_width (HistMetric *hitem, int gap) 1300{ 1301 size_t tlen[MAX_LEN]; 1302 char *tok[MAX_LEN], buf[MAX_LEN], unit[MAX_LEN]; 1303 hitem->width = hitem->maxtime_width; 1304 if (hitem->maxvalue_width > 0) 1305 { 1306 if (hitem->width > 0) 1307 hitem->width++; 1308 hitem->width += hitem->maxvalue_width; 1309 } 1310 if (is_pvisible ()) 1311 { 1312 if (hitem->width > 0) 1313 { 1314 hitem->width++; 1315 } 1316 hitem->width += 6; // adjust to change format from xx.yy% 1317 } 1318 snprintf (buf, sizeof (buf), "%s", get_abbr ()); 1319 size_t max_len = hitem->width; 1320 if (legend) 1321 { 1322 size_t legend_len = strlen (legend); 1323 if (max_len < legend_len) 1324 max_len = legend_len; 1325 } 1326 tok[0] = buf; 1327 int last = 0; 1328 for (int i = 0;; i++) 1329 { 1330 if (buf[i] == ' ') 1331 { 1332 buf[i] = '\0'; 1333 while (buf[i + 1] == ' ') 1334 i++; 1335 tlen[last] = strlen (tok[last]); 1336 if (max_len < tlen[last]) 1337 max_len = tlen[last]; 1338 last++; 1339 tok[last] = buf + i + 1; 1340 } 1341 else if (buf[i] == '\0') 1342 { 1343 tlen[last] = strlen (tok[last]); 1344 if (max_len < tlen[last]) 1345 max_len = tlen[last]; 1346 if (tlen[last] == 0 && last > 0) 1347 last--; 1348 break; 1349 } 1350 } 1351 1352 *unit = '\0'; // get the extra unit tokens 1353 int max_lines = 3; 1354 if (is_tvisible ()) 1355 { 1356 char *s = GTXT ("sec."); 1357 if ((get_visbits () & VAL_DELTA) != 0) 1358 s = GTXT ("delta"); 1359 else if ((get_visbits () & VAL_RATIO) != 0) 1360 s = GTXT ("ratio"); 1361 long len = strlen (s); 1362 if (hitem->maxtime_width < len) 1363 { 1364 hitem->width += len - hitem->maxtime_width; 1365 hitem->maxtime_width = len; 1366 } 1367 snprintf (unit, sizeof (unit), "%*s", (int) hitem->maxtime_width, s); 1368 } 1369 if (is_visible ()) 1370 { 1371 char *s = NTXT (""); 1372 if (!is_tvisible ()) 1373 { 1374 if ((get_visbits () & VAL_DELTA) != 0) 1375 s = GTXT ("delta"); 1376 else if ((get_visbits () & VAL_RATIO) != 0) 1377 s = GTXT ("ratio"); 1378 else if ((get_value_styles () & VAL_TIMEVAL) != 0 && !is_time_val ()) 1379 s = GTXT ("sec."); 1380 } 1381 long len = strlen (s); 1382 if (hitem->maxvalue_width < len) 1383 { 1384 hitem->width += len - hitem->maxvalue_width; 1385 hitem->maxvalue_width = len; 1386 } 1387 if (*unit) 1388 { 1389 max_lines = 2; 1390 len = strlen (unit); 1391 snprintf (unit + len, sizeof (unit) - len, " %*s", 1392 (int) hitem->maxvalue_width, s); 1393 } 1394 else 1395 snprintf (unit, sizeof (unit), "%*s", (int) hitem->maxvalue_width, s); 1396 } 1397 if (is_pvisible ()) 1398 { 1399 max_lines = 2; 1400 if (*unit) 1401 { 1402 size_t len = strlen (unit); 1403 snprintf (unit + len, sizeof (unit) - len, GTXT (" %%")); 1404 } 1405 else 1406 snprintf (unit, sizeof (unit), GTXT (" %%")); 1407 } 1408 for (size_t i = strlen (unit); i > 0;) 1409 { // remove trailing spaces 1410 i--; 1411 if (unit[i] != ' ') 1412 break; 1413 unit[i] = 0; 1414 } 1415 1416 if (*unit) 1417 { 1418 last++; 1419 tlen[last] = strlen (unit); 1420 tok[last] = unit; 1421 if (max_len < tlen[last]) 1422 max_len = tlen[last]; 1423 if (max_lines == 3 && *unit == ' ') 1424 { 1425 char *str = unit; 1426 while (*str == ' ') 1427 str++; 1428 tlen[last] = strlen (str); 1429 tok[last] = str; 1430 } 1431 } 1432 1433 int last1 = max_lines == 3 ? last : last - 1; 1434 while (!is_width_ok (max_lines, max_len, tlen, last1)) 1435 max_len++; 1436 hitem->width = max_len + gap; 1437 1438 char *legends[3]; 1439 legends[0] = hitem->legend1; 1440 legends[1] = hitem->legend2; 1441 legends[2] = hitem->legend3; 1442 for (int i = 0, ind = 0; i < 3; i++) 1443 { 1444 char *str = legends[i]; 1445 *str = 0; 1446 for (; ind <= last; ind++) 1447 { 1448 if (*unit && (ind == last)) 1449 { 1450 // Try to put 'unit' in 'legend3' 1451 if (i != 2) 1452 { 1453 tok[last] = unit; // restore a formated 'unit' 1454 break; 1455 } 1456 } 1457 size_t len = strlen (str); 1458 if (len != 0) 1459 { 1460 if (len + 1 + tlen[ind] > max_len) 1461 break; 1462 snprintf (str + len, MAX_LEN - len, NTXT (" %s"), tok[ind]); 1463 } 1464 else 1465 { 1466 if (len + tlen[ind] > max_len) 1467 break; 1468 snprintf (str + len, MAX_LEN - len, NTXT ("%s"), tok[ind]); 1469 } 1470 } 1471 } 1472} 1473 1474int 1475Metric::get_real_visbits () 1476{ 1477 int v = visbits; 1478 if (!is_time_val () && (visbits & (VAL_TIMEVAL | VAL_VALUE)) != 0) 1479 { 1480 v &= ~(VAL_TIMEVAL | VAL_VALUE); 1481 v |= (get_value_styles () & (VAL_TIMEVAL | VAL_VALUE)); 1482 } 1483 return v; 1484} 1485 1486char * 1487Metric::get_vis_string (int vis) 1488{ 1489 char *vis_str; 1490 if (subtype == STATIC) 1491 vis_str = NTXT (""); 1492 else 1493 { 1494 int v; 1495 if (is_time_val ()) 1496 v = vis & (VAL_TIMEVAL | VAL_VALUE | VAL_PERCENT); 1497 else 1498 { 1499 v = vis & VAL_PERCENT; 1500 if ((vis & (VAL_TIMEVAL | VAL_VALUE)) != 0) 1501 v |= (get_value_styles () & (VAL_TIMEVAL | VAL_VALUE)); 1502 } 1503 switch (v) 1504 { 1505 case VAL_TIMEVAL: 1506 vis_str = NTXT ("."); 1507 break; 1508 case VAL_VALUE: 1509 vis_str = NTXT ("+"); 1510 break; 1511 case VAL_TIMEVAL | VAL_VALUE: 1512 vis_str = NTXT (".+"); 1513 break; 1514 case VAL_PERCENT: 1515 vis_str = NTXT ("%"); 1516 break; 1517 case VAL_TIMEVAL | VAL_PERCENT: 1518 vis_str = NTXT (".%"); 1519 break; 1520 case VAL_VALUE | VAL_PERCENT: 1521 vis_str = NTXT ("+%"); 1522 break; 1523 case VAL_TIMEVAL | VAL_VALUE | VAL_PERCENT: 1524 vis_str = NTXT (".+%"); 1525 break; 1526 default: 1527 vis_str = NTXT ("!"); 1528 break; 1529 } 1530 } 1531 return vis_str; 1532} 1533 1534char * 1535Metric::get_vis_str () 1536{ 1537 char *vis_str = NULL; 1538 if (visbits == -1) 1539 { 1540 // unitialized, return all possible with a trailing - 1541 if (subtype == STATIC) 1542 vis_str = NTXT (".-"); 1543 else if (is_time_val ()) 1544 vis_str = NTXT (".+%-"); 1545 else 1546 vis_str = NTXT (".%-"); 1547 } 1548 else 1549 vis_str = get_vis_string (get_real_visbits ()); 1550 return vis_str; 1551} 1552 1553void 1554Metric::set_dmetrics_visbits (int dmetrics_visbits) 1555{ 1556 visbits = VAL_NA; // clear global state 1557 1558 // process the "show" bits 1559 int _visbits = dmetrics_visbits & ~VAL_HIDE_ALL; 1560 assert (_visbits != -1); 1561 if (_visbits == 0) 1562 return; // done. (Ignore VAL_HIDE_ALL since there's nothing to hide.) 1563 if (get_subtype () == STATIC) 1564 // percent, time value not applicable 1565 visbits = VAL_VALUE; 1566 else 1567 { 1568 // now or in the bits, but manage . and + according to the is_time_val setting 1569 if (is_time_val () == 0) 1570 { 1571 if ((_visbits & VAL_VALUE) || (_visbits & VAL_TIMEVAL)) 1572 visbits |= VAL_VALUE; 1573 } 1574 else 1575 visbits |= (_visbits & (VAL_VALUE | VAL_TIMEVAL)); 1576 visbits |= (_visbits & (VAL_PERCENT | VAL_RATIO | VAL_DELTA)); 1577 } 1578 // process the "hide" bit 1579 if (dmetrics_visbits & VAL_HIDE_ALL) 1580 visbits |= VAL_HIDE_ALL; 1581} 1582 1583void 1584Metric::set_vvisible (bool set) 1585{ 1586 if (set) 1587 { 1588 visbits |= VAL_VALUE; 1589 visbits &= ~VAL_HIDE_ALL; 1590 } 1591 else 1592 visbits &= ~VAL_VALUE; 1593} 1594 1595void 1596Metric::set_tvisible (bool set) 1597{ 1598 if (set) 1599 { 1600 visbits |= VAL_TIMEVAL; 1601 visbits &= ~VAL_HIDE_ALL; 1602 } 1603 else 1604 visbits &= ~VAL_TIMEVAL; 1605} 1606 1607void 1608Metric::set_pvisible (bool set) 1609{ 1610 if (set) 1611 { 1612 visbits |= VAL_PERCENT; 1613 visbits &= ~VAL_HIDE_ALL; 1614 } 1615 else 1616 visbits &= ~VAL_PERCENT; 1617} 1618 1619char * 1620Metric::get_mcmd (bool allPossible) 1621{ 1622 char *sc = NTXT (""); // subtype == STATIC 1623 char *hide; 1624 char *vis = get_vis_string (allPossible ? get_value_styles () 1625 : get_real_visbits ()); 1626 if (subtype == INCLUSIVE) 1627 sc = NTXT ("i"); 1628 else if (subtype == EXCLUSIVE) 1629 sc = NTXT ("e"); 1630 else if (subtype == ATTRIBUTED) 1631 sc = NTXT ("a"); 1632 else if (subtype == DATASPACE) 1633 sc = NTXT ("d"); 1634 if (allPossible) 1635 hide = NTXT (""); 1636 else if (visbits == VAL_NA || (visbits & VAL_HIDE_ALL) != 0) 1637 hide = NTXT ("!"); 1638 else 1639 hide = NTXT (""); 1640 1641 char *mcmd = get_cmd (); 1642 return dbe_sprintf (GTXT ("%s%s%s%s"), sc, hide, vis, mcmd); 1643} 1644 1645char * 1646Metric::dump () 1647{ 1648 int len = 4; 1649 BaseMetric *bm = (BaseMetric *) this; 1650 char *s = bm->dump (); 1651 char *msg = dbe_sprintf ("%s\n%*c subtype=%d time_val=%d vis=%d tvis=%d" 1652 " pvis=%d\n%*c abbr='%s' cmd='%s' name='%s'\n", 1653 STR (s), len, ' ', get_subtype (), is_time_val (), 1654 is_visible (), is_tvisible (), is_pvisible (), 1655 len, ' ', STR (get_abbr ()), STR (get_cmd ()), 1656 STR (get_name ())); 1657 free (s); 1658 return msg; 1659} 1660 1661