Blame maint/decode_handle

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<----