120 lines
2.9 KiB
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;
|
|
}
|
|
}
|
|
}
|