예제 #1
0
파일: sp_mgr.c 프로젝트: SysMan-One/mmk
/*
**++
**  ROUTINE:	sp_once
**
**  FUNCTIONAL DESCRIPTION:
**
**
**  RETURNS:	cond_value, longword (unsigned), write only, by value
**
**  PROTOTYPE:
**
**  	sp_once(struct dsc$descriptor *cmd, struct dsc$descriptor *rcvstr,
**  	    	    	int *rcvlen)
**
**  IMPLICIT INPUTS:	None.
**
**  IMPLICIT OUTPUTS:	None.
**
**  COMPLETION CODES:
**  	    SS$_NORMAL:  normal successful completion
**  	    SS$_NONEXPR: subprocess doesn't exist any more
**
**  SIDE EFFECTS:   	None.
**
**--
*/
void sp_once (void *cmd, void (*actrtn)(void *, struct dsc$descriptor *),
	      void *param) {

    struct ONCE ctx;
    int status;
    struct dsc$descriptor eomcmd;

    static char *eom = "MMK___SP_ONCE_EOM";
    static $DESCRIPTOR(eomfao, "WRITE SYS$OUTPUT \"!AZ\"");

    memset(&ctx, 0, sizeof(struct ONCE));
    ctx.actrtn = actrtn;
    ctx.param = param;
    ctx.eom = eom;
    ctx.eom_len = sizeof(eom)-1;

    INIT_DYNDESC(eomcmd);
    lib$sys_fao(&eomfao, 0, &eomcmd, eom);

    status = sp_open(&ctx.spctx, cmd, sp_once_ast, &ctx);
    if (OK(status)) {
	status = sp_send(&ctx.spctx, &eomcmd);
	if (OK(status)) {
	    do {
		sys$hiber();
	    } while (!ctx.command_complete);
	}
	sp_close(&ctx.spctx);
    }
    str$free1_dx(&eomcmd);
} /* sp_once */
예제 #2
0
파일: mscp.c 프로젝트: rroart/freevms
void mscp_talk_with(char * node, char * sysap)
{
    // both parameters are unused right now
    // we know they are the other node, and the second is mscp$disk

    __du_init(); //temp placement?

    signed long long time=-100000000;
    int unit;
    struct _cdrp * cdrp = vmalloc(sizeof(struct _cdrp));
    struct _mscp_basic_pkt * basic = vmalloc(sizeof(struct _mscp_basic_pkt));
    memset(cdrp,0,sizeof(struct _cdrp));
    memset(basic,0,sizeof(struct _mscp_basic_pkt));
    //basic->mscp$b_caa=MSCP$K_OP_READ;
    for (unit=1; unit < 5; unit ++)
    {
        exe$schdwk(0,0,&time,0);
        sys$hiber();
        printk("probing other node dqa%x\n",unit);
        basic->mscp$b_opcode = MSCP$K_OP_GTUNT;
        basic->mscp$w_unit=unit;
        basic->mscp$l_cmd_ref=0;
        cdrp->cdrp$w_cdrpsize=600;
        cdrp->cdrp$l_rspid=scs_std$alloc_rspid(0,0,cdrp,0);
        cdrp->cdrp$l_cdt=find_mscp_cdt();
        cdrp->cdrp$l_msg_buf=basic;
        cdrp->cdrp$l_xct_len=sizeof(struct _mscp_basic_pkt);
        if (cdrp->cdrp$l_cdt==0)
        {
            printk("gtunt cli no cdt\n");
            return;
        }
        scs_std$senddg(0,600,cdrp);
    }
}
예제 #3
0
파일: jobcontrol.c 프로젝트: Rick33/freevms
int job_control(void *unused)
{
  int sts;
  struct _pcb *tsk = ctl$gl_pcb;
  strcpy(tsk->pcb$t_lname, "JOB_CONTROL");
  sts=exe$crembx(1,&mailbox_channel,512,512,0,0,0,0);
  sys$ar_jobctlmb=ctl$gl_ccbbase[mailbox_channel].ccb$l_ucb;
  do_mbx_read();
  sys$hiber();
  printk("job control should not get past sys$hiber\n");
}
예제 #4
0
파일: schdwk.c 프로젝트: rroart/freevms
main()
{
    $DESCRIPTOR(secs,"0 00:00:20.00");

    sys$gettim(&now);
    sys$bintim(&secs,&step1);
    if (now<0) printf("now less than 0\n");
    if (step1<0) printf("step1 less than 0\n");
    now=now-step1;

    sys$schdwk(0,0,&now,&step1);

    printf("before hiber %x\n",time(0));

    sys$hiber();

    sys$hiber();

    sys$hiber();

    printf("after hiber %x\n",time(0));

}
예제 #5
0
파일: pingtest.c 프로젝트: beekhof/dlm
int main(int argc, char *argv[])
{
    if (argc < 3)
    {
        printf("usage: %s <maxnodes> <us>\n", argv[0]);
	return 2;
    }
    maxnode = atoi(argv[1]);
    us = atoi(argv[2]);

    start_lock();
    while(1)
	sys$hiber();

    return SS$_NORMAL;
}
예제 #6
0
/***********************************************************************
This routine is called to wait for a clustered data base to transition
to a new state.  If the "state" parameter is non-zero, then it is
considered a bit mask, with state zero being the lsb, etc.  (All of
these masks are symbolically defined in ccp.h as CCST_MASK_nnnnn.)
In this case we will return when the state is obtained.  If the
state is zero, we will return when the ccp_cycle count is bumped,
indicating that we have transitioned into read mode.  In any event
we will return after the "next" cycle has passed, so that if we
"miss" our window, we can try again.
***********************************************************************/
bool ccp_userwait(gd_region *reg, uint4 state, int4 *timadr, unsigned short cycle)
	/* if timadr is non-zero, then the timeout quadword, else use the seg's timeout interval */
{
	int4		status;
	static void	ccp_nocomm();
	bool		timer_on;
	sgmnt_data	*seg;
	sgmnt_addrs	*csa;
	int4		*timptr;
	char		buff[(MM_BLOCK - 1) * DISK_BLOCK_SIZE];
	short		iosb[4];
	error_def(ERR_CCPNOTFND);

	csa = &((vms_gds_info *)(reg->dyn.addr->file_cntl->file_info))->s_addrs;
	seg = ((vms_gds_info *)(reg->dyn.addr->file_cntl->file_info))->s_addrs.hdr;
	timptr = timadr ? timadr : (int4 *) &seg->ccp_response_interval;
	timer_on = timptr[0] != 0 && timptr[1] != 0;
	for (; ;)
	{	ccp_communication_timeout = FALSE;
		if (timer_on)
		{
			status = sys$setimr(0, timptr, ccp_nocomm, ccp_nocomm, 0);
			if ((status & 1) == 0)
				rts_error(VARLSTCNT(1) status);
		}
		while (!CCP_SEGMENT_STATE(csa->nl, state) && csa->nl->ccp_cycle == cycle && !ccp_communication_timeout)
		{
			sys$hiber();
		}

		if (ccp_communication_timeout && !(CCP_SEGMENT_STATE(csa->nl, state) || csa->nl->ccp_cycle != cycle))
		{
			status = sys$qiow(EFN$C_ENF, ((vms_gds_info *)(reg->dyn.addr->file_cntl->file_info))->fab->fab$l_stv,
								IO$_READVBLK, &iosb[0], 0, 0, buff, SIZEOF(buff), 1, 0, 0, 0);
			if ((status & 1) && (iosb[0] & 1) && ((sgmnt_data *)buff)->freeze)
				continue;
			rts_error(VARLSTCNT(1) ERR_CCPNOTFND);
		}else
			break;
	}
	if (timer_on)
		sys$cantim(ccp_nocomm,0);
	return CCP_SEGMENT_STATE(csa->nl, state);
}
예제 #7
0
파일: libwait.c 프로젝트: ztmr/FreeVMS
unsigned int lib$wait(float *seconds, int flags, int float_type) {
  // check pointer
  if (*seconds<0 || *seconds>100000)
    return LIB$_INVARG;
  float hundreds_f = *seconds * 100;
  long long hundreds = hundreds_f;
  long long vmstime = - hundreds * 100000;
  int sts;
  if (flags & 1) { // LIB$K_NOWAKE is 1
    sts = sys$setimr (0, &vmstime, dummyast, 0, 0);
    if ((sts & 1) == 0)
      return sts;
    sts = sys$synch (0, 0);
    if ((sts & 1) == 0)
      return sts;
  } else {
    sts = sys$schdwk(0, 0, &vmstime, 0);
    if ((sts & 1) == 0)
      return sts;
    return sys$hiber();
  }
  return SS$_NORMAL;
}
예제 #8
0
gtcm_server()
{
	static readonly int4	reptim[2] = {-100000, -1};	/* 10ms */
       	static readonly int4	wait[2] =  {-1000000, -1};	/* 100ms */
	void		gtcm_ch(), gtcm_exi_handler(), gtcm_init_ast(), gtcm_int_unpack(), gtcm_mbxread_ast(),
			gtcm_neterr(), gtcm_read_ast(), gtcm_remove_from_action_queue(), gtcm_shutdown_ast(), gtcm_write_ast(),
			la_freedb();
	bool		gtcm_link_accept();
	bool		alid;
	char		buff[512];
	char		*h = NULL;
	char		*la_getdb();
	char		nbuff[256];
	char		*pak = NULL;
	char		reply;
	unsigned short	outlen;
	int4		closewait[2] = {0, -1};
	int4		inid = 0, mdl = 0, nid = 0, days = 0;
	int4		lic_status;
	int4		lic_x;
	int4		lm_mdl_nid();
	uint4		status;
	int		i, receive(), value;
	mstr		name1, name2;
	struct NTD	*cmu_ntdroot();
	connection_struct *prev_curr_entry;
	struct	dsc$descriptor_s	dprd;
	struct	dsc$descriptor_s	dver;
	$DESCRIPTOR(node_name, nbuff);
	$DESCRIPTOR(proc_name, "GTCM_SERVER");
	$DESCRIPTOR(timout, buff);
	DCL_THREADGBL_ACCESS;

	GTM_THREADGBL_INIT;
        assert(0 == EMPTY_QUEUE);       /* check so dont need gdsfhead everywhere */
	common_startup_init(GTCM_GNP_SERVER_IMAGE); /* Side-effect: Sets skip_dbtriggers to TRUE for non-trigger platforms */
	gtm_env_init();	/* read in all environment variables */
	name1.addr = "GTCMSVRNAM";
	name1.len = SIZEOF("GTCMSVRNAM") - 1;
	status = trans_log_name(&name1, &name2, nbuff);
	if (SS$_NORMAL == status)
	{
		proc_name.dsc$a_pointer = nbuff;
		proc_name.dsc$w_length = node_name.dsc$w_length = name2.len;
	} else if (SS$_NOLOGNAM == status)
	{
		MEMCPY_LIT(nbuff, "GTCMSVR");
		node_name.dsc$w_length = SIZEOF("GTCMSVR") - 1;
	} else
		rts_error_csa(CSA_ARG(NULL) VARLSTCNT(1) status);
	sys$setprn(&proc_name);
	status = lib$get_foreign(&timout, 0, &outlen, 0);
	if ((status & 1) && (6 > outlen))
	{
		for (i = 0;  i < outlen;  i++)
		{
			value = value * 10;
			if (buff[i] <= '9' && buff[i] >= '0')
				value += buff[i] - 48;
			else
				break;
		}
		if (outlen && (i == outlen))
		{
			cm_timeout = TRUE;
			closewait[0] = value * -10000000;
		}
	}
	dprd.dsc$w_length = cm_prd_len;
	dprd.dsc$b_dtype  = DSC$K_DTYPE_T;
	dprd.dsc$b_class  = DSC$K_CLASS_S;
	dprd.dsc$a_pointer= cm_prd_name;
	dver.dsc$w_length = cm_ver_len;
	dver.dsc$b_dtype  = DSC$K_DTYPE_T;
	dver.dsc$b_class  = DSC$K_CLASS_S;
	dver.dsc$a_pointer= cm_ver_name;
	ast_init();
	licensed = TRUE;
	lkid = 2;
#	ifdef NOLICENSE
	lid = 1;
#	else
	/* this code used to be scattered to discourage reverse engineering, but since it now disabled, that seems pointless */
	lic_status = ((NULL == (h = la_getdb(LMDB))) ? LP_NOCNFDB : SS$_NORMAL);
	lic_status = ((1 == (lic_status & 1)) ? lm_mdl_nid(&mdl, &nid, &inid) : lic_status);
	lic_status = ((1 == (lic_status & 1)) ? lp_licensed(h, &dprd, &dver, mdl, nid, &lid, &lic_x, &days, pak) : lic_status);
	if (LP_NOCNFDB != lic_status)
		la_freedb(h);
	if (1 == (lic_status & 1))
	{
		licensed = TRUE;
		if (days < 14)
			rts_error_csa(CSA_ARG(NULL) VARLSTCNT(1) ERR_WILLEXPIRE);
	} else
	{
		licensed = FALSE;
		sys$exit(lic_status);
	}
#	endif
	gtcm_ast_avail = astq_dyn_avail - GTCM_AST_OVRHD;
	stp_init(STP_INITSIZE);
	rts_stringpool = stringpool;
	cache_init();
	procnum = 0;
	get_proc_info(0, TADR(login_time), &image_count);
        memset(proc_to_clb, 0, SIZEOF(proc_to_clb));
	status = cmi_init(&node_name, 0, 0, gtcm_init_ast, gtcm_link_accept);
	if (!(status & 1))
	{
		rts_error_csa(CSA_ARG(NULL) VARLSTCNT(1) ((status ^ 3) | 4));
		sys$exit(status);
	}
	ntd_root = cmu_ntdroot();
	ntd_root->mbx_ast =  gtcm_mbxread_ast;
	ntd_root->err = gtcm_neterr;
	gtcm_connection = FALSE;
	lib$establish(gtcm_ch);
	gtcm_exi_blk.exit_hand = &gtcm_exi_handler;
	gtcm_exi_blk.arg_cnt = 1;
	gtcm_exi_blk.cond_val = &gtcm_exi_condition;
	sys$dclexh(&gtcm_exi_blk);
	INVOKE_INIT_SECSHR_ADDRS;
	initialize_pattern_table();
	assert(run_time); /* Should have been set by common_startup_init */
	while (!cm_shutdown)
	{
		if (blkdlist)
			gtcml_chkreg();

		assert(!lib$ast_in_prog());
		status = sys$dclast(&gtcm_remove_from_action_queue, 0, 0);
		if (SS$_NORMAL != status)
			rts_error_csa(CSA_ARG(NULL) VARLSTCNT(4) CMERR_CMSYSSRV, 0, status, 0);
		if (INTERLOCK_FAIL == curr_entry)
			rts_error_csa(CSA_ARG(NULL) VARLSTCNT(1) CMERR_CMINTQUE);
		if (EMPTY_QUEUE != curr_entry)
		{
			switch (*curr_entry->clb_ptr->mbf)
			{
				case CMMS_L_LKCANALL:
					reply = gtcmtr_lkcanall();
					break;
				case CMMS_L_LKCANCEL:
					reply = gtcmtr_lkcancel();
					break;
				case CMMS_L_LKREQIMMED:
					reply = gtcmtr_lkreqimmed();
					break;
				case CMMS_L_LKREQNODE:
					reply = gtcmtr_lkreqnode();
					break;
				case CMMS_L_LKREQUEST:
					reply = gtcmtr_lkrequest();
					break;
				case CMMS_L_LKRESUME:
					reply = gtcmtr_lkresume();
					break;
				case CMMS_L_LKACQUIRE:
					reply = gtcmtr_lkacquire();
					break;
				case CMMS_L_LKSUSPEND:
					reply = gtcmtr_lksuspend();
					break;
				case CMMS_L_LKDELETE:
					reply = gtcmtr_lkdelete();
					break;
				case CMMS_Q_DATA:
					reply = gtcmtr_data();
					break;
				case CMMS_Q_GET:
					reply = gtcmtr_get();
					break;
				case CMMS_Q_KILL:
					reply = gtcmtr_kill();
					break;
				case CMMS_Q_ORDER:
					reply = gtcmtr_order();
					break;
				case CMMS_Q_PREV:
					reply = gtcmtr_zprevious();
					break;
				case CMMS_Q_PUT:
					reply = gtcmtr_put();
					break;
				case CMMS_Q_QUERY:
					reply = gtcmtr_query();
					break;
				case CMMS_Q_ZWITHDRAW:
					reply = gtcmtr_zwithdraw();
					break;
				case CMMS_S_INITPROC:
					reply = gtcmtr_initproc();
					break;
				case CMMS_S_INITREG:
					reply = gtcmtr_initreg();
					break;
				case CMMS_S_TERMINATE:
					reply = gtcmtr_terminate(TRUE);
					break;
				case CMMS_E_TERMINATE:
					reply = gtcmtr_terminate(FALSE);
					break;
				case CMMS_U_LKEDELETE:
					reply = gtcmtr_lke_clearrep(curr_entry->clb_ptr, curr_entry->clb_ptr->mbf);
					break;
				case CMMS_U_LKESHOW:
					reply = gtcmtr_lke_showrep(curr_entry->clb_ptr, curr_entry->clb_ptr->mbf);
					break;
				case CMMS_B_BUFRESIZE:
					reply = CM_WRITE;
					value = *(unsigned short *)(curr_entry->clb_ptr->mbf + 1);
					if (value > curr_entry->clb_ptr->mbl)
					{
						free(curr_entry->clb_ptr->mbf);
						curr_entry->clb_ptr->mbf = malloc(value);
					}
					*curr_entry->clb_ptr->mbf = CMMS_C_BUFRESIZE;
					curr_entry->clb_ptr->mbl = value;
					curr_entry->clb_ptr->cbl = 1;
					break;
				case CMMS_B_BUFFLUSH:
					reply = gtcmtr_bufflush();
					break;
				case CMMS_Q_INCREMENT:
					reply = gtcmtr_increment();
					break;
				default:
					reply = FALSE;
					if (SS$_NORMAL == status)
                                                rts_error_csa(CSA_ARG(NULL)
							VARLSTCNT(3) ERR_BADGTMNETMSG, 1, (int)*curr_entry->clb_ptr->mbf);
					break;
			}
			if (curr_entry)		/* curr_entry can be NULL if went through gtcmtr_terminate */
			{
				status = sys$gettim(&curr_entry->lastact[0]);
				if (SS$_NORMAL != status)
					rts_error_csa(CSA_ARG(NULL) VARLSTCNT(1) status);
				/* curr_entry is used by gtcm_mbxread_ast to determine if it needs to defer the interrupt message */
				prev_curr_entry = curr_entry;
				if (CM_WRITE == reply)
				{	/* if ast == gtcm_write_ast, let it worry */
					curr_entry->clb_ptr->ast = gtcm_write_ast;
					curr_entry = EMPTY_QUEUE;
					cmi_write(prev_curr_entry->clb_ptr);
				} else
				{
					curr_entry = EMPTY_QUEUE;
					if (1 == (prev_curr_entry->int_cancel.laflag & 1))
					{  /* valid interrupt cancel msg, handle in gtcm_mbxread_ast */
						status = sys$dclast(gtcm_int_unpack, prev_curr_entry, 0);
						if (SS$_NORMAL != status)
							rts_error_csa(CSA_ARG(NULL) VARLSTCNT(1) status);
					} else  if (CM_READ == reply)
					{
						prev_curr_entry->clb_ptr->ast = gtcm_read_ast;
						cmi_read(prev_curr_entry->clb_ptr);
					}
				}
			}
		} else  if (1 < astq_dyn_avail)
		{
#			ifdef GTCM_REPTIM
			/* if reptim is not needed - and smw doesn't know why it would be - remove this	*/
			status = sys$schdwk(0, 0, &wait[0], &reptim[0]);
#			else
			status = sys$schdwk(0, 0, &wait[0], 0);
#			endif
			sys$hiber();
			sys$canwak(0, 0);
		}
		if (cm_timeout && (0 == gtcm_users))
                        sys$setimr(efn_ignore, closewait, gtcm_shutdown_ast, &cm_shutdown, 0);
	}
}