fis-gtm/sr_port/mlk_shr_init.c

75 lines
2.2 KiB
C
Raw Permalink Normal View History

/****************************************************************
* *
* Copyright 2001, 2012 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 "gtm_string.h"
#include "mlkdef.h"
#include "gdsroot.h"
#include "gtm_facility.h"
#include "fileinfo.h"
#include "gdsbt.h"
#include "gdsfhead.h"
#include "mlk_shr_init.h"
void mlk_shr_init(sm_uc_ptr_t base,
int4 size,
sgmnt_addrs *csa,
boolean_t read_write)
{
int i, nr_blocks, nr_procs;
sm_uc_ptr_t cp;
mlk_shrblk_ptr_t sb;
mlk_prcblk_ptr_t pb;
mlk_ctldata_ptr_t ctl;
/* there are four sections with the following approximate sizes
* mlk_ctldata --> SIZEOF(mlk_ctldata)
* mlk_shrblk --> size * 5/8 (consisting of nr_blocks number of mlk_shrblk structures)
* mlk_prcblk --> size * 1/8 (consisting of nr_procs number of mlk_prcblk structures)
* mlk_shrsubs --> size * 2/8 - SIZEOF(mlk_ctldata) (consisting of variable number of variable length subscript strings)
* Total block counts are recorded in ctl->max_* becuase those values are used for free lock space calculation.
* (see:lke_show.c and mlk_unlock.c)
*/
nr_blocks = ((size >> 1) + (size >> 3)) / SIZEOF(mlk_shrblk); /* size/2 + size/8 = size*5/8 */
nr_procs = (size >> 3) / SIZEOF(mlk_prcblk);
memset(base, 0, size);
ctl = (mlk_ctldata_ptr_t)base;
sb = (mlk_shrblk_ptr_t)(ctl + 1);
ctl->wakeups = 1;
A2R(ctl->blkfree, sb);
ctl->blkcnt = nr_blocks;
ctl->max_blkcnt = nr_blocks;
for (i = 1; i < nr_blocks ; i++, sb++)
{
A2R(sb->rsib, sb + 1);
}
pb = (mlk_prcblk_ptr_t)(sb + 1);
A2R(ctl->prcfree, pb);
ctl->prccnt = nr_procs;
ctl->max_prccnt = nr_procs;
for (i = 1; i < nr_procs ; i++, pb++)
{
A2R(pb->next, pb + 1);
}
cp = (sm_uc_ptr_t)(pb + 1);
A2R(ctl->subbase, cp);
A2R(ctl->subfree, cp);
cp = (sm_uc_ptr_t)base + size;
A2R(ctl->subtop ,cp);
assert(ctl->subtop > ctl->subbase);
if (read_write)
csa->hdr->trans_hist.lock_sequence = 0;
return;
}