127 lines
3.4 KiB
C
127 lines
3.4 KiB
C
/****************************************************************
|
|
* *
|
|
* Copyright 2001, 2012 Fidelity Information Services, Inc *
|
|
* *
|
|
* This source code contains the intellectual property *
|
|
* of its copyright holder(s), and is made available *
|
|
* under a license. If you do not know the terms of *
|
|
* the license, please stop and do not read further. *
|
|
* *
|
|
****************************************************************/
|
|
|
|
/*
|
|
* -----------------------------------
|
|
* lke_showtree : displays a lock tree
|
|
* used in : lke_show.c
|
|
* -----------------------------------
|
|
*/
|
|
|
|
#include "mdef.h"
|
|
|
|
#include <signal.h>
|
|
#include <stddef.h>
|
|
#include "gtm_string.h"
|
|
#include "gtm_stdio.h"
|
|
|
|
#include "mlkdef.h"
|
|
#include "cmidef.h"
|
|
#include "lke.h"
|
|
|
|
#define KDIM 64 /* max number of subscripts */
|
|
|
|
GBLREF VSIG_ATOMIC_T util_interrupt;
|
|
error_def(ERR_CTRLC);
|
|
|
|
void lke_show_memory(mlk_shrblk_ptr_t bhead, char *prefix)
|
|
{
|
|
mlk_shrblk_ptr_t b, bnext;
|
|
mlk_shrsub_ptr_t dsub;
|
|
char temp[MAX_ZWR_KEY_SZ + 1];
|
|
char new_prefix[KDIM+2];
|
|
|
|
SPRINTF(new_prefix, " %s", prefix);
|
|
for (b = bhead, bnext = 0; bnext != bhead; b = bnext)
|
|
{
|
|
dsub = (mlk_shrsub_ptr_t)R2A(b->value);
|
|
memcpy(temp, dsub->data, dsub->length);
|
|
temp[dsub->length] = '\0';
|
|
PRINTF("%s%s : [shrblk] %lx : [shrsub] %lx\n", prefix, temp, (long unsigned int) b, (long unsigned int) dsub);
|
|
if (b->children)
|
|
lke_show_memory((mlk_shrblk_ptr_t)R2A(b->children), new_prefix);
|
|
bnext = (mlk_shrblk_ptr_t)R2A(b->rsib);
|
|
}
|
|
}
|
|
|
|
/* Note:*shr_sub_size keeps track of total subscript area in lock space. Initialize *shr_sub_size to 0 before calling this.
|
|
* lke_showtree() will keep adding on previous value of shr_sub_size. If such info is not needed simply pass NULL to shr_sub_size
|
|
*/
|
|
bool lke_showtree(struct CLB *lnk,
|
|
mlk_shrblk_ptr_t tree,
|
|
bool all,
|
|
bool wait,
|
|
pid_t pid,
|
|
mstr one_lock,
|
|
bool memory,
|
|
int *shr_sub_size)
|
|
{
|
|
mlk_shrblk_ptr_t node, start[KDIM];
|
|
unsigned char subscript_offset[KDIM];
|
|
static char name_buffer[MAX_ZWR_KEY_SZ + 1];
|
|
static MSTR_DEF(name, 0, name_buffer);
|
|
int depth = 0;
|
|
bool locks = FALSE;
|
|
int string_size = 0;
|
|
|
|
if (memory)
|
|
{
|
|
lke_show_memory(tree, " ");
|
|
if (shr_sub_size)
|
|
(*shr_sub_size) = string_size;
|
|
return TRUE;
|
|
}
|
|
node = start[0]
|
|
= tree;
|
|
subscript_offset[0] = 0;
|
|
|
|
for (;;)
|
|
{
|
|
name.len = subscript_offset[depth];
|
|
string_size += MLK_SHRSUB_SIZE((mlk_shrsub_ptr_t)R2A(node->value));
|
|
/* Display the lock node */
|
|
locks = lke_showlock(lnk, node, &name, all, wait, TRUE, pid, one_lock, FALSE)
|
|
|| locks;
|
|
|
|
/* Move to the next node */
|
|
if (node->children == 0)
|
|
{
|
|
/* This node has no children, so move to the right */
|
|
node = (mlk_shrblk_ptr_t)R2A(node->rsib);
|
|
while (node == start[depth])
|
|
{
|
|
/* There are no more siblings to the right at this depth,
|
|
so move up and then right */
|
|
if (node->parent == 0)
|
|
{
|
|
/* We're already at the top, so we're done */
|
|
assert(depth == 0);
|
|
if (shr_sub_size)
|
|
(*shr_sub_size) = string_size;
|
|
return locks;
|
|
}
|
|
--depth;
|
|
node = (mlk_shrblk_ptr_t)R2A(((mlk_shrblk_ptr_t)R2A(node->parent))->rsib);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
/* This node has children, so move down */
|
|
++depth;
|
|
node = start[depth]
|
|
= (mlk_shrblk_ptr_t)R2A(node->children);
|
|
subscript_offset[depth] = name.len;
|
|
}
|
|
if (util_interrupt)
|
|
rts_error(VARLSTCNT(1) ERR_CTRLC);
|
|
}
|
|
}
|