/****************************************************************
 *								*
 * Copyright (c) 2001-2016 Fidelity National Information	*
 * Services, Inc. and/or its subsidiaries. All rights reserved.	*
 *								*
 *	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 don't 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);
				/* Fix rctl->csa->miscptr in rctl0 and rctl1 */
				if (NULL != rctl0->csa)
					rctl0->csa->miscptr = (void *)rctl0;
				if (NULL != rctl1->csa)
					rctl1->csa->miscptr = (void *)rctl1;
			}
		}
	}

}
