fis-gtm/sr_port/mur_sort_files.c

81 lines
2.7 KiB
C

/****************************************************************
* *
* Copyright 2001, 2010 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 "gdsbt.h"
#include "gtm_facility.h"
#include "fileinfo.h"
#include "gdsblk.h"
#include "gdsfhead.h"
#include "filestruct.h"
#include "jnl.h"
#include "buddy_list.h" /* For muprec.h */
#include "hashtab_int4.h" /* needed for muprec.h */
#include "hashtab_int8.h" /* needed for muprec.h */
#include "hashtab_mname.h" /* needed for muprec.h */
#include "muprec.h"
GBLREF mur_gbls_t murgbl;
GBLREF reg_ctl_list *mur_ctl;
/* This sorts mur_ctl[].
* mur_ctl[x].lvrec_time is the last valid record's timestamp of journal file mur_ctl[x].jctl->jnl_fn.
* Sort mur_ctl[] so that:
* for x = 0 to (reg_total-2) we have :
* mur_ctl[x].lvrec_time <= mur_ctl[x+1].lvrec_time
* Note: Bubble sort is okay, since only a few elements are present. Use qsort() in case of large no. of regions
*/
void mur_sort_files(void)
{
int reg_total, regno;
reg_ctl_list temp, *rctl0, *rctl1;
jnl_ctl_list *jctl;
reg_total = murgbl.reg_total;
for (reg_total -= 2; reg_total >= 0; reg_total--)
{
for (regno = 0; regno <= reg_total; regno++)
{
rctl0 = &mur_ctl[regno];
rctl1 = rctl0 + 1;
if (rctl0->lvrec_time > rctl1->lvrec_time)
{
temp = *rctl0;
*rctl0 = *rctl1;
*rctl1 = temp;
/* Fix back pointers of jctl_head and jctl_alt_head lists in rctl0 */
jctl = rctl0->jctl_head;
MUR_FIX_JCTL_BACK_POINTER_TO_RCTL(jctl, rctl0, rctl1, TRUE);
/* When fixing jctl back pointers for jctl_alt_head, do not check prev_gen being NULL.
* This is because although it is non-NULL, that marks the beginning of the regular
* rctl->jctl_head linked list so we dont need to do any more special processing going
* backwards (only need to go forward from jctl_alt_head).
* Hence FALSE passed as the 4th parameter to MUR_FIX_JCTL_BACK_POINTER_TO_RCTL below
*/
jctl = rctl0->jctl_alt_head;
if (NULL != jctl)
MUR_FIX_JCTL_BACK_POINTER_TO_RCTL(jctl, rctl0, rctl1, FALSE);
/* Fix back pointers of jctl_head and jctl_alt_head lists in rctl1 */
jctl = rctl1->jctl_head;
MUR_FIX_JCTL_BACK_POINTER_TO_RCTL(jctl, rctl1, rctl0, TRUE);
jctl = rctl1->jctl_alt_head;
if (NULL != jctl)
MUR_FIX_JCTL_BACK_POINTER_TO_RCTL(jctl, rctl1, rctl0, FALSE);
}
}
}
}