/**************************************************************** * * * 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. * * * ****************************************************************/ #include "mdef.h" #include "gdsroot.h" #include "gtm_facility.h" #include "fileinfo.h" #include "gdsbt.h" #include "gdsblk.h" #include "gdsfhead.h" #include "gdscc.h" #include "gdsbml.h" #include "send_msg.h" /* prototypes */ #include "gvcst_map_build.h" #include "min_max.h" GBLREF gd_region *gv_cur_region; GBLREF sgmnt_addrs *cs_addrs; GBLREF boolean_t dse_running; GBLREF boolean_t mu_reorg_upgrd_dwngrd_in_prog; void gvcst_map_build(uint4 *array, sm_uc_ptr_t base_addr, cw_set_element *cs, trans_num ctn) { boolean_t status; uint4 (*bml_func)(); uint4 bitnum, ret; #ifdef DEBUG int4 prev_bitnum, actual_cnt = 0; #endif DEBUG_ONLY(VALIDATE_BM_BLK(cs->blk, (blk_hdr_ptr_t)base_addr, cs_addrs, gv_cur_region, status);) assert(status); /* assert it is a valid bitmap block */ ((blk_hdr_ptr_t)base_addr)->tn = ctn; base_addr += SIZEOF(blk_hdr); assert(cs_addrs->now_crit); /* Don't want to be messing with highest_lbm_with_busy_blk outside crit */ if (cs_addrs->nl->trunc_pid) { /* A truncate is in progress. We need to 1) update cnl->highest_lbm_with_busy_blk if needed and 2) select bml_free if this is a * t_recycled2free transaction. */ if (cs->reference_cnt > 0) { bml_func = bml_busy; cs_addrs->nl->highest_lbm_with_busy_blk = MAX(cs->blk, cs_addrs->nl->highest_lbm_with_busy_blk); } else if (cs->reference_cnt < 0) { if (cs_addrs->hdr->db_got_to_v5_once) bml_func = bml_recycled; else bml_func = bml_free; } else /* cs->reference_cnt == 0 */ { if (cs_addrs->hdr->db_got_to_v5_once && mu_reorg_upgrd_dwngrd_in_prog) bml_func = bml_recycled; else bml_func = bml_free; } } else /* Choose bml_func as it was chosen before truncate feature. */ bml_func = (cs->reference_cnt > 0) ? bml_busy : (cs_addrs->hdr->db_got_to_v5_once ? bml_recycled : bml_free); DEBUG_ONLY(prev_bitnum = -1;) while (bitnum = *array) /* caution : intended assignment */ { assert((uint4)bitnum < cs_addrs->hdr->bplmap); /* check that bitnum is positive and within 0 to bplmap */ assert((int4)bitnum > prev_bitnum); /* assert that blocks are sorted in the update array */ ret = (* bml_func)(bitnum, base_addr); DEBUG_ONLY( if (cs->reference_cnt > 0) actual_cnt++; /* block is being marked busy */ else if (!ret) actual_cnt--; /* block is transitioning from BUSY to either RECYCLED or FREE */ /* all other state changes do not involve updates to the free_blocks count */ ) array++; DEBUG_ONLY(prev_bitnum = (int4)bitnum); } assert(actual_cnt == cs->reference_cnt); }