75 lines
2.2 KiB
C
75 lines
2.2 KiB
C
/****************************************************************
|
|
* *
|
|
* 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;
|
|
}
|