89 lines
2.3 KiB
C
89 lines
2.3 KiB
C
/****************************************************************
|
|
* *
|
|
* Copyright 2001, 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. *
|
|
* *
|
|
****************************************************************/
|
|
|
|
#ifdef VMS
|
|
#include <ssdef.h>
|
|
#endif
|
|
#include "mdef.h"
|
|
#include "gdsroot.h"
|
|
#include "gtm_facility.h"
|
|
#include "fileinfo.h"
|
|
#include "gdsbt.h"
|
|
#include "gdsfhead.h"
|
|
#include "filestruct.h"
|
|
#include "mlkdef.h"
|
|
#include "lockdefs.h"
|
|
|
|
/* Include prototypes */
|
|
#include "mlk_prcblk_delete.h"
|
|
#include "mlk_shrblk_delete_if_empty.h"
|
|
#include "mlk_shrclean.h"
|
|
#include "is_proc_alive.h"
|
|
|
|
GBLREF uint4 process_id;
|
|
|
|
void mlk_shrclean(gd_region *region,
|
|
mlk_ctldata_ptr_t ctl,
|
|
mlk_shrblk_ptr_t d)
|
|
{
|
|
mlk_shrblk_ptr_t d0, d1;
|
|
mlk_prcblk_ptr_t p;
|
|
int4 status, lcnt = 0, max_loop_tries;
|
|
unsigned int time[2],icount;
|
|
bool delete_status;
|
|
sgmnt_addrs *csa;
|
|
|
|
max_loop_tries = (int4)(((sm_uc_ptr_t)R2A(ctl->subtop) - (sm_uc_ptr_t)ctl) / SIZEOF(mlk_shrblk));
|
|
/* although more than the actual, it is better than underestimating */
|
|
|
|
for (d = d0 = (mlk_shrblk_ptr_t)R2A(d->rsib), d1 = NULL; d != d1 && max_loop_tries > lcnt; lcnt++)
|
|
{
|
|
delete_status = FALSE;
|
|
if (d0->children)
|
|
mlk_shrclean(region, ctl, (mlk_shrblk_ptr_t)R2A(d0->children));
|
|
d1 = (mlk_shrblk_ptr_t)R2A(d0->rsib);
|
|
if (d0->pending)
|
|
{
|
|
for (p = (mlk_prcblk_ptr_t)R2A(d0->pending); ; p = (mlk_prcblk_ptr_t)R2A(p->next))
|
|
{
|
|
if (PENDING_PROC_ALIVE(p,time,icount,status))
|
|
{ /* process pending does not exist, free prcblk */
|
|
p->process_id = 0;
|
|
p->ref_cnt = 0;
|
|
}
|
|
if (p->next == 0)
|
|
break;
|
|
}
|
|
}
|
|
mlk_prcblk_delete(ctl, d0, 0);
|
|
if (d0->owner)
|
|
{
|
|
if (PROC_ALIVE(d0,time,icount,status))
|
|
{ /* process that owned lock has left image, free lock */
|
|
csa = &FILE_INFO(region)->s_addrs;
|
|
d0->owner = 0;
|
|
d0->sequence = csa->hdr->trans_hist.lock_sequence++;
|
|
delete_status = mlk_shrblk_delete_if_empty(ctl,d0);
|
|
}
|
|
}else
|
|
delete_status = mlk_shrblk_delete_if_empty(ctl,d0);
|
|
|
|
if (delete_status && d0 == d)
|
|
{
|
|
d = d0 = (d0 == d1) ? NULL : d1;
|
|
d1 = NULL;
|
|
}
|
|
else
|
|
d0 = d1;
|
|
}
|
|
return;
|
|
}
|