fis-gtm/sr_port/mlk_pvtblk_insert.c

97 lines
2.2 KiB
C

/****************************************************************
* *
* Copyright 2001, 2004 Sanchez Computer Associates, 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 "gdsfhead.h"
#include "mlkdef.h"
#include "locklits.h"
#include "cmidef.h"
#include "hashtab_mname.h" /* needed for cmmdef.h */
#include "cmmdef.h"
#include "mlk_pvtblk_insert.h"
#include "mlk_pvtblk_equ.h"
GBLREF mlk_pvtblk *mlk_pvt_root;
GBLREF short lks_this_cmd;
GBLREF bool remlkreq;
int mlk_pvtblk_insert(mlk_pvtblk *pblk)
{
bool new;
mlk_pvtblk *temp, *inlist1, *inlist2, *save_store;
if (pblk->region->dyn.addr->acc_meth == dba_cm)
{
save_store = mlk_pvt_root;
mlk_pvt_root = ((link_info *)pblk->region->dyn.addr->cm_blk->usr)->netlocks;
}
if (!mlk_pvt_root)
{
mlk_pvt_root = pblk;
mlk_pvt_root->translev = 1;
mlk_pvt_root->trans = TRUE;
new = TRUE;
}
else
{
inlist1 = inlist2 = mlk_pvt_root;
while (inlist1 && !mlk_pvtblk_equ(pblk,inlist1))
{
inlist2 = inlist1;
inlist1 = inlist1->next;
}
if (inlist1)
{
new = FALSE;
if (inlist1->trans)
{ inlist1->translev++;
}
else
{ inlist1->translev = 1;
inlist1->trans = TRUE;
inlist1->old = TRUE;
}
inlist2->next = inlist1->next;
if (inlist1 != mlk_pvt_root)
{
inlist1->next = mlk_pvt_root;
mlk_pvt_root = inlist1;
}
}
else
{
pblk->translev = 1;
pblk->trans = 1;
pblk->next = mlk_pvt_root;
mlk_pvt_root = pblk;
new = TRUE;
}
}
if (pblk->region->dyn.addr->acc_meth == dba_cm)
{
((link_info *)pblk->region->dyn.addr->cm_blk->usr)->netlocks = mlk_pvt_root;
((link_info *)pblk->region->dyn.addr->cm_blk->usr)->lck_info |= REQUEST_PENDING;
mlk_pvt_root = save_store;
remlkreq = TRUE;
}
else
{
if (mlk_pvt_root->translev == 1)
lks_this_cmd++;
}
return (new);
}