/* init.c */
#include "../SubMtxList.h"
/*--------------------------------------------------------------------*/
/*
------------------------------------------------------------------
purpose -- basic initializer
nlist -- number of lists to be held by this object
counts -- vector that contains number of items expected
for each list.
counts == NULL --> unknown number of items expected
counts != NULL --> known number of items expected
lockflag -- flag to specify lock status
lockflag = 0 --> mutex lock is not allocated or initialized
lockflag = 1 --> mutex lock is allocated and it can synchronize
only threads in this process.
lockflag = 2 --> mutex lock is allocated and it can synchronize
only threads in this and other processes.
flags -- vector to specify whether to lock individual lists
flags == NULL --> none or all lists must be locked,
use lockflag to determine
flags[ilist] = 'N' --> no need to lock list ilist
flags[ilist] = 'Y' --> must lock list ilist
created -- 98may02, cca
------------------------------------------------------------------
*/
void
SubMtxList_init (
SubMtxList *list,
int nlist,
int counts[],
int lockflag,
char flags[]
) {
int ilist ;
/*
---------------
check the input
---------------
*/
if ( list == NULL || nlist <= 0 || lockflag < 0 || lockflag > 2 ) {
fprintf(stderr,
"\n fatal error in SubMtxList_init(%p,%d,%p,%d,%p)"
"\n bad input\n", list, nlist, counts, lockflag, flags) ;
exit(-1) ;
}
/*
--------------
clear all data
--------------
*/
SubMtxList_clearData(list) ;
/*
-------------------------------------------------------
set the number of lists and allocate the heads[] vector
-------------------------------------------------------
*/
list->nlist = nlist ;
ALLOCATE(list->heads, struct _SubMtx *, nlist) ;
for ( ilist = 0 ; ilist < nlist ; ilist++ ) {
list->heads[ilist] = NULL ;
}
if ( counts != NULL ) {
/*
-------------------------------------
allocate and fill the counts[] vector
-------------------------------------
*/
list->counts = IVinit(nlist, 0) ;
IVcopy(nlist, list->counts, counts) ;
}
if ( lockflag > 0 ) {
/*
-----------------
allocate the lock
-----------------
*/
list->lock = Lock_new() ;
Lock_init(list->lock, lockflag) ;
}
if ( flags != NULL ) {
/*
------------------------------------
allocate and fill the flags[] vector
------------------------------------
*/
list->flags = CVinit(nlist, 'N') ;
CVcopy(nlist, list->flags, flags) ;
}
return ; }
/*--------------------------------------------------------------------*/
syntax highlighted by Code2HTML, v. 0.9.1