81 lines
2.7 KiB
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);
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|