fis-gtm/sr_port_cm/gtcml_blklck.c

120 lines
2.9 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. *
* *
****************************************************************/
#include "mdef.h"
#include "mlkdef.h"
#include "cmidef.h"
#include "hashtab_mname.h" /* needed for cmmdef.h */
#include "cmmdef.h"
#include "gt_timer.h"
#include "gtcmlkdef.h"
#include "gtcml.h"
GBLREF cm_lckblkreg *blkdlist;
GBLREF connection_struct *curr_entry;
void gtcml_blklck(cm_region_list *region, mlk_pvtblk *lock, uint4 wake)
{
cm_lckblkreg *b, *b1;
cm_lckblklck *l, *l1, *l2, *tl1;
cm_lckblkprc *p, *p1, *p2, *pl1;
uint4 status;
boolean_t new;
region->blkd = lock;
if (curr_entry->state != CMMS_L_LKACQUIRE)
return;
new = FALSE;
if (!region->reghead->wakeup)
region->reghead->wakeup = wake;
for (b1 = b = blkdlist; b; b1 = b, b = b->next)
if (b->region == region->reghead)
break;
if (!b)
{
new = TRUE;
b = (cm_lckblkreg *)malloc(SIZEOF(cm_lckblkreg));
b->next = 0;
b->region = region->reghead;
b->pass = CM_BLKPASS;
b->lock = (cm_lckblklck *)malloc(SIZEOF(cm_lckblklck));
l = (cm_lckblklck *)malloc(SIZEOF(cm_lckblklck));
l->node = lock->nodptr;
l->next = l->last = b->lock;
l->sequence = lock->nodptr->sequence;
sys_get_curr_time(&l->blktime);
p = (cm_lckblkprc *)malloc(SIZEOF(cm_lckblkprc));
p->user = curr_entry;
p->blocked = lock->blocked;
assert(lock->blocked);
p->blk_sequence = lock->blocked->sequence;
p->next = p->last = p;
l->prc = p;
b->lock->next = b->lock->last = l;
}
if (!blkdlist)
{
blkdlist = b;
return;
}
if (b1 != b)
b1->next = b;
if (!new)
{
for (l1 = b->lock->next, l2 = l1->next; l2 != b->lock;l1 = l1->next, l2 = l1->next)
{
if (l1->node == lock->nodptr)
break;
}
if (l1->node != lock->nodptr)
{
tl1 = (cm_lckblklck *)malloc(SIZEOF(cm_lckblklck));
tl1->node = lock->nodptr;
tl1->next = l1->next;
tl1->last = l1;
l1->next->last = tl1;
l1->next = tl1;
tl1->prc = 0;
sys_get_curr_time(&tl1->blktime); /* get blking time */
l1 = tl1;
}
l1->sequence = lock->nodptr->sequence;
p1 = l1->prc;
if (p1)
{
for (p2 = p1->next; p2 != l1->prc;p1 = p1->next, p2 = p1->next)
{
if (p1->user == curr_entry)
break;
}
}
if (!p1 || p1->user != curr_entry)
{
pl1 = (cm_lckblkprc *)malloc(SIZEOF(cm_lckblkprc));
if (!p1)
{
l1->prc = pl1;
pl1->next = pl1->last = pl1;
} else
{
pl1->next = p1->next;
pl1->last = p1;
p1->next->last = pl1;
p1->next = pl1;
}
pl1->user = curr_entry;
pl1->blocked = lock->blocked;
assert(lock->blocked);
pl1->blk_sequence = lock->blocked->sequence;
}
}
}