diff options
Diffstat (limited to 'gprofng/src/Metric.cc')
-rw-r--r-- | gprofng/src/Metric.cc | 1660 |
1 files changed, 1660 insertions, 0 deletions
diff --git a/gprofng/src/Metric.cc b/gprofng/src/Metric.cc new file mode 100644 index 00000000000..3b026ff80b1 --- /dev/null +++ b/gprofng/src/Metric.cc @@ -0,0 +1,1660 @@ +/* Copyright (C) 2021 Free Software Foundation, Inc. + Contributed by Oracle. + + This file is part of GNU Binutils. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#include "config.h" +#include <stdio.h> +#include <strings.h> +#include <limits.h> +#include <sys/param.h> + +#include "util.h" +#include "DbeSession.h" +#include "Experiment.h" +#include "Expression.h" +#include "Metric.h" + +Metric::Metric (BaseMetric *item, SubType st) : BaseMetric (*item) +{ + name = NULL; + abbr = NULL; + abbr_unit = NULL; + baseMetric = item; + set_subtype (st); + visbits = VAL_NA; + if (item->get_type () == DERIVED) + visbits = VAL_VALUE; +} + +Metric::Metric (const Metric& item) : BaseMetric (item) +{ + baseMetric = item.baseMetric; + subtype = item.subtype; + name = dbe_strdup (item.name); + abbr = dbe_strdup (item.abbr); + abbr_unit = dbe_strdup (item.abbr_unit); + visbits = item.visbits; +} + +Metric::~Metric () +{ + free (name); + free (abbr); + free (abbr_unit); +} + +// Note that BaseMetric::get_vtype() has the base value type. +// Here, we get the value type for the displayed metric, +// which may be different if comparison is used. + +ValueTag +Metric::get_vtype2 () +{ + ValueTag vtype = get_vtype (); + if (visbits & VAL_DELTA) + { + switch (vtype) + { + case VT_ULLONG: return VT_LLONG; + default: return vtype; + } + } + if (visbits & VAL_RATIO) + { + switch (vtype) + { + case VT_INT: + case VT_LLONG: + case VT_ULLONG: + case VT_FLOAT: + case VT_DOUBLE: return VT_DOUBLE; + default: return vtype; + } + } + return vtype; +} + +void +Metric::set_subtype (SubType st) +{ + subtype = st; + free (name); + free (abbr); + free (abbr_unit); + name = NULL; + abbr = NULL; + abbr_unit = NULL; + + switch (get_type ()) + { + case CP_LMS_USER: + abbr_unit = dbe_strdup (GTXT ("sec.")); + if (st == EXCLUSIVE) + { + name = dbe_strdup (GTXT ("Exclusive User CPU Time")); + abbr = dbe_strdup (GTXT ("Excl. User CPU")); + } + else if (st == INCLUSIVE) + { + name = dbe_strdup (GTXT ("Inclusive User CPU Time")); + abbr = dbe_strdup (GTXT ("Incl. User CPU")); + } + else if (st == ATTRIBUTED) + { + name = dbe_strdup (GTXT ("Attributed User CPU Time")); + abbr = dbe_strdup (GTXT ("Attr. User CPU")); + } + else + { + name = dbe_sprintf (GTXT ("Unexpected CP_LMS_USER metric subtype %d"), + st); + abbr = dbe_strdup (NTXT ("??")); + abort (); + } + break; + + case CP_LMS_WAIT_CPU: + abbr_unit = dbe_strdup (GTXT ("sec.")); + if (st == EXCLUSIVE) + { + name = dbe_strdup (GTXT ("Exclusive Wait CPU Time")); + abbr = dbe_strdup (GTXT ("Excl. Wait CPU")); + } + else if (st == INCLUSIVE) + { + name = dbe_strdup (GTXT ("Inclusive Wait CPU Time")); + abbr = dbe_strdup (GTXT ("Incl. Wait CPU")); + } + else if (st == ATTRIBUTED) + { + name = dbe_strdup (GTXT ("Attributed Wait CPU Time")); + abbr = dbe_strdup (GTXT ("Attr. Wait CPU")); + } + else + { + name = dbe_sprintf (GTXT ("Unexpected CP_LMS_WAIT_CPU metric subtype %d"), + st); + abbr = dbe_strdup (NTXT ("??")); + } + break; + + case CP_LMS_USER_LOCK: + abbr_unit = dbe_strdup (GTXT ("sec.")); + if (st == EXCLUSIVE) + { + name = dbe_strdup (GTXT ("Exclusive User Lock Time")); + abbr = dbe_strdup (GTXT ("Excl. User Lock")); + } + else if (st == INCLUSIVE) + { + name = dbe_strdup (GTXT ("Inclusive User Lock Time")); + abbr = dbe_strdup (GTXT ("Incl. User Lock")); + } + else if (st == ATTRIBUTED) + { + name = dbe_strdup (GTXT ("Attributed User Lock Time")); + abbr = dbe_strdup (GTXT ("Attr. User Lock")); + } + else + { + name = dbe_sprintf (GTXT ("Unexpected CP_LMS_USER_LOCK metric subtype %d"), + st); + abbr = dbe_strdup (NTXT ("??")); + } + break; + + case CP_LMS_SYSTEM: + abbr_unit = dbe_strdup (GTXT ("sec.")); + if (st == EXCLUSIVE) + { + name = dbe_strdup (GTXT ("Exclusive System CPU Time")); + abbr = dbe_strdup (GTXT ("Excl. Sys. CPU")); + } + else if (st == INCLUSIVE) + { + name = dbe_strdup (GTXT ("Inclusive System CPU Time")); + abbr = dbe_strdup (GTXT ("Incl. Sys. CPU")); + } + else if (st == ATTRIBUTED) + { + name = dbe_strdup (GTXT ("Attributed System CPU Time")); + abbr = dbe_strdup (GTXT ("Attr. Sys. CPU")); + } + else + { + name = dbe_sprintf (GTXT ("Unexpected CP_LMS_SYSTEM metric subtype %d"), + st); + abbr = dbe_strdup (NTXT ("??")); + } + break; + + case SYNC_WAIT_TIME: + abbr_unit = dbe_strdup (GTXT ("sec.")); + if (st == EXCLUSIVE) + { + name = dbe_strdup (GTXT ("Exclusive Sync Wait Time")); + abbr = dbe_strdup (GTXT ("Excl. Sync Wait")); + } + else if (st == INCLUSIVE) + { + name = dbe_strdup (GTXT ("Inclusive Sync Wait Time")); + abbr = dbe_strdup (GTXT ("Incl. Sync Wait")); + } + else if (st == ATTRIBUTED) + { + name = dbe_strdup (GTXT ("Attributed Sync Wait Time")); + abbr = dbe_strdup (GTXT ("Attr. Sync Wait")); + } + else + { + name = dbe_sprintf (GTXT ("Unexpected LWT metric subtype %d"), st); + abbr = dbe_strdup (NTXT ("??")); + } + break; + + case CP_LMS_TFAULT: + abbr_unit = dbe_strdup (GTXT ("sec.")); + if (st == EXCLUSIVE) + { + name = dbe_strdup (GTXT ("Exclusive Text Page Fault Time")); + abbr = dbe_strdup (GTXT ("Excl. Text Fault")); + } + else if (st == INCLUSIVE) + { + name = dbe_strdup (GTXT ("Inclusive Text Page Fault Time")); + abbr = dbe_strdup (GTXT ("Incl. Text Fault")); + } + else if (st == ATTRIBUTED) + { + name = dbe_strdup (GTXT ("Attributed Text Page Fault Time")); + abbr = dbe_strdup (GTXT ("Attr. Text Fault")); + } + else + { + name = dbe_sprintf (GTXT ("Unexpected CP_LMS_TFAULT metric subtype %d"), + st); + abbr = dbe_strdup (NTXT ("??")); + } + break; + + case CP_LMS_DFAULT: + abbr_unit = dbe_strdup (GTXT ("sec.")); + if (st == EXCLUSIVE) + { + name = dbe_strdup (GTXT ("Exclusive Data Page Fault Time")); + abbr = dbe_strdup (GTXT ("Excl. Data Fault")); + } + else if (st == INCLUSIVE) + { + name = dbe_strdup (GTXT ("Inclusive Data Page Fault Time")); + abbr = dbe_strdup (GTXT ("Incl. Data Fault")); + } + else if (st == ATTRIBUTED) + { + name = dbe_strdup (GTXT ("Attributed Data Page Fault Time")); + abbr = dbe_strdup (GTXT ("Attr. Data Fault")); + } + else + { + name = dbe_sprintf (GTXT ("Unexpected CP_LMS_DFAULT metric subtype %d"), + st); + abbr = dbe_strdup (NTXT ("??")); + } + break; + + case CP_KERNEL_CPU: + abbr_unit = dbe_strdup (GTXT ("sec.")); + if (st == EXCLUSIVE) + { + name = dbe_strdup (GTXT ("Exclusive Kernel CPU Time")); + abbr = dbe_strdup (GTXT ("Excl. Kernel CPU")); + } + else if (st == INCLUSIVE) + { + name = dbe_strdup (GTXT ("Inclusive Kernel CPU Time")); + abbr = dbe_strdup (GTXT ("Incl. Kernel CPU")); + } + else if (st == ATTRIBUTED) + { + name = dbe_strdup (GTXT ("Attributed Kernel CPU Time")); + abbr = dbe_strdup (GTXT ("Attr. Kernel CPU")); + } + else + { + name = dbe_sprintf (GTXT ("Unexpected CP_KERNEL_CPU metric subtype %d"), + st); + abbr = dbe_strdup (NTXT ("??")); + } + break; + + case HWCNTR: + { + char *sstr, *estr1, *estr2; + if (get_hw_ctr () == NULL) + abort (); + sstr = get_username (); + if (st == EXCLUSIVE) + { + estr1 = GTXT ("Exclusive "); + estr2 = GTXT ("Excl. "); + } + else if (st == INCLUSIVE) + { + estr1 = GTXT ("Inclusive "); + estr2 = GTXT ("Incl. "); + } + else if (st == ATTRIBUTED) + { + estr1 = GTXT ("Attributed "); + estr2 = GTXT ("Attr. "); + } + else if (st == DATASPACE) + { + estr1 = GTXT ("Data-derived "); + estr2 = GTXT ("Data. "); + } + else + { + estr1 = dbe_sprintf (GTXT ("Unexpected hwc %s metric subtype %d"), + get_aux (), st); + estr2 = dbe_strdup (NTXT ("??")); + } + name = dbe_sprintf (NTXT ("%s%s"), estr1, sstr); + abbr = dbe_sprintf (NTXT ("%s%s"), estr2, sstr); + break; + } + + case DERIVED: + { + switch (st) + { + case EXCLUSIVE: + name = dbe_sprintf (GTXT ("Exclusive %s"), get_username ()); + abbr = dbe_sprintf (GTXT ("Excl. %s"), get_cmd ()); + break; + case INCLUSIVE: + name = dbe_sprintf (GTXT ("Inclusive %s"), get_username ()); + abbr = dbe_sprintf (GTXT ("Incl. %s"), get_cmd ()); + break; + case ATTRIBUTED: + name = dbe_sprintf (GTXT ("Attributed %s"), get_username ()); + abbr = dbe_sprintf (GTXT ("Attr. %s"), get_cmd ()); + break; + default: + name = dbe_sprintf (GTXT ("Unexpected derived %s metric subtype %d"), + get_username (), st); + abbr = dbe_strdup (NTXT ("??")); + break; + } + break; + } + + case OMP_MASTER_THREAD: + abbr_unit = dbe_strdup (GTXT ("sec.")); + if (st == EXCLUSIVE) + { + name = dbe_strdup (GTXT ("Exclusive Master Thread Time")); + abbr = dbe_strdup (GTXT ("Excl. Master Thread")); + } + else if (st == INCLUSIVE) + { + name = dbe_strdup (GTXT ("Inclusive Master Thread Time")); + abbr = dbe_strdup (GTXT ("Incl. Master Thread")); + } + else if (st == ATTRIBUTED) + { + name = dbe_strdup (GTXT ("Attributed Master Thread Time")); + abbr = dbe_strdup (GTXT ("Attr. Master Thread")); + } + else + { + name = dbe_sprintf (GTXT ("Unexpected Master Thread metric subtype %d"), + st); + abbr = dbe_strdup (NTXT ("??")); + } + break; + + case CP_TOTAL: + abbr_unit = dbe_strdup (GTXT ("sec.")); + if (st == EXCLUSIVE) + { + name = dbe_strdup (GTXT ("Exclusive Total Thread Time")); + abbr = dbe_strdup (GTXT ("Excl. Total Thread")); + } + else if (st == INCLUSIVE) + { + name = dbe_strdup (GTXT ("Inclusive Total Thread Time")); + abbr = dbe_strdup (GTXT ("Incl. Total Thread")); + } + else if (st == ATTRIBUTED) + { + name = dbe_strdup (GTXT ("Attributed Total Thread Time")); + abbr = dbe_strdup (GTXT ("Attr. Total Thread")); + } + else + { + name = dbe_sprintf (GTXT ("Unexpected TOTAL metric subtype %d"), st); + abbr = dbe_strdup (NTXT ("??")); + } + break; + + case SYNC_WAIT_COUNT: + if (st == EXCLUSIVE) + { + name = dbe_strdup (GTXT ("Exclusive Sync Wait Count")); + abbr = dbe_strdup (GTXT ("Excl. Sync Wait Count")); + } + else if (st == INCLUSIVE) + { + name = dbe_strdup (GTXT ("Inclusive Sync Wait Count")); + abbr = dbe_strdup (GTXT ("Incl. Sync Wait Count")); + } + else if (st == ATTRIBUTED) + { + name = dbe_strdup (GTXT ("Attributed Sync Wait Count")); + abbr = dbe_strdup (GTXT ("Attr. Sync Wait Count")); + } + else + { + name = dbe_sprintf (GTXT ("Unexpected LWCNT metric subtype %d"), st); + abbr = dbe_strdup (NTXT ("??")); + } + break; + + case CP_TOTAL_CPU: + abbr_unit = dbe_strdup (GTXT ("sec.")); + if (st == EXCLUSIVE) + { + name = dbe_strdup (GTXT ("Exclusive Total CPU Time")); + abbr = dbe_strdup (GTXT ("Excl. Total CPU")); + } + else if (st == INCLUSIVE) + { + name = dbe_strdup (GTXT ("Inclusive Total CPU Time")); + abbr = dbe_strdup (GTXT ("Incl. Total CPU")); + } + else if (st == ATTRIBUTED) + { + name = dbe_strdup (GTXT ("Attributed Total CPU Time")); + abbr = dbe_strdup (GTXT ("Attr. Total CPU")); + } + else + { + name = dbe_sprintf (GTXT ("Unexpected TOTAL_CPU metric subtype %d"), + st); + abbr = dbe_strdup (NTXT ("??")); + } + break; + case CP_LMS_TRAP: + abbr_unit = dbe_strdup (GTXT ("sec.")); + if (st == EXCLUSIVE) + { + name = dbe_strdup (GTXT ("Exclusive Trap CPU Time")); + abbr = dbe_strdup (GTXT ("Excl. Trap CPU")); + } + else if (st == INCLUSIVE) + { + name = dbe_strdup (GTXT ("Inclusive Trap CPU Time")); + abbr = dbe_strdup (GTXT ("Incl. Trap CPU")); + } + else if (st == ATTRIBUTED) + { + name = dbe_strdup (GTXT ("Attributed Trap CPU Time")); + abbr = dbe_strdup (GTXT ("Attr. Trap CPU")); + } + else + { + name = dbe_sprintf (GTXT ("Unexpected CP_LMS_TRAP metric subtype %d"), + st); + abbr = dbe_strdup (NTXT ("??")); + } + break; + + case CP_LMS_KFAULT: + abbr_unit = dbe_strdup (GTXT ("sec.")); + if (st == EXCLUSIVE) + { + name = dbe_strdup (GTXT ("Exclusive Kernel Page Fault Time")); + abbr = dbe_strdup (GTXT ("Excl. Kernel Page Fault")); + } + else if (st == INCLUSIVE) + { + name = dbe_strdup (GTXT ("Inclusive Kernel Page Fault Time")); + abbr = dbe_strdup (GTXT ("Incl. Kernel Page Fault")); + } + else if (st == ATTRIBUTED) + { + name = dbe_strdup (GTXT ("Attributed Kernel Page Fault Time")); + abbr = dbe_strdup (GTXT ("Attr. Kernel Page Fault")); + } + else + { + name = dbe_sprintf (GTXT ("Unexpected CP_LMS_KFAULT metric subtype %d"), + st); + abbr = dbe_strdup (NTXT ("??")); + } + break; + + case CP_LMS_SLEEP: + abbr_unit = dbe_strdup (GTXT ("sec.")); + if (st == EXCLUSIVE) + { + name = dbe_strdup (GTXT ("Exclusive Sleep Time")); + abbr = dbe_strdup (GTXT ("Excl. Sleep")); + } + else if (st == INCLUSIVE) + { + name = dbe_strdup (GTXT ("Inclusive Sleep Time")); + abbr = dbe_strdup (GTXT ("Incl. Sleep")); + } + else if (st == ATTRIBUTED) + { + name = dbe_strdup (GTXT ("Attributed Sleep Time")); + abbr = dbe_strdup (GTXT ("Attr. Sleep")); + } + else + { + name = dbe_sprintf (GTXT ("Unexpected CP_LMS_SLEEP metric subtype %d"), + st); + abbr = dbe_strdup (NTXT ("??")); + } + break; + + case CP_LMS_STOPPED: + abbr_unit = dbe_strdup (GTXT ("sec.")); + if (st == EXCLUSIVE) + { + name = dbe_strdup (GTXT ("Exclusive Stopped Time")); + abbr = dbe_strdup (GTXT ("Excl. Stopped")); + } + else if (st == INCLUSIVE) + { + name = dbe_strdup (GTXT ("Inclusive Stopped Time")); + abbr = dbe_strdup (GTXT ("Incl. Stopped")); + } + else if (st == ATTRIBUTED) + { + name = dbe_strdup (GTXT ("Attributed Stopped Time")); + abbr = dbe_strdup (GTXT ("Attr. Stopped")); + } + else + { + name = dbe_sprintf (GTXT ("Unexpected CP_LMS_STOPPED metric subtype %d"), + st); + abbr = dbe_strdup (NTXT ("??")); + } + break; + + case HEAP_ALLOC_BYTES: + if (st == EXCLUSIVE) + { + name = dbe_strdup (GTXT ("Exclusive Bytes Allocated")); + abbr = dbe_strdup (GTXT ("Excl. Bytes Allocated")); + } + else if (st == INCLUSIVE) + { + name = dbe_strdup (GTXT ("Inclusive Bytes Allocated")); + abbr = dbe_strdup (GTXT ("Incl. Bytes Allocated")); + } + else if (st == ATTRIBUTED) + { + name = dbe_strdup (GTXT ("Attributed Bytes Allocated")); + abbr = dbe_strdup (GTXT ("Attr. Bytes Allocated")); + } + else + { + name = dbe_sprintf (GTXT ("Unexpected BYTES_MALLOCD metric subtype %d"), + st); + abbr = dbe_strdup (NTXT ("??")); + } + break; + + case HEAP_ALLOC_CNT: + if (st == EXCLUSIVE) + { + name = dbe_strdup (GTXT ("Exclusive Allocations")); + abbr = dbe_strdup (GTXT ("Excl. Allocations")); + } + else if (st == INCLUSIVE) + { + name = dbe_strdup (GTXT ("Inclusive Allocations")); + abbr = dbe_strdup (GTXT ("Incl. Allocations")); + } + else if (st == ATTRIBUTED) + { + name = dbe_strdup (GTXT ("Attributed Allocations")); + abbr = dbe_strdup (GTXT ("Attr. Allocations")); + } + else + { + name = dbe_sprintf (GTXT ("Unexpected MALLOCS metric subtype %d"), st); + abbr = dbe_strdup (NTXT ("??")); + } + break; + + case HEAP_LEAK_BYTES: + if (st == EXCLUSIVE) + { + name = dbe_strdup (GTXT ("Exclusive Bytes Leaked")); + abbr = dbe_strdup (GTXT ("Excl. Bytes Leaked")); + } + else if (st == INCLUSIVE) + { + name = dbe_strdup (GTXT ("Inclusive Bytes Leaked")); + abbr = dbe_strdup (GTXT ("Incl. Bytes Leaked")); + } + else if (st == ATTRIBUTED) + { + name = dbe_strdup (GTXT ("Attributed Bytes Leaked")); + abbr = dbe_strdup (GTXT ("Attr. Bytes Leaked")); + } + else + { + name = dbe_sprintf (GTXT ("Unexpected BYTES_LEAKED metric subtype %d"), + st); + abbr = dbe_strdup (NTXT ("??")); + } + break; + + case HEAP_LEAK_CNT: + if (st == EXCLUSIVE) + { + name = dbe_strdup (GTXT ("Exclusive Leaks")); + abbr = dbe_strdup (GTXT ("Excl. Leaks")); + } + else if (st == INCLUSIVE) + { + name = dbe_strdup (GTXT ("Inclusive Leaks")); + abbr = dbe_strdup (GTXT ("Incl. Leaks")); + } + else if (st == ATTRIBUTED) + { + name = dbe_strdup (GTXT ("Attributed Leaks")); + abbr = dbe_strdup (GTXT ("Attr. Leaks")); + } + else + { + name = dbe_sprintf (GTXT ("Unexpected LEAKS metric subtype %d"), st); + abbr = dbe_strdup (NTXT ("??")); + } + break; + + case IO_READ_BYTES: + if (st == EXCLUSIVE) + { + name = dbe_strdup (GTXT ("Exclusive Read Bytes")); + abbr = dbe_strdup (GTXT ("Excl. Read Bytes")); + } + else if (st == INCLUSIVE) + { + name = dbe_strdup (GTXT ("Inclusive Read Bytes")); + abbr = dbe_strdup (GTXT ("Incl. Read Bytes")); + } + else if (st == ATTRIBUTED) + { + name = dbe_strdup (GTXT ("Attributed Read Bytes")); + abbr = dbe_strdup (GTXT ("Attr. Read Bytes")); + } + else + { + name = dbe_sprintf (GTXT ("Unexpected READ_BYTES metric subtype %d"), st); + abbr = dbe_strdup (NTXT ("??")); + } + break; + + case IO_WRITE_BYTES: + if (st == EXCLUSIVE) + { + name = dbe_strdup (GTXT ("Exclusive Write Bytes")); + abbr = dbe_strdup (GTXT ("Excl. Write Bytes")); + } + else if (st == INCLUSIVE) + { + name = dbe_strdup (GTXT ("Inclusive Write Bytes")); + abbr = dbe_strdup (GTXT ("Incl. Write Bytes")); + } + else if (st == ATTRIBUTED) + { + name = dbe_strdup (GTXT ("Attributed Write Bytes")); + abbr = dbe_strdup (GTXT ("Attr. Write Bytes")); + } + else + { + name = dbe_sprintf (GTXT ("Unexpected WRITE_BYTES metric subtype %d"), st); + abbr = dbe_strdup (NTXT ("??")); + } + break; + + case IO_READ_CNT: + if (st == EXCLUSIVE) + { + name = dbe_strdup (GTXT ("Exclusive Read Count")); + abbr = dbe_strdup (GTXT ("Excl. Read Count")); + } + else if (st == INCLUSIVE) + { + name = dbe_strdup (GTXT ("Inclusive Read Count")); + abbr = dbe_strdup (GTXT ("Incl. Read Count")); + } + else if (st == ATTRIBUTED) + { + name = dbe_strdup (GTXT ("Attributed Read Count")); + abbr = dbe_strdup (GTXT ("Attr. Read Count")); + } + else + { + name = dbe_sprintf (GTXT ("Unexpected READCNT metric subtype %d"), st); + abbr = dbe_strdup (NTXT ("??")); + } + break; + + case IO_WRITE_CNT: + if (st == EXCLUSIVE) + { + name = dbe_strdup (GTXT ("Exclusive Write Count")); + abbr = dbe_strdup (GTXT ("Excl. Write Count")); + } + else if (st == INCLUSIVE) + { + name = dbe_strdup (GTXT ("Inclusive Write Count")); + abbr = dbe_strdup (GTXT ("Incl. Write Count")); + } + else if (st == ATTRIBUTED) + { + name = dbe_strdup (GTXT ("Attributed Write Count")); + abbr = dbe_strdup (GTXT ("Attr. Write Count")); + } + else + { + name = dbe_sprintf (GTXT ("Unexpected WRITECNT metric subtype %d"), st); + abbr = dbe_strdup (NTXT ("??")); + } + break; + + case IO_OTHER_CNT: + if (st == EXCLUSIVE) + { + name = dbe_strdup (GTXT ("Exclusive Other I/O Count")); + abbr = dbe_strdup (GTXT ("Excl. Other I/O Count")); + } + else if (st == INCLUSIVE) + { + name = dbe_strdup (GTXT ("Inclusive Other I/O Count")); + abbr = dbe_strdup (GTXT ("Incl. Other I/O Count")); + } + else if (st == ATTRIBUTED) + { + name = dbe_strdup (GTXT ("Attributed Other I/O Count")); + abbr = dbe_strdup (GTXT ("Attr. Other I/O Count")); + } + else + { + name = dbe_sprintf (GTXT ("Unexpected OTHERIOCNT metric subtype %d"), st); + abbr = dbe_strdup (NTXT ("??")); + } + break; + + case IO_ERROR_CNT: + if (st == EXCLUSIVE) + { + name = dbe_strdup (GTXT ("Exclusive I/O Error Count")); + abbr = dbe_strdup (GTXT ("Excl. I/O Error Count")); + } + else if (st == INCLUSIVE) + { + name = dbe_strdup (GTXT ("Inclusive I/O Error Count")); + abbr = dbe_strdup (GTXT ("Incl. I/O Error Count")); + } + else if (st == ATTRIBUTED) + { + name = dbe_strdup (GTXT ("Attributed I/O Error Count")); + abbr = dbe_strdup (GTXT ("Attr. I/O Error Count")); + } + else + { + name = dbe_sprintf (GTXT ("Unexpected IOERRORCNT metric subtype %d"), st); + abbr = dbe_strdup (NTXT ("??")); + } + break; + + case IO_READ_TIME: + abbr_unit = dbe_strdup (GTXT ("sec.")); + if (st == EXCLUSIVE) + { + name = dbe_strdup (GTXT ("Exclusive Read Time")); + abbr = dbe_strdup (GTXT ("Excl. Read Time")); + } + else if (st == INCLUSIVE) + { + name = dbe_strdup (GTXT ("Inclusive Read Time")); + abbr = dbe_strdup (GTXT ("Incl. Read Time")); + } + else if (st == ATTRIBUTED) + { + name = dbe_strdup (GTXT ("Attributed Read Time")); + abbr = dbe_strdup (GTXT ("Attr. Read Time")); + } + else + { + name = dbe_sprintf (GTXT ("Unexpected READ_TIME metric subtype %d"), st); + abbr = dbe_strdup (NTXT ("??")); + } + break; + + case IO_WRITE_TIME: + abbr_unit = dbe_strdup (GTXT ("sec.")); + if (st == EXCLUSIVE) + { + name = dbe_strdup (GTXT ("Exclusive Write Time")); + abbr = dbe_strdup (GTXT ("Excl. Write Time")); + } + else if (st == INCLUSIVE) + { + name = dbe_strdup (GTXT ("Inclusive Write Time")); + abbr = dbe_strdup (GTXT ("Incl. Write Time")); + } + else if (st == ATTRIBUTED) + { + name = dbe_strdup (GTXT ("Attributed Write Time")); + abbr = dbe_strdup (GTXT ("Attr. Write Time")); + } + else + { + name = dbe_sprintf (GTXT ("Unexpected WRITE_TIME metric subtype %d"), st); + abbr = dbe_strdup (NTXT ("??")); + } + break; + + case IO_OTHER_TIME: + abbr_unit = dbe_strdup (GTXT ("sec.")); + if (st == EXCLUSIVE) + { + name = dbe_strdup (GTXT ("Exclusive Other I/O Time")); + abbr = dbe_strdup (GTXT ("Excl. Other I/O Time")); + } + else if (st == INCLUSIVE) + { + name = dbe_strdup (GTXT ("Inclusive Other I/O Time")); + abbr = dbe_strdup (GTXT ("Incl. Other I/O Time")); + } + else if (st == ATTRIBUTED) + { + name = dbe_strdup (GTXT ("Attributed Other I/O Time")); + abbr = dbe_strdup (GTXT ("Attr. Other I/O Time")); + } + else + { + name = dbe_sprintf (GTXT ("Unexpected OTHERIO_TIME metric subtype %d"), st); + abbr = dbe_strdup (NTXT ("??")); + } + break; + + case IO_ERROR_TIME: + abbr_unit = dbe_strdup (GTXT ("sec.")); + if (st == EXCLUSIVE) + { + name = dbe_strdup (GTXT ("Exclusive I/O Error Time")); + abbr = dbe_strdup (GTXT ("Excl. I/O Error Time")); + } + else if (st == INCLUSIVE) + { + name = dbe_strdup (GTXT ("Inclusive I/O Error Time")); + abbr = dbe_strdup (GTXT ("Incl. I/O Error Time")); + } + else if (st == ATTRIBUTED) + { + name = dbe_strdup (GTXT ("Attributed I/O Error Time")); + abbr = dbe_strdup (GTXT ("Attr. I/O Error Time")); + } + else + { + name = dbe_sprintf (GTXT ("Unexpected IOERROR_TIME metric subtype %d"), st); + abbr = dbe_strdup (NTXT ("??")); + } + break; + + case SIZES: + name = dbe_strdup (GTXT ("Size")); + abbr = dbe_strdup (GTXT ("Size")); + abbr_unit = dbe_strdup (GTXT ("bytes")); + break; + + case ADDRESS: + name = dbe_strdup (GTXT ("PC Address")); + abbr = dbe_strdup (GTXT ("PC Addr.")); + break; + + case ONAME: + name = dbe_strdup (GTXT ("Name")); + abbr = dbe_strdup (GTXT ("Name")); + break; + + case OMP_NONE: + abbr_unit = dbe_strdup (GTXT ("sec.")); + if (st == EXCLUSIVE) + { + name = dbe_strdup (GTXT ("Exclusive Non-OpenMP Time")); + abbr = dbe_strdup (GTXT ("Excl. Non-OMP")); + } + else if (st == INCLUSIVE) + { + name = dbe_strdup (GTXT ("Inclusive Non-OpenMP Time")); + abbr = dbe_strdup (GTXT ("Incl. Non-OMP")); + } + else if (st == ATTRIBUTED) + { + name = dbe_strdup (GTXT ("Attributed Non-OpenMP Time")); + abbr = dbe_strdup (GTXT ("Attr. Non-OMP")); + } + else + { + name = dbe_sprintf (GTXT ("Unexpected Non-OpenMP metric subtype %d"), st); + abbr = dbe_strdup (NTXT ("??")); + } + break; + case OMP_OVHD: + abbr_unit = dbe_strdup (GTXT ("sec.")); + if (st == EXCLUSIVE) + { + name = dbe_strdup (GTXT ("Exclusive OpenMP Overhead Time")); + abbr = dbe_strdup (GTXT ("Excl. OMP ovhd.")); + } + else if (st == INCLUSIVE) + { + name = dbe_strdup (GTXT ("Inclusive OpenMP Overhead Time")); + abbr = dbe_strdup (GTXT ("Incl. OMP ovhd.")); + } + else if (st == ATTRIBUTED) + { + name = dbe_strdup (GTXT ("Attributed OpenMP Overhead Time")); + abbr = dbe_strdup (GTXT ("Attr. OMP ovhd.")); + } + else + { + name = dbe_sprintf (GTXT ("Unexpected OpenMP Overhead metric subtype %d"), st); + abbr = dbe_strdup (NTXT ("??")); + } + break; + case OMP_WORK: + abbr_unit = dbe_strdup (GTXT ("sec.")); + if (st == EXCLUSIVE) + { + name = dbe_strdup (GTXT ("Exclusive OpenMP Work Time")); + abbr = dbe_strdup (GTXT ("Excl. OMP Work")); + } + else if (st == INCLUSIVE) + { + name = dbe_strdup (GTXT ("Inclusive OpenMP Work Time")); + abbr = dbe_strdup (GTXT ("Incl. OMP Work")); + } + else if (st == ATTRIBUTED) + { + name = dbe_strdup (GTXT ("Attributed OpenMP Work Time")); + abbr = dbe_strdup (GTXT ("Attr. OMP Work")); + } + else + { + name = dbe_sprintf (GTXT ("Unexpected OpenMP Work metric subtype %d"), st); + abbr = dbe_strdup (NTXT ("??")); + } + break; + case OMP_IBAR: + abbr_unit = dbe_strdup (GTXT ("sec.")); + if (st == EXCLUSIVE) + { + name = dbe_strdup (GTXT ("Exclusive OpenMP Implicit Barrier Time")); + abbr = dbe_strdup (GTXT ("Excl. OMP i-barr.")); + } + else if (st == INCLUSIVE) + { + name = dbe_strdup (GTXT ("Inclusive OpenMP Implicit Barrier Time")); + abbr = dbe_strdup (GTXT ("Incl. OMP i-barr.")); + } + else if (st == ATTRIBUTED) + { + name = dbe_strdup (GTXT ("Attributed OpenMP Implicit Barrier Time")); + abbr = dbe_strdup (GTXT ("Attr. OMP i-barr.")); + } + else + { + name = dbe_sprintf (GTXT ("Unexpected OpenMP Implicit Barrier metric subtype %d"), st); + abbr = dbe_strdup (NTXT ("??")); + } + break; + case OMP_EBAR: + abbr_unit = dbe_strdup (GTXT ("sec.")); + if (st == EXCLUSIVE) + { + name = dbe_strdup (GTXT ("Exclusive OpenMP Explicit Barrier Time")); + abbr = dbe_strdup (GTXT ("Excl. OMP e-barr.")); + } + else if (st == INCLUSIVE) + { + name = dbe_strdup (GTXT ("Inclusive OpenMP Explicit Barrier Time")); + abbr = dbe_strdup (GTXT ("Incl. OMP e-barr.")); + } + else if (st == ATTRIBUTED) + { + name = dbe_strdup (GTXT ("Attributed OpenMP Explicit Barrier Time")); + abbr = dbe_strdup (GTXT ("Attr. OMP e-barr.")); + } + else + { + name = dbe_sprintf (GTXT ("Unexpected OpenMP Explicit Barrier metric subtype %d"), st); + abbr = dbe_strdup (NTXT ("??")); + } + break; + case OMP_WAIT: + abbr_unit = dbe_strdup (GTXT ("sec.")); + if (st == EXCLUSIVE) + { + name = dbe_strdup (GTXT ("Exclusive OpenMP Wait Time")); + abbr = dbe_strdup (GTXT ("Excl. OMP Wait")); + } + else if (st == INCLUSIVE) + { + name = dbe_strdup (GTXT ("Inclusive OpenMP Wait Time")); + abbr = dbe_strdup (GTXT ("Incl. OMP Wait")); + } + else if (st == ATTRIBUTED) + { + name = dbe_strdup (GTXT ("Attributed OpenMP Wait Time")); + abbr = dbe_strdup (GTXT ("Attr. OMP Wait")); + } + else + { + name = dbe_sprintf (GTXT ("Unexpected OpenMP Wait metric subtype %d"), st); + abbr = dbe_strdup (NTXT ("??")); + } + break; + case OMP_SERL: + abbr_unit = dbe_strdup (GTXT ("sec.")); + if (st == EXCLUSIVE) + { + name = dbe_strdup (GTXT ("Exclusive OpenMP Serial Time")); + abbr = dbe_strdup (GTXT ("Excl. OMP serl")); + } + else if (st == INCLUSIVE) + { + name = dbe_strdup (GTXT ("Inclusive OpenMP Serial Time")); + abbr = dbe_strdup (GTXT ("Incl. OMP serl")); + } + else if (st == ATTRIBUTED) + { + name = dbe_strdup (GTXT ("Attributed OpenMP Serial Time")); + abbr = dbe_strdup (GTXT ("Attr. OMP serl")); + } + else + { + name = dbe_sprintf (GTXT ("Unexpected OpenMP Slave Idle metric subtype %d"), st); + abbr = dbe_strdup (NTXT ("??")); + } + break; + case OMP_RDUC: + abbr_unit = dbe_strdup (GTXT ("sec.")); + if (st == EXCLUSIVE) + { + name = dbe_strdup (GTXT ("Exclusive OpenMP Reduction Time")); + abbr = dbe_strdup (GTXT ("Excl. OMP rduc")); + } + else if (st == INCLUSIVE) + { + name = dbe_strdup (GTXT ("Inclusive OpenMP Reduction Time")); + abbr = dbe_strdup (GTXT ("Incl. OMP rduc")); + } + else if (st == ATTRIBUTED) + { + name = dbe_strdup (GTXT ("Attributed OpenMP Reduction Time")); + abbr = dbe_strdup (GTXT ("Attr. OMP rduc")); + } + else + { + name = dbe_sprintf (GTXT ("Unexpected OpenMP Reduction metric subtype %d"), st); + abbr = dbe_strdup (NTXT ("??")); + } + break; + case OMP_LKWT: + abbr_unit = dbe_strdup (GTXT ("sec.")); + if (st == EXCLUSIVE) + { + name = dbe_strdup (GTXT ("Exclusive OpenMP Lock Wait Time")); + abbr = dbe_strdup (GTXT ("Excl. OMP lkwt")); + } + else if (st == INCLUSIVE) + { + name = dbe_strdup (GTXT ("Inclusive OpenMP Lock Wait Time")); + abbr = dbe_strdup (GTXT ("Incl. OMP lkwt")); + } + else if (st == ATTRIBUTED) + { + name = dbe_strdup (GTXT ("Attributed OpenMP Lock Wait Time")); + abbr = dbe_strdup (GTXT ("Attr. OMP lkwt")); + } + else + { + name = dbe_sprintf (GTXT ("Unexpected OpenMP Lock Wait metric subtype %d"), st); + abbr = dbe_strdup (NTXT ("??")); + } + break; + case OMP_CTWT: + abbr_unit = dbe_strdup (GTXT ("sec.")); + if (st == EXCLUSIVE) + { + name = dbe_strdup (GTXT ("Exclusive OpenMP Critical Section Wait Time")); + abbr = dbe_strdup (GTXT ("Excl. OMP ctwt")); + } + else if (st == INCLUSIVE) + { + name = dbe_strdup (GTXT ("Inclusive OpenMP Critical Section Wait Time")); + abbr = dbe_strdup (GTXT ("Incl. OMP ctwt")); + } + else if (st == ATTRIBUTED) + { + name = dbe_strdup (GTXT ("Attributed OpenMP Critical Section Wait Time")); + abbr = dbe_strdup (GTXT ("Attr. OMP ctwt")); + } + else + { + name = dbe_sprintf (GTXT ("Unexpected OpenMP Critical Section Wait metric subtype %d"), st); + abbr = dbe_strdup (NTXT ("??")); + } + break; + case OMP_ODWT: + abbr_unit = dbe_strdup (GTXT ("sec.")); + if (st == EXCLUSIVE) + { + name = dbe_strdup (GTXT ("Exclusive OpenMP Ordered Section Wait Time")); + abbr = dbe_strdup (GTXT ("Excl. OMP odwt")); + } + else if (st == INCLUSIVE) + { + name = dbe_strdup (GTXT ("Inclusive OpenMP Ordered Section Wait Time")); + abbr = dbe_strdup (GTXT ("Incl. OMP odwt")); + } + else if (st == ATTRIBUTED) + { + name = dbe_strdup (GTXT ("Attributed OpenMP Ordered Section Wait Time")); + abbr = dbe_strdup (GTXT ("Attr. OMP odwt")); + } + else + { + name = dbe_sprintf (GTXT ("Unexpected OpenMP Ordered Section Wait metric subtype %d"), st); + abbr = dbe_strdup (NTXT ("??")); + } + break; + case OMP_MSTR: + abbr_unit = dbe_strdup (GTXT ("sec.")); + if (st == EXCLUSIVE) + { + name = dbe_strdup (GTXT ("Exclusive OpenMP Master Serial Time")); + abbr = dbe_strdup (GTXT ("Excl. OMP ser.")); + } + else if (st == INCLUSIVE) + { + name = dbe_strdup (GTXT ("Inclusive OpenMP Master Serial Time")); + abbr = dbe_strdup (GTXT ("Incl. OMP ser.")); + } + else if (st == ATTRIBUTED) + { + name = dbe_strdup (GTXT ("Attributed OpenMP Master Serial Time")); + abbr = dbe_strdup (GTXT ("Attr. OMP ser.")); + } + else + { + name = dbe_sprintf (GTXT ("Unexpected OpenMP Master Serial metric subtype %d"), st); + abbr = dbe_strdup (NTXT ("??")); + } + break; + case OMP_SNGL: + abbr_unit = dbe_strdup (GTXT ("sec.")); + if (st == EXCLUSIVE) + { + name = dbe_strdup (GTXT ("Exclusive OpenMP Single Region Time")); + abbr = dbe_strdup (GTXT ("Excl. OMP sngl")); + } + else if (st == INCLUSIVE) + { + name = dbe_strdup (GTXT ("Inclusive OpenMP Single Region Time")); + abbr = dbe_strdup (GTXT ("Incl. OMP sngl")); + } + else if (st == ATTRIBUTED) + { + name = dbe_strdup (GTXT ("Attributed OpenMP Single Region Time")); + abbr = dbe_strdup (GTXT ("Attr. OMP sngl")); + } + else + { + name = dbe_sprintf (GTXT ("Unexpected OpenMP Single Region metric subtype %d"), st); + abbr = dbe_strdup (NTXT ("??")); + } + break; + case OMP_ORDD: + abbr_unit = dbe_strdup (GTXT ("sec.")); + if (st == EXCLUSIVE) + { + name = dbe_strdup (GTXT ("Exclusive OpenMP Ordered Region Time")); + abbr = dbe_strdup (GTXT ("Excl. OMP ordd")); + } + else if (st == INCLUSIVE) + { + name = dbe_strdup (GTXT ("Inclusive OpenMP Ordered Region Time")); + abbr = dbe_strdup (GTXT ("Incl. OMP ordd")); + } + else if (st == ATTRIBUTED) + { + name = dbe_strdup (GTXT ("Attributed OpenMP Ordered Region Time")); + abbr = dbe_strdup (GTXT ("Attr. OMP ordd")); + } + else + { + name = dbe_sprintf (GTXT ("Unexpected OpenMP Ordered Region metric subtype %d"), st); + abbr = dbe_strdup (NTXT ("??")); + } + break; + case RACCESS: + if (st == EXCLUSIVE) + { + name = dbe_strdup (GTXT ("Exclusive Race Accesses")); + abbr = dbe_strdup (GTXT ("Excl. Race Accesses")); + } + else if (st == INCLUSIVE) + { + name = dbe_strdup (GTXT ("Inclusive Race Accesses")); + abbr = dbe_strdup (GTXT ("Incl. Race Accesses")); + } + else if (st == ATTRIBUTED) + { + name = dbe_strdup (GTXT ("Attributed Race Accesses")); + abbr = dbe_strdup (GTXT ("Attr. Race Accesses")); + } + else + { + name = dbe_sprintf (GTXT ("Unexpected Race Access metric subtype %d"), st); + abbr = dbe_strdup (NTXT ("??")); + } + break; + case DEADLOCKS: + if (st == EXCLUSIVE) + { + name = dbe_strdup (GTXT ("Exclusive Deadlocks")); + abbr = dbe_strdup (GTXT ("Excl. Deadlocks")); + } + else if (st == INCLUSIVE) + { + name = dbe_strdup (GTXT ("Inclusive Deadlocks")); + abbr = dbe_strdup (GTXT ("Incl. Deadlocks")); + } + else if (st == ATTRIBUTED) + { + name = dbe_strdup (GTXT ("Attributed Deadlocks")); + abbr = dbe_strdup (GTXT ("Attr. Deadlocks")); + } + else + { + name = dbe_sprintf (GTXT ("Unexpected Deadlocks metric subtype %d"), st); + abbr = dbe_strdup (NTXT ("??")); + } + break; + default: + abort (); + } +} //Metric::set_subtype + +static bool +is_width_ok (int lines, size_t width, size_t *tlen, int last) +{ + size_t len = 0; + for (int i = 0; i <= last; i++) + { + if (len != 0) + len++; + if (len + tlen[i] > width) + { + if (--lines == 0) + return false; + len = 0; + } + len += tlen[i]; + } + return true; +} + +void +Metric::legend_width (HistMetric *hitem, int gap) +{ + size_t tlen[MAX_LEN]; + char *tok[MAX_LEN], buf[MAX_LEN], unit[MAX_LEN]; + hitem->width = hitem->maxtime_width; + if (hitem->maxvalue_width > 0) + { + if (hitem->width > 0) + hitem->width++; + hitem->width += hitem->maxvalue_width; + } + if (is_pvisible ()) + { + if (hitem->width > 0) + { + hitem->width++; + } + hitem->width += 6; // adjust to change format from xx.yy% + } + snprintf (buf, sizeof (buf), "%s", get_abbr ()); + size_t max_len = hitem->width; + if (legend) + { + size_t legend_len = strlen (legend); + if (max_len < legend_len) + max_len = legend_len; + } + tok[0] = buf; + int last = 0; + for (int i = 0;; i++) + { + if (buf[i] == ' ') + { + buf[i] = '\0'; + while (buf[i + 1] == ' ') + i++; + tlen[last] = strlen (tok[last]); + if (max_len < tlen[last]) + max_len = tlen[last]; + last++; + tok[last] = buf + i + 1; + } + else if (buf[i] == '\0') + { + tlen[last] = strlen (tok[last]); + if (max_len < tlen[last]) + max_len = tlen[last]; + if (tlen[last] == 0 && last > 0) + last--; + break; + } + } + + *unit = '\0'; // get the extra unit tokens + int max_lines = 3; + if (is_tvisible ()) + { + char *s = GTXT ("sec."); + if ((get_visbits () & VAL_DELTA) != 0) + s = GTXT ("delta"); + else if ((get_visbits () & VAL_RATIO) != 0) + s = GTXT ("ratio"); + long len = strlen (s); + if (hitem->maxtime_width < len) + { + hitem->width += len - hitem->maxtime_width; + hitem->maxtime_width = len; + } + snprintf (unit, sizeof (unit), "%*s", (int) hitem->maxtime_width, s); + } + if (is_visible ()) + { + char *s = NTXT (""); + if (!is_tvisible ()) + { + if ((get_visbits () & VAL_DELTA) != 0) + s = GTXT ("delta"); + else if ((get_visbits () & VAL_RATIO) != 0) + s = GTXT ("ratio"); + else if ((get_value_styles () & VAL_TIMEVAL) != 0 && !is_time_val ()) + s = GTXT ("sec."); + } + long len = strlen (s); + if (hitem->maxvalue_width < len) + { + hitem->width += len - hitem->maxvalue_width; + hitem->maxvalue_width = len; + } + if (*unit) + { + max_lines = 2; + len = strlen (unit); + snprintf (unit + len, sizeof (unit) - len, " %*s", + (int) hitem->maxvalue_width, s); + } + else + snprintf (unit, sizeof (unit), "%*s", (int) hitem->maxvalue_width, s); + } + if (is_pvisible ()) + { + max_lines = 2; + if (*unit) + { + size_t len = strlen (unit); + snprintf (unit + len, sizeof (unit) - len, GTXT (" %%")); + } + else + snprintf (unit, sizeof (unit), GTXT (" %%")); + } + for (size_t i = strlen (unit); i > 0;) + { // remove trailing spaces + i--; + if (unit[i] != ' ') + break; + unit[i] = 0; + } + + if (*unit) + { + last++; + tlen[last] = strlen (unit); + tok[last] = unit; + if (max_len < tlen[last]) + max_len = tlen[last]; + if (max_lines == 3 && *unit == ' ') + { + char *str = unit; + while (*str == ' ') + str++; + tlen[last] = strlen (str); + tok[last] = str; + } + } + + int last1 = max_lines == 3 ? last : last - 1; + while (!is_width_ok (max_lines, max_len, tlen, last1)) + max_len++; + hitem->width = max_len + gap; + + char *legends[3]; + legends[0] = hitem->legend1; + legends[1] = hitem->legend2; + legends[2] = hitem->legend3; + for (int i = 0, ind = 0; i < 3; i++) + { + char *str = legends[i]; + *str = 0; + for (; ind <= last; ind++) + { + if (*unit && (ind == last)) + { + // Try to put 'unit' in 'legend3' + if (i != 2) + { + tok[last] = unit; // restore a formated 'unit' + break; + } + } + size_t len = strlen (str); + if (len != 0) + { + if (len + 1 + tlen[ind] > max_len) + break; + snprintf (str + len, MAX_LEN - len, NTXT (" %s"), tok[ind]); + } + else + { + if (len + tlen[ind] > max_len) + break; + snprintf (str + len, MAX_LEN - len, NTXT ("%s"), tok[ind]); + } + } + } +} + +int +Metric::get_real_visbits () +{ + int v = visbits; + if (!is_time_val () && (visbits & (VAL_TIMEVAL | VAL_VALUE)) != 0) + { + v &= ~(VAL_TIMEVAL | VAL_VALUE); + v |= (get_value_styles () & (VAL_TIMEVAL | VAL_VALUE)); + } + return v; +} + +char * +Metric::get_vis_string (int vis) +{ + char *vis_str; + if (subtype == STATIC) + vis_str = NTXT (""); + else + { + int v; + if (is_time_val ()) + v = vis & (VAL_TIMEVAL | VAL_VALUE | VAL_PERCENT); + else + { + v = vis & VAL_PERCENT; + if ((vis & (VAL_TIMEVAL | VAL_VALUE)) != 0) + v |= (get_value_styles () & (VAL_TIMEVAL | VAL_VALUE)); + } + switch (v) + { + case VAL_TIMEVAL: + vis_str = NTXT ("."); + break; + case VAL_VALUE: + vis_str = NTXT ("+"); + break; + case VAL_TIMEVAL | VAL_VALUE: + vis_str = NTXT (".+"); + break; + case VAL_PERCENT: + vis_str = NTXT ("%"); + break; + case VAL_TIMEVAL | VAL_PERCENT: + vis_str = NTXT (".%"); + break; + case VAL_VALUE | VAL_PERCENT: + vis_str = NTXT ("+%"); + break; + case VAL_TIMEVAL | VAL_VALUE | VAL_PERCENT: + vis_str = NTXT (".+%"); + break; + default: + vis_str = NTXT ("!"); + break; + } + } + return vis_str; +} + +char * +Metric::get_vis_str () +{ + char *vis_str = NULL; + if (visbits == -1) + { + // unitialized, return all possible with a trailing - + if (subtype == STATIC) + vis_str = NTXT (".-"); + else if (is_time_val ()) + vis_str = NTXT (".+%-"); + else + vis_str = NTXT (".%-"); + } + else + vis_str = get_vis_string (get_real_visbits ()); + return vis_str; +} + +void +Metric::set_dmetrics_visbits (int dmetrics_visbits) +{ + visbits = VAL_NA; // clear global state + + // process the "show" bits + int _visbits = dmetrics_visbits & ~VAL_HIDE_ALL; + assert (_visbits != -1); + if (_visbits == 0) + return; // done. (Ignore VAL_HIDE_ALL since there's nothing to hide.) + if (get_subtype () == STATIC) + // percent, time value not applicable + visbits = VAL_VALUE; + else + { + // now or in the bits, but manage . and + according to the is_time_val setting + if (is_time_val () == 0) + { + if ((_visbits & VAL_VALUE) || (_visbits & VAL_TIMEVAL)) + visbits |= VAL_VALUE; + } + else + visbits |= (_visbits & (VAL_VALUE | VAL_TIMEVAL)); + visbits |= (_visbits & (VAL_PERCENT | VAL_RATIO | VAL_DELTA)); + } + // process the "hide" bit + if (dmetrics_visbits & VAL_HIDE_ALL) + visbits |= VAL_HIDE_ALL; +} + +void +Metric::set_vvisible (bool set) +{ + if (set) + { + visbits |= VAL_VALUE; + visbits &= ~VAL_HIDE_ALL; + } + else + visbits &= ~VAL_VALUE; +} + +void +Metric::set_tvisible (bool set) +{ + if (set) + { + visbits |= VAL_TIMEVAL; + visbits &= ~VAL_HIDE_ALL; + } + else + visbits &= ~VAL_TIMEVAL; +} + +void +Metric::set_pvisible (bool set) +{ + if (set) + { + visbits |= VAL_PERCENT; + visbits &= ~VAL_HIDE_ALL; + } + else + visbits &= ~VAL_PERCENT; +} + +char * +Metric::get_mcmd (bool allPossible) +{ + char *sc = NTXT (""); // subtype == STATIC + char *hide; + char *vis = get_vis_string (allPossible ? get_value_styles () + : get_real_visbits ()); + if (subtype == INCLUSIVE) + sc = NTXT ("i"); + else if (subtype == EXCLUSIVE) + sc = NTXT ("e"); + else if (subtype == ATTRIBUTED) + sc = NTXT ("a"); + else if (subtype == DATASPACE) + sc = NTXT ("d"); + if (allPossible) + hide = NTXT (""); + else if (visbits == VAL_NA || (visbits & VAL_HIDE_ALL) != 0) + hide = NTXT ("!"); + else + hide = NTXT (""); + + char *mcmd = get_cmd (); + return dbe_sprintf (GTXT ("%s%s%s%s"), sc, hide, vis, mcmd); +} + +char * +Metric::dump () +{ + int len = 4; + BaseMetric *bm = (BaseMetric *) this; + char *s = bm->dump (); + char *msg = dbe_sprintf ("%s\n%*c subtype=%d time_val=%d vis=%d tvis=%d" + " pvis=%d\n%*c abbr='%s' cmd='%s' name='%s'\n", + STR (s), len, ' ', get_subtype (), is_time_val (), + is_visible (), is_tvisible (), is_pvisible (), + len, ' ', STR (get_abbr ()), STR (get_cmd ()), + STR (get_name ())); + free (s); + return msg; +} + |