예제 #1
0
int sec_shr_map_build(uint4 *array, unsigned char *base_addr, cw_set_element *cs, trans_num ctn, int bplmap)
{
	bool		busy;
	uint4		setbit;
	unsigned char	*ptr;

	((blk_hdr *)base_addr)->tn = ctn;
	base_addr += sizeof(blk_hdr);
	if (!GTM_PROBE(bplmap / 8, base_addr, WRITE))
		return FALSE;
	busy = cs->reference_cnt > 0;
	for (;;)
	{
		if (!GTM_PROBE(sizeof(*array), array, READ))
			return FALSE;
		if (*array == 0)
			return TRUE;
		setbit = (*array - cs->blk) * BML_BITS_PER_BLK;
		ptr = base_addr + setbit / 8;
		if (!GTM_PROBE(sizeof(*ptr), ptr, WRITE))
			return FALSE;
		setbit &= 7;
		if (busy)
			*ptr &= ~(3 << setbit);
		else
			if ((*ptr & (1 << setbit)) == 0)
			{
				*ptr |= 3 << setbit;
				cs->reference_cnt--;
			}
			else
				*ptr |= 1 << setbit;
		++array;
	}
}
예제 #2
0
파일: dpgbldir.c 프로젝트: 5HT/mumps
gd_addr *get_next_gdr(gd_addr *prev)
{
	gd_addr	*ptr;

	if (!prev)
		return gd_addr_head;

	for (ptr = gd_addr_head;  ptr && ptr != prev;  ptr = ptr->link)
		if (!GTM_PROBE(sizeof(*ptr), ptr, READ)) /* Called from secshr, have to check access to memory */
			return NULL;
	if (ptr && GTM_PROBE(sizeof(*ptr), ptr, READ))
		return ptr->link;
	return NULL;
}
예제 #3
0
static	void	jnl_oper_krnl_ast(gd_region *reg)
{
	jnl_private_control	*jpc;

	if (!GTM_PROBE(SIZEOF(gd_region), reg, READ)  ||  !reg->open)
		return;
	if (!GTM_PROBE(SIZEOF(gd_segment), reg->dyn.addr, READ))
		return;
	if (dba_bg != reg->dyn.addr->acc_meth  &&  dba_mm != reg->dyn.addr->acc_meth)
		return;
	if (!GTM_PROBE(SIZEOF(file_control), reg->dyn.addr->file_cntl, READ))
		return;
	if (!GTM_PROBE(SIZEOF(vms_gd_info), reg->dyn.addr->file_cntl->file_info, READ))
		return;

	jpc = FILE_INFO(reg)->s_addrs.jnl;	/* since *cs_addrs is a part of vms_gds_info, no additional probe
							for sgmnt_addrs is needed */
	if (!GTM_PROBE(SIZEOF(jnl_private_control), jpc, WRITE))
		return;
	if ((FALSE == jpc->qio_active)  &&  (NOJNL != jpc->channel))
	{
		jpc->old_channel = jpc->channel;
		jpc->channel = NOJNL;
		if (!GTM_PROBE(SIZEOF(vms_lock_sb), jpc->jnllsb, WRITE))
			return;
		jpc->status = gtm_deq(jpc->jnllsb->lockid, NULL, PSL$C_USER, 0);
		sys$dclast(jnl_oper_user_ast, reg, PSL$C_USER);		/* if it fails, jnl_ensure_open should cleanup */
	}
}
예제 #4
0
int sec_shr_blk_build(sgmnt_addrs *csa, sgmnt_data_ptr_t csd, boolean_t is_bg,
			cw_set_element *cse, sm_uc_ptr_t base_addr, trans_num ctn)
{
	blk_segment	*seg, *stop_ptr, *array;
	unsigned char	*ptr;
	boolean_t	do_accounting;

	array = (blk_segment *)cse->upd_addr;
	assert(csa->read_write);
	if (csa->now_crit)	/* csa->now_crit can be FALSE if we are finishing bg_update_phase2 part of the commit */
		do_accounting = TRUE;	/* used by SECSHR_ACCOUNTING macro */
	if (!(GTM_PROBE(SIZEOF(blk_segment), array, READ)))
	{
		SECSHR_ACCOUNTING(4);
		SECSHR_ACCOUNTING(__LINE__);
		SECSHR_ACCOUNTING((INTPTR_T)cse->upd_addr);
		SECSHR_ACCOUNTING(SIZEOF(blk_segment));
		assert(FALSE);
		return FALSE;
	}
	if (!(GTM_PROBE(SIZEOF(blk_hdr), base_addr, WRITE)))
	{
		SECSHR_ACCOUNTING(4);
		SECSHR_ACCOUNTING(__LINE__);
		SECSHR_ACCOUNTING((INTPTR_T)base_addr);
		SECSHR_ACCOUNTING(SIZEOF(blk_hdr));
		assert(FALSE);
		return FALSE;
	}
	/* block transaction number needs to be modified first. see comment in gvcst_blk_build as to why */
	((blk_hdr_ptr_t)base_addr)->bver = GDSVCURR;
	assert(csa->now_crit || (ctn < csd->trans_hist.curr_tn));
	assert(!csa->now_crit || (ctn == csd->trans_hist.curr_tn));
	((blk_hdr_ptr_t)base_addr)->tn = ctn;
	((blk_hdr_ptr_t)base_addr)->bsiz = UINTCAST(array->len);
	((blk_hdr_ptr_t)base_addr)->levl = cse->level;

	if (cse->forward_process)
	{
		ptr = base_addr + SIZEOF(blk_hdr);
		for (seg = array + 1, stop_ptr = (blk_segment *)array->addr;  seg <= stop_ptr;  seg++)
		{
			if (!(GTM_PROBE(SIZEOF(blk_segment), seg, READ)))
			{
				SECSHR_ACCOUNTING(4);
				SECSHR_ACCOUNTING(__LINE__);
				SECSHR_ACCOUNTING((INTPTR_T)seg);
				SECSHR_ACCOUNTING(SIZEOF(blk_segment));
				assert(FALSE);
				return FALSE;
			}
			if (!seg->len)
				continue;	/* GTM_PROBE on a zero length returns FALSE so check for it explicitly here */
			if (!(GTM_PROBE(seg->len, seg->addr, READ)))
			{
				SECSHR_ACCOUNTING(5);
				SECSHR_ACCOUNTING(__LINE__);
				SECSHR_ACCOUNTING((INTPTR_T)seg);
				SECSHR_ACCOUNTING((INTPTR_T)seg->addr);
				SECSHR_ACCOUNTING(seg->len);
				assert(FALSE);
				return FALSE;
			}
			if (!(GTM_PROBE(seg->len, ptr, WRITE)))
			{
				SECSHR_ACCOUNTING(6);
				SECSHR_ACCOUNTING(__LINE__);
				SECSHR_ACCOUNTING((INTPTR_T)seg);
				SECSHR_ACCOUNTING((INTPTR_T)ptr);
				SECSHR_ACCOUNTING((INTPTR_T)seg->addr);
				SECSHR_ACCOUNTING(seg->len);
				assert(FALSE);
				return FALSE;
			}
			DBG_BG_PHASE2_CHECK_CR_IS_PINNED(csa, seg);
			memmove(ptr, seg->addr, seg->len);
			ptr += seg->len;
		}
	} else
	{
		ptr = base_addr + array->len;
		for  (seg = (blk_segment*)array->addr, stop_ptr = array;  seg > stop_ptr;  seg--)
		{
			if (!(GTM_PROBE(SIZEOF(blk_segment), seg, READ)))
			{
				SECSHR_ACCOUNTING(4);
				SECSHR_ACCOUNTING(__LINE__);
				SECSHR_ACCOUNTING((INTPTR_T)seg);
				SECSHR_ACCOUNTING(SIZEOF(blk_segment));
				assert(FALSE);
				return FALSE;
			}
			if (!seg->len)
				continue;	/* GTM_PROBE on a zero length returns FALSE so check for it explicitly here */
			if (!(GTM_PROBE(seg->len, seg->addr, READ)))
			{
				SECSHR_ACCOUNTING(5);
				SECSHR_ACCOUNTING(__LINE__);
				SECSHR_ACCOUNTING((INTPTR_T)seg);
				SECSHR_ACCOUNTING((INTPTR_T)seg->addr);
				SECSHR_ACCOUNTING(seg->len);
				assert(FALSE);
				return FALSE;
			}
			ptr -= seg->len;
			if (!(GTM_PROBE(seg->len, ptr, WRITE)))
			{
				SECSHR_ACCOUNTING(6);
				SECSHR_ACCOUNTING(__LINE__);
				SECSHR_ACCOUNTING((INTPTR_T)seg);
				SECSHR_ACCOUNTING((INTPTR_T)ptr);
				SECSHR_ACCOUNTING((INTPTR_T)seg->addr);
				SECSHR_ACCOUNTING(seg->len);
				assert(FALSE);
				return FALSE;
			}
			DBG_BG_PHASE2_CHECK_CR_IS_PINNED(csa, seg);
			memmove(ptr, seg->addr, seg->len);
		}
	}
	return TRUE;
}