91 lines
2.3 KiB
C
91 lines
2.3 KiB
C
|
/****************************************************************
|
||
|
* *
|
||
|
* Copyright 2005, 2009 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. *
|
||
|
* *
|
||
|
****************************************************************/
|
||
|
|
||
|
#include "mdef.h"
|
||
|
|
||
|
#include "gtm_string.h"
|
||
|
|
||
|
#include "gdsroot.h"
|
||
|
#include "gdskill.h"
|
||
|
#include "gdsblk.h"
|
||
|
#include "gtm_facility.h"
|
||
|
#include "fileinfo.h"
|
||
|
#include "gdsbt.h"
|
||
|
#include "gdsfhead.h"
|
||
|
#include "gdsbml.h"
|
||
|
#include "gvcst_lbm_check.h"
|
||
|
|
||
|
/* Routines for checking status of database blocks using a given local bitmap */
|
||
|
|
||
|
|
||
|
|
||
|
/* There are two bits that denote the status of a block in the local bitmap:
|
||
|
|
||
|
0b00 busy
|
||
|
0b01 free
|
||
|
0b10 invalid
|
||
|
0b11 recycled (but free)
|
||
|
|
||
|
The low order bit can be used to denote busy or free so that is what
|
||
|
is actually tested.
|
||
|
|
||
|
Inputs: 1) pointer to local bit map data (blk_ptr + SIZEOF(blk_hdr)).
|
||
|
2) bit offset to test into bitmap.
|
||
|
*/
|
||
|
boolean_t gvcst_blk_is_allocated(uchar_ptr_t lbmap, int lm_offset)
|
||
|
{
|
||
|
int uchar_offset, uchar_offset_rem;
|
||
|
unsigned char result_byte;
|
||
|
uchar_ptr_t map_byte;
|
||
|
|
||
|
assert(BLKS_PER_LMAP * BML_BITS_PER_BLK > lm_offset);
|
||
|
uchar_offset = lm_offset / BITS_PER_UCHAR;
|
||
|
uchar_offset_rem = lm_offset % BITS_PER_UCHAR;
|
||
|
map_byte = lbmap + uchar_offset;
|
||
|
result_byte = (*map_byte >> uchar_offset_rem) & 0x3;
|
||
|
switch(result_byte)
|
||
|
{
|
||
|
case 0x00:
|
||
|
return TRUE;
|
||
|
case 0x01:
|
||
|
case 0x03:
|
||
|
return FALSE;
|
||
|
default:
|
||
|
GTMASSERT;
|
||
|
}
|
||
|
return FALSE; /* Can't get here but keep compiler happy */
|
||
|
}
|
||
|
|
||
|
/* Similarly this routine tells if the block was EVER allocated (allocated or recycled) */
|
||
|
boolean_t gvcst_blk_ever_allocated(uchar_ptr_t lbmap, int lm_offset)
|
||
|
{
|
||
|
int uchar_offset, uchar_offset_rem;
|
||
|
unsigned char result_byte;
|
||
|
uchar_ptr_t map_byte;
|
||
|
|
||
|
assert(BLKS_PER_LMAP * BML_BITS_PER_BLK > lm_offset);
|
||
|
uchar_offset = lm_offset / BITS_PER_UCHAR;
|
||
|
uchar_offset_rem = lm_offset % BITS_PER_UCHAR;
|
||
|
map_byte = lbmap + uchar_offset;
|
||
|
result_byte = (*map_byte >> uchar_offset_rem) & 0x3;
|
||
|
switch(result_byte)
|
||
|
{
|
||
|
case 0x00:
|
||
|
case 0x03:
|
||
|
return TRUE;
|
||
|
case 0x01:
|
||
|
return FALSE;
|
||
|
default:
|
||
|
GTMASSERT;
|
||
|
}
|
||
|
return FALSE; /* Can't get here but keep compiler happy */
|
||
|
}
|