82 lines
2.0 KiB
C
82 lines
2.0 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 "locklits.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"
|
|
#include "mlk_lock.h"
|
|
#include "mlk_bckout.h"
|
|
|
|
GBLREF connection_struct *curr_entry;
|
|
GBLDEF mlk_pvtblk *mlk_cm_root = 0;
|
|
GBLDEF unsigned short cm_cmd_lk_ct;
|
|
|
|
char gtcml_lock_internal(cm_region_list *reg, unsigned char action)
|
|
{
|
|
mlk_pvtblk *x, *y;
|
|
unsigned int wakeup, status;
|
|
unsigned short locks_done, locks_bckout;
|
|
|
|
for (x = mlk_cm_root, locks_done = 0; locks_done < cm_cmd_lk_ct; x = x->next, locks_done++)
|
|
{
|
|
if (ZALLOCATED == action && x->old && !x->zalloc)
|
|
x->old = FALSE;
|
|
if (!(wakeup = mlk_lock(x, (UINTPTR_T)curr_entry, CMMS_L_LKACQUIRE == curr_entry->state ? FALSE : TRUE)))
|
|
{
|
|
switch (action)
|
|
{
|
|
case LOCKED:
|
|
x->level = 1;
|
|
break;
|
|
case INCREMENTAL:
|
|
x->level += x->translev;
|
|
break;
|
|
case ZALLOCATED:
|
|
x->zalloc = TRUE;
|
|
break;
|
|
default:
|
|
GTMASSERT;
|
|
}
|
|
x->granted = TRUE;
|
|
} else
|
|
{
|
|
if (x->granted)
|
|
{
|
|
x->zalloc = FALSE;
|
|
x->level = 0;
|
|
x->old = FALSE;
|
|
x->granted = FALSE;
|
|
}
|
|
for (y = mlk_cm_root, locks_bckout = 0; locks_bckout < locks_done; y = y->next, locks_bckout++)
|
|
{
|
|
assert(y->granted && y != x);
|
|
mlk_bckout(y, action);
|
|
}
|
|
if (!x->nodptr)
|
|
{
|
|
start_timer((TID)curr_entry, CM_LKSTARVE_TIME, gtcml_lkstarve, SIZEOF(curr_entry),
|
|
(char *)&curr_entry);
|
|
return STARVED;
|
|
}
|
|
/* insert in blocked structure */
|
|
gtcml_blklck(reg, x, wakeup);
|
|
return BLOCKED;
|
|
}
|
|
}
|
|
return GRANTED;
|
|
}
|