|
Packit |
0848f5 |
#!/usr/bin/env perl
|
|
Packit |
0848f5 |
#
|
|
Packit |
0848f5 |
# (C) 2011 by Argonne National Laboratory.
|
|
Packit |
0848f5 |
# See COPYRIGHT in top-level directory.
|
|
Packit |
0848f5 |
#
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
# A simple perl script that takes handle values as arguments and decodes them.
|
|
Packit |
0848f5 |
# It can help minimize distraction in your brain during a marathon debugging
|
|
Packit |
0848f5 |
# session that comes from manually decoding these values.
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
use strict;
|
|
Packit |
0848f5 |
use warnings;
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
# the order here matters
|
|
Packit |
0848f5 |
my @kind_table = qw(
|
|
Packit |
0848f5 |
INVALID
|
|
Packit |
0848f5 |
COMM
|
|
Packit |
0848f5 |
GROUP
|
|
Packit |
0848f5 |
DATATYPE
|
|
Packit |
0848f5 |
FILE
|
|
Packit |
0848f5 |
ERRHANDLER
|
|
Packit |
0848f5 |
OP
|
|
Packit |
0848f5 |
INFO
|
|
Packit |
0848f5 |
WIN
|
|
Packit |
0848f5 |
KEYVAL
|
|
Packit |
0848f5 |
ATTR
|
|
Packit |
0848f5 |
REQUEST
|
|
Packit |
0848f5 |
PROCGROUP
|
|
Packit |
0848f5 |
VCONN
|
|
Packit |
0848f5 |
GREQ_CLASS
|
|
Packit |
0848f5 |
);
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
my @type_table = qw(
|
|
Packit |
0848f5 |
INVALID
|
|
Packit |
0848f5 |
BUILTIN
|
|
Packit |
0848f5 |
DIRECT
|
|
Packit |
0848f5 |
INDIRECT
|
|
Packit |
0848f5 |
);
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
while (scalar @ARGV) {
|
|
Packit |
0848f5 |
my $arg = shift @ARGV;
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
# handle the (common) case of a hex value instead of a decimal integer
|
|
Packit |
0848f5 |
if ($arg =~ m/^0x[0-9a-fA-F]+$/) {
|
|
Packit |
0848f5 |
$arg = hex $arg;
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
my $kind = ($arg & 0x3c000000) >> 26;
|
|
Packit |
0848f5 |
my $type = ($arg & 0xc0000000) >> 30;
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
if ($kind_table[$kind] eq "DATATYPE" and $type_table[$type] eq "BUILTIN") {
|
|
Packit |
0848f5 |
my $datatype_size = ($arg & 0x0000ff00) >> 8;
|
|
Packit |
0848f5 |
printf("value=0x%08x kind=0x%x (%10s) type=0x%x (%8s) size=%d (0x%x)\n", $arg, $kind, $kind_table[$kind], $type, $type_table[$type], $datatype_size, $datatype_size);
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
else {
|
|
Packit |
0848f5 |
printf("value=0x%08x kind=0x%x (%10s) type=0x%x (%8s)\n", $arg, $kind, $kind_table[$kind], $type, $type_table[$type]);
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
## code from src/include/mpihandlemem.h from which this script was derived
|
|
Packit |
0848f5 |
## ----8<----
|
|
Packit |
0848f5 |
##
|
|
Packit |
0848f5 |
## typedef enum MPID_Object_kind {
|
|
Packit |
0848f5 |
## MPID_COMM = 0x1,
|
|
Packit |
0848f5 |
## MPID_GROUP = 0x2,
|
|
Packit |
0848f5 |
## MPID_DATATYPE = 0x3,
|
|
Packit |
0848f5 |
## MPID_FILE = 0x4, /* This is not used */
|
|
Packit |
0848f5 |
## MPID_ERRHANDLER = 0x5,
|
|
Packit |
0848f5 |
## MPID_OP = 0x6,
|
|
Packit |
0848f5 |
## MPID_INFO = 0x7,
|
|
Packit |
0848f5 |
## MPID_WIN = 0x8,
|
|
Packit |
0848f5 |
## MPID_KEYVAL = 0x9,
|
|
Packit |
0848f5 |
## MPID_ATTR = 0xa,
|
|
Packit |
0848f5 |
## MPID_REQUEST = 0xb,
|
|
Packit |
0848f5 |
## MPID_PROCGROUP = 0xc, /* These are internal device objects */
|
|
Packit |
0848f5 |
## MPID_VCONN = 0xd,
|
|
Packit |
0848f5 |
## MPID_GREQ_CLASS = 0xf
|
|
Packit |
0848f5 |
## } MPID_Object_kind;
|
|
Packit |
0848f5 |
##
|
|
Packit |
0848f5 |
## #define HANDLE_MPI_KIND_SHIFT 26
|
|
Packit |
0848f5 |
## #define HANDLE_GET_MPI_KIND(a) ( ((a)&0x3c000000) >> HANDLE_MPI_KIND_SHIFT )
|
|
Packit |
0848f5 |
## #define HANDLE_SET_MPI_KIND(a,kind) ((a) | ((kind) << HANDLE_MPI_KIND_SHIFT))
|
|
Packit |
0848f5 |
##
|
|
Packit |
0848f5 |
## /* returns the name of the handle kind for debugging/logging purposes */
|
|
Packit |
0848f5 |
## const char *MPIU_Handle_get_kind_str(int kind);
|
|
Packit |
0848f5 |
##
|
|
Packit |
0848f5 |
## /* Handle types. These are really 2 bits */
|
|
Packit |
0848f5 |
## #define HANDLE_KIND_INVALID 0x0
|
|
Packit |
0848f5 |
## #define HANDLE_KIND_BUILTIN 0x1
|
|
Packit |
0848f5 |
## #define HANDLE_KIND_DIRECT 0x2
|
|
Packit |
0848f5 |
## #define HANDLE_KIND_INDIRECT 0x3
|
|
Packit |
0848f5 |
## /* Mask assumes that ints are at least 4 bytes */
|
|
Packit |
0848f5 |
## #define HANDLE_KIND_MASK 0xc0000000
|
|
Packit |
0848f5 |
## #define HANDLE_KIND_SHIFT 30
|
|
Packit |
0848f5 |
## #define HANDLE_GET_KIND(a) (((unsigned)(a)&HANDLE_KIND_MASK)>>HANDLE_KIND_SHIFT)
|
|
Packit |
0848f5 |
## #define HANDLE_SET_KIND(a,kind) ((a)|((kind)<
|
|
Packit |
0848f5 |
##
|
|
Packit |
0848f5 |
## /* For indirect, the remainder of the handle has a block and index */
|
|
Packit |
0848f5 |
## #define HANDLE_INDIRECT_SHIFT 16
|
|
Packit |
0848f5 |
## #define HANDLE_BLOCK(a) (((a)& 0x03FF0000) >> HANDLE_INDIRECT_SHIFT)
|
|
Packit |
0848f5 |
## #define HANDLE_BLOCK_INDEX(a) ((a) & 0x0000FFFF)
|
|
Packit |
0848f5 |
##
|
|
Packit |
0848f5 |
## /* Handle block is between 1 and 1024 *elements* */
|
|
Packit |
0848f5 |
## #define HANDLE_BLOCK_SIZE 256
|
|
Packit |
0848f5 |
## /* Index size is bewtween 1 and 65536 *elements* */
|
|
Packit |
0848f5 |
## #define HANDLE_BLOCK_INDEX_SIZE 1024
|
|
Packit |
0848f5 |
##
|
|
Packit |
0848f5 |
## /* For direct, the remainder of the handle is the index into a predefined
|
|
Packit |
0848f5 |
## block */
|
|
Packit |
0848f5 |
## #define HANDLE_MASK 0x03FFFFFF
|
|
Packit |
0848f5 |
## #define HANDLE_INDEX(a) ((a)& HANDLE_MASK)
|
|
Packit |
0848f5 |
## ----8<----
|