Beispiel #1
0
void test3 ()
{
        
        int     rd1, rd2;
        int     wr1;

        kprintf("\nTest 3: test the basic priority inheritence\n");
        lck  = lcreate();
        lck2 = lcreate();
		kprintf("lck1: %d    \t  lck2: %d",lck,lck2);
        rd1 = create(reader3, 2000, 25, "reader3", 2, "reader A", lck);
        rd2 = create(reader3, 2000, 30, "reader3", 2, "reader B", lck2);
        wr1 = create(writer3, 2000, 40, "writer3", 2, "writer C", lck);
		 kprintf("-start reader B, then sleep 1s. reader B(prio 30) blocked on the lock\n");
        resume (rd2);
		sleep (1);
        kprintf("-start writer, then sleep 1s. lock granted to write (prio 20)\n");
        resume(wr1);
        sleep (1);

        kprintf("-start reader A, then sleep 1s. reader A(prio 25) blocked on the lock\n");
        resume(rd1);
		assert(getprio(rd2)==40);
		assert(getprio(rd1)==25);
		assert(getprio(wr1)==40);
	   
	    sleep (8);
        kprintf ("Test 3 OK\n");
		/*semaphore*/
		
       
		kprintf("\n\nSEMAPHORE	\n\n");
        kprintf("\nTest 3: test the basic priority inheritence\n");
        sem  = screate(2);
        sem2 = screate(1);
		kprintf("lck1: %d    \t  lck2: %d",lck,lck2);
        rd1 = create(readersem3, 2000, 25, "readersem3", 2, "reader A", sem);
        rd2 = create(readersem3, 2000, 30, "readersem3", 2, "reader B", sem2);
        wr1 = create(writersem3, 2000, 40, "writersem3", 2, "writer C", sem);
		 kprintf("-start reader B, then sleep 1s. reader B(prio 30) blocked on the lock\n");
        resume (rd2);
		sleep (1);
        kprintf("-start writer, then sleep 1s. lock granted to write (prio 20)\n");
        resume(wr1);
        sleep (1);

        kprintf("-start reader A, then sleep 1s. reader A(prio 25) blocked on the lock\n");
        resume(rd1);
		assert(getprio(rd2)==40);
		assert(getprio(rd1)==25);
		assert(getprio(wr1)==40);
	   
	    sleep (8);
        kprintf ("Test 3 OK\n");
		
		
}
Beispiel #2
0
DEVCALL ttyinit(struct devsw *devptr)
{
	register struct	tty *iptr;
	int	isconsole;
	int ubrr = UBRR;

	/* set up tty parameters */
	iptr = &tty[devptr->dvminor];
	devptr->dvioblk = (char *) iptr;		/* fill tty control blk	*/
	isconsole = (devptr->dvnum == CONSOLE);	/* make console cooked	*/
	iptr->unit = devptr->dvminor;			/* USART_ptr index		*/
	iptr->ihead = iptr->itail = 0;			/* empty input queue	*/
	iptr->isem = screate(0);				/* chars. read so far=0	*/
	iptr->icnt = 0;							/* "					*/
	iptr->osem = screate(OBUFLEN);			/* buffer available=all	*/
	iptr->ocnt = 0;							/* "					*/
	iptr->odsend = 0;						/* sends delayed so far	*/
	iptr->ohead = iptr->otail = 0;			/* output queue empty	*/
	iptr->ehead = iptr->etail = 0;			/* echo queue empty  	*/
	iptr->imode = (isconsole ? IMCOOKED : IMRAW);
	iptr->iecho = iptr->evis = isconsole;	/* echo console input	*/
	iptr->ierase = iptr->ieback = isconsole;/* console honors erase	*/
//	iptr->ierasec = BACKSP;					/*  delete character ^H	*/
	iptr->ierasec = 0x7f;					/*  delete character    */
	iptr->ecrlf = iptr->icrlf = isconsole;	/* map RETURN on input	*/
	iptr->ocrlf = iptr->oflow = isconsole;
	iptr->ieof  = iptr->ikill = isconsole;	/* set line kill == @	*/
	iptr->iintr = FALSE;
	iptr->iintrc = INTRCH;
	iptr->iintpid = BADPID;
	iptr->ikillc = KILLCH;
	iptr->ieofc = EOFC;
	iptr->oheld = FALSE;
	iptr->ostart = STRTCH;
	iptr->ostop = STOPCH;
	iptr->icursor = 0;
	iptr->ifullc = TFULLC;
	
	/* initialize libc stdin, stdout, and stderr */
//	if (isconsole)
//		{
//		stdin = stdout = stderr = &kprint_out; /* unbuffered, polled output */		
//		}

	/* set up the USART */
	USART_Init(devptr->dvminor, ubrr);			/* found in kprintf.c */
	
	*USART[devptr->dvminor].UCSRB |= (1<<RXCIE0);		/* set RX Complete Interrupt Enable */
	*USART[devptr->dvminor].UCSRB &= ~(1<<UDRIE0);		/* clear USART Data Register empty Interrupt Enable */
	
	return (OK);
}
/*------------------------------------------------------------------------
 *  rfinit  --  initialize remote file pseudo devices
 *------------------------------------------------------------------------
 */
rfinit(struct devsw *pdev)
{
	struct	rfblk	*rfptr;

	pdev->dvioblk = (char *) (rfptr = &Rf.rftab[pdev->dvminor]);
	rfptr->rf_dnum = pdev->dvnum;
	rfptr->rf_name[0] = NULLCH;
	rfptr->rf_state = RFREE;
	rfptr->rf_mutex = screate(1);
	rfptr->rf_pos = 0L;
	if (pdev->dvminor == 0) {	/* done just once */
		Rf.device = RCLOSED;
		Rf.rmutex = screate(1);
	}
}
Beispiel #4
0
int main()
{
	int tid1;
	
	turnDebugOn();
	
	smutex_init(&mutex);
	
	printf("Códigos retornados:\n");
	
	printf("swait(12): %d\n", swait(12));
	printf("syield(): %d\n", syield());
	printf("slock(&mutex): %d\n", slock(&mutex));
	printf("sunlock(&mutex): %d\n", sunlock(&mutex));
	
	printf("E finalmente inicializando...\n");
	
	printf("tid1 = screate(1, f_thread, NULL);\n");
	tid1 = screate(1, f_thread, NULL);
	printf("tid1 : %d\n", tid1);
	
	swait(tid1);

	return 0;
}
Beispiel #5
0
SYSCALL mutex_lock(MUTEX_REC_PTR *mutex_var)
{
 int nsem;
 int ps, ans;

 disable(ps);

  if ((*mutex_var) == (MUTEX_REC_PTR)NULL)
  {
    nsem = screate(1);
    if (nsem == SYSERR)
    {
      restore(ps);
      return SYSERR;
    } /* if */
    (*mutex_var) = (MUTEX_REC_PTR)getmem(sizeof(MUTEX_REC));
    (*mutex_var)->nsem = nsem;

  } /* if */


    ans = wait((*mutex_var)->nsem);
    (*mutex_var)->pid = currpid;
    restore(ps);
    return  ans;

} /* mutex_lock */
/*------------------------------------------------------------------------
 * ospfifinit - initialize OSPF interface data
 *------------------------------------------------------------------------
 */
void
ospfifinit(int aindex, unsigned ifn)
{
	struct ospf_if	*pif = &ospf_if[ifn];
	struct ospf_nb	*pnb;
	int		i;

	pif->if_type = IFT_BROADCAST;
	pif->if_state = IFS_DOWN;
	pif->if_area = &ospf_ar[aindex];
	pif->if_hintv = HELLOINTV;
	pif->if_rdintv = DEADINTV;
	pif->if_xdelay = 1;
	pif->if_prio = 1;
	pif->if_rid = nif[NI_PRIMARY].ni_ip;
	pif->if_drid	= pif->if_brid    = 0;
	pif->if_metric = 1;
	pif->if_opts = NBO_E;

	pif->if_rintv = RXMTINTV;
	memset(pif->if_auth, 0, AUTHLEN);

	pif->if_nbmutex = screate(0);
	/* "neighbor" 0 is the entry for this interface */

	pnb = &pif->if_nbtab[0];
	pnb->nb_state = NBS_FULL;
	++pnb;

	for (i=1; i<MAXNBR; ++i, ++pnb)
		pnb->nb_state = NBS_DOWN;
	signal(pif->if_nbmutex);
	if (ifn == NI_PRIMARY)
		hgjoin(NI_PRIMARY, AllSPFRouters, TRUE);
}
Beispiel #7
0
static _ctx *
_create_ctx(void)
{
    _ctx *ctx;

    ctx = flget(flctx);
    if (!ctx)
        return NULL;
    ctx->cs = screate(100);
    if (!ctx->cs)
        return NULL;

    ctx->pits = htcreate(HT_PIT_SIZE);
    if (!ctx->pits)
        return NULL;

    ctx->sched_cnt = 0;
    ctx->id = 0;
    ctx->tid = 0;
    ctx->name = NULL;
    ctx->t0 = tickcount();
    ctx->rec_levels = htcreate(HT_RLEVEL_SIZE);
    if (!ctx->rec_levels)
        return NULL;
    return ctx;
}
Beispiel #8
0
//------------------------------------------------------------------------
//  mkpool  --  allocate memory for a buffer pool and link together
//------------------------------------------------------------------------
SYSCALL
mkpool(int bufsiz, int numbufs)
{
	int ps;
	int poolid;
	char *where;

	if (unmarked(bpmark))
		poolinit();
	ps = disable();
	if (bufsiz < BPMINB || bufsiz > BPMAXB
	    || numbufs < 1 || numbufs > BPMAXN
	    || nbpools >= NBPOOLS
	    || (where = (char *)getmem((bufsiz + sizeof(int)) * numbufs)) == (char *)SYSERR) {
		restore(ps);
		return SYSERR;
	}
	poolid = nbpools++;
	bptab[poolid].bpnext = where;
	bptab[poolid].bpsize = bufsiz;
	bptab[poolid].bpsem = screate(numbufs);
	bufsiz += sizeof(int);
	for (numbufs--; numbufs > 0; numbufs--, where += bufsiz)
		*((int *)where) = (int) (where + bufsiz);
	*((int *)where) = (int) NULL;
	restore(ps);

	return poolid;
}
Beispiel #9
0
/*------------------------------------------------------------------------
 *  cominit -- initialize a com device (NS16{4/5}50)
 *------------------------------------------------------------------------
 */
int
cominit(struct devsw *pdev)
{
	struct comsoft	*pcom;
	void		*csr = pdev->dvcsr;
	/* void		comint(); */ /* not needed and conflicting PW */

	pcom = &comtab[pdev->dvminor];
	pcom->com_pdev = pdev;
	set_evec(pdev->dvivec, comint);
#ifdef X86
	outb(csr+LCR, LCR_DLAB);
	outb(csr+DLL, 12);	/* 9600 baud */
	outb(csr+DLM, 0);	/* 9600 baud */
	outb(csr+LCR, LCR_W8); /* 8N1 */
	/* raise DTR and RTS & enable interrupts */
	outb(csr+MCR, MCR_DTR | MCR_RTS | MCR_OUT2);
#endif
	pcom->com_osema = screate(COMBUFSZ);
#ifdef X86
	outb(csr+IER, 0x0f); /* enable interrupts */
	(void) inb(csr+IIR);
#endif
	return OK;
}
Beispiel #10
0
/*------------------------------------------------------------------------
 * ipfinit  -  initialize IP fragment queue data structures
 *------------------------------------------------------------------------
 */
void ipfinit()
{
	int	i;

	ipfmutex = screate(1);
	for (i=0; i<IP_FQSIZE; ++i)
		ipfqt[i].ipf_state = IPFF_FREE;
}
Beispiel #11
0
Datei: srv.c Projekt: npe9/harvey
void
srv(Srv *srv)
{
	Req *r;

	fmtinstall('D', dirfmt);
	fmtinstall('F', fcallfmt);

	if(srv->fpool == nil)
		srv->fpool = allocfidpool(srv->destroyfid);
	if(srv->rpool == nil)
		srv->rpool = allocreqpool(srv->destroyreq);
	if(srv->msize == 0)
		srv->msize = 8192+IOHDRSZ;

	changemsize(srv, srv->msize);

	srv->fpool->srv = srv;
	srv->rpool->srv = srv;

	while(r = getreq(srv)){
		if(r->error){
			respond(r, r->error);
			continue;	
		}
		switch(r->ifcall.type){
		default:
			respond(r, "unknown message");
			break;
		case Tversion:	sversion(srv, r);	break;
		case Tauth:	sauth(srv, r);	break;
		case Tattach:	sattach(srv, r);	break;
		case Tflush:	sflush(srv, r);	break;
		case Twalk:	swalk(srv, r);	break;
		case Topen:	sopen(srv, r);	break;
		case Tcreate:	screate(srv, r);	break;
		case Tread:	sread(srv, r);	break;
		case Twrite:	swrite(srv, r);	break;
		case Tclunk:	sclunk(srv, r);	break;
		case Tremove:	sremove(srv, r);	break;
		case Tstat:	sstat(srv, r);	break;
		case Twstat:	swstat(srv, r);	break;
		}
	}

	free(srv->rbuf);
	srv->rbuf = nil;
	free(srv->wbuf);
	srv->wbuf = nil;
	srv->msize = 0;
	freefidpool(srv->fpool);
	srv->fpool = nil;
	freereqpool(srv->rpool);
	srv->rpool = nil;

	if(srv->end)
		srv->end(srv);
}
Beispiel #12
0
int main()
{
	int t1, t2;
	
	turnDebugOn();
	smutex_init(&mutex);
	global = 0;
	
	t1 = screate(0, func1, NULL);
	t2 = screate(0, func2, NULL);
	
	
	swait(t1);
	swait(t2);
	

	return 0;
}
Beispiel #13
0
void arpinit(void)
{
	struct arpent *atabptr;
	int	i, j;

	Arp.atabsiz = 0;
	Arp.atabnxt = 0;
	Arp.arpsem = screate(1);
	Arp.rarpsem= screate(1);
	Arp.arppid = Arp.rarppid = BADPID;
	for (i=0 ; i<AR_TAB ; i++) {
		atabptr = &Arp.arptab[i];
		atabptr->arp_state = AR_FREE;
		for (j=0 ; j<EPADLEN ; j++)
			atabptr->arp_Ead[j] = '\0';
		atabptr->arp_dev = -1;
	}
}
Beispiel #14
0
/*------------------------------------------------------------------------
 *  arpinit  -  initialize data structures for ARP processing
 *------------------------------------------------------------------------
 */
void arpinit()
{
	int	i;

	rarpsem = screate(1);
	rarppid = BADPID;

	for (i=0; i<ARP_TSIZE; ++i)
		arptable[i].ae_state = AS_FREE;
}
/*------------------------------------------------------------------------
 *  dginit  -  initialize datagram protocol pseudo device marking it free
 *------------------------------------------------------------------------
 */
int
dginit(struct devsw *pdev)
{
	struct	dgblk	*pdg;

	pdev->dvioblk = (char *) (pdg = &dgtab[pdev->dvminor]);
	pdg->dg_dnum = pdev->dvnum;
	pdg->dg_state = DGS_FREE;
	dgmutex = screate(1);
	return OK;
}
Beispiel #16
0
/*------------------------------------------------------------------------
 *  ttyinit - initialize buffers and modes for a tty line
 *------------------------------------------------------------------------
 */
int ttyinit(struct devsw *devptr)
{
	register struct	tty *iptr;
	register struct	csr *cptr;
	int	 junk, isconsole;

	/* set up interrupt vector and interrupt dispatch table */

	iptr = &tty[devptr->dvminor];
	iosetvec(devptr->dvnum, (int)iptr, (int)iptr);

	devptr->dvioblk = (char *)iptr;		/* fill tty control blk	*/
	isconsole = (devptr->dvnum == CONSOLE);	/* make console cooked	*/
	iptr->ioaddr = (struct csr *)devptr->dvcsr;/* copy in csr addr.	*/
	iptr->ihead = iptr->itail = 0;		/* empty input queue	*/
	iptr->isem = screate(0);		/* chars. read so far=0	*/
	iptr->osem = screate(OBUFLEN);		/* buffer available=all	*/
	iptr->odsend = 0;			/* sends delayed so far	*/
	iptr->ohead = iptr->otail = 0;		/* output queue empty	*/
	iptr->ehead = iptr->etail = 0;		/* echo queue empty	*/
	iptr->imode = (isconsole ? IMCOOKED : IMRAW);
	iptr->iecho = iptr->evis = isconsole;	/* echo console input	*/
	iptr->ierase = iptr->ieback = isconsole;/* console honors erase	*/
	iptr->ierasec = BACKSP;			/*  using ^h		*/
	iptr->ecrlf = iptr->icrlf = isconsole;	/* map RETURN on input	*/
	iptr->ocrlf = iptr->oflow = isconsole;	/* map RETURN on output	*/
	iptr->ikill = isconsole;		/* set line kill == @	*/
	iptr->ikillc = ATSIGN;
	iptr->oheld = FALSE;
	iptr->ostart = STRTCH;
	iptr->ostop = STOPCH;
	iptr->icursor = 0;
	iptr->ifullc = TFULLC;
	cptr = (struct csr *)devptr->dvcsr;
	junk = cptr->crbuf;			/* clear receiver and	*/
	cptr->crstat = SLUENABLE;		/* enable in. interrupts*/
	cptr->ctstat = SLUDISABLE;		/* disable out.   "	*/
	return;
}
Beispiel #17
0
/*------------------------------------------------------------------------
 * ttynew - allocate and initialize a tty structure
 *------------------------------------------------------------------------
 */
struct tty *
ttynew()
{
	struct tty	*ptty, *ttyalloc();

	ptty = ttyalloc();
	if(ptty == 0)
		return 0;
	ptty->tty_tchars = dfltchars;	/* struct copy */

	ptty->tty_cpid = getpid();
	ptty->tty_isema = screate(0);
	ptty->tty_iflags = 0;
	ptty->tty_istart = 0;
	ptty->tty_icount = 0;

	ptty->tty_osema = screate(OBLEN);
	ptty->tty_oflags = 0;
	ptty->tty_ostart = 0;
	ptty->tty_ocount = 0;
	return ptty;
}
Beispiel #18
0
int main(void *arg)
{
        int sem, i;

        (void)arg;

        assert(screate(-2) == -1);
        assert((sem = screate(2)) >= 0);
        assert(signaln(sem, -4) < 0);
        assert(sreset(sem, -3) == -1);
        assert(scount(sem) == 2);
        assert(signaln(sem, 32760) == 0);
        assert(signaln(sem, 6) == -2);
        assert(scount(sem) == 32762);
        assert(wait(sem) == 0);
        assert(scount(sem) == 32761);
        assert(signaln(sem, 30000) == -2);
        assert(scount(sem) == 32761);
        assert(wait(sem) == 0);
        assert(scount(sem) == 32760);
        assert(signaln(sem, -2) < 0);
        assert(scount(sem) == 32760);
        assert(wait(sem) == 0);
        assert(scount(sem) == 32759);
        assert(signaln(sem, 8) == 0);
        assert(scount(sem) == 32767);
        assert(signaln(sem, 1) == -2);
        assert(scount(sem) == 32767);
        assert(signal(sem) == -2);
        assert(scount(sem) == 32767);
        for (i=0; i<32767; i++) {
                assert(wait(sem) == 0);
        }
        assert(try_wait(sem) == -3);
        assert(scount(sem) == 0);
        assert(sdelete(sem) == 0);
        printf("ok.\n");
}
/*------------------------------------------------------------------------
 *  tcpinit  -  initialize TCP slave pseudo device marking it free
 *------------------------------------------------------------------------
 */
int
tcpinit(struct devsw *pdev)
{
	struct	tcb	*tcb;

	if (unmarked(tcpmark)) {
		mark(tcpmark);
		tcps_tmutex = screate(1);
		tcps_lqsize = 5;	/* default listen Q size	*/
	}
	pdev->dvioblk = (char *) (tcb = &tcbtab[pdev->dvminor]);
	tcb->tcb_dvnum = pdev->dvnum;
	tcb->tcb_state = TCPS_FREE;
	return OK;
}
Beispiel #20
0
// Basic Priority Inheritance Test (XINU semaphores)
void basic_pinh_sem_test() {
    int sem;
    int rd1;
    int wr1, wr2;
    int lp;

    kprintf("\nBasic Priority Inheritance Test (XINU sem)\n"
    "Verify Writer B and Reader C never receives semaphore\n"
    "because Writer B (pprio 10) has priority less than\n"
    "looper process (pprio 15)\n"
    " lock acquisition is:\n" 
    "writer A\n");

    // Create a semaphore that only allows one accessor at a time.
    sem = screate(1);

    // Create a process that is always ready to run at priority 15
    lp = create(looper, 2000, 15, "looper", 0, NULL); 


    wr1 = create(swriter, 2000, 20, "writer", 3, "writer A p20", sem, 5);

    wr1 = create(swriter, 2000, 20, "writer", 3, "writer A p20", sem, 5);
    wr2 = create(swriter, 2000, 10, "writer", 3, "writer B p10", sem, 2);
    rd1 = create(sreader, 2000, 40, "reader", 3, "reader C p40", sem, 1);


    kprintf("-start writer A (pprio 20), then sleep 1s.\n");
    resume(wr1);
    sleep(1);

    kprintf("-start writer B (pprio 10), then sleep 1s.\n");
    resume(wr2);
    sleep(1);

    // This will guarantee that writer B will never get chosen unless
    // we boost its priority. We don't do that for sems => lock 
    kprintf("-start looper process (pprio 15), then sleep 1s.\n");
    resume(lp);
    sleep(1);
    
    kprintf("-start reader C (pprio 40), then sleep 1s.\n");
    resume(rd1);
    sleep(1);
    
    sleep (10);
    kprintf ("Test finished, verify writer B and reader C never recieved sem!\n");
}
Beispiel #21
0
/*
 *------------------------------------------------------------------------
 * clkinit - initialize the clock and sleep queue (called at startup)
 *------------------------------------------------------------------------
 */
void clkinit()
{

	preempt = QUANTUM;		/* initial time quantum		*/
	countTick = TICK;	 	/* TICKs of a sec. counter	*/
	clmutex = screate(1);	/* semaphore for tod clock	*/
	clktime = 0L;			/* initially a low number	*/
	ctr100 = 0L;			/* timer (relative)			*/
	slnempty = FALSE;		/* initially, no process asleep	*/
	clkdiff = 0;			/* zero deferred ticks		*/
	defclk = FALSE;				/* clock is not deferred	*/
	clkruns = 1;
	clockq = newqueue();

	/* Initialize timer 3 (System Clock) */
	/* 100 Hz clock 16000000/256/(1+624) */
	/* OCR3A set to 624 for CTC mode */
	OCR3AH = hibyte(624);	/* 0-624 => divide by 625 */
	OCR3AL = lobyte(624);	/* write high byte first!	*/
	  
    TCNT3L = 0x00;
	TCNT3H = 0x00;
	TCCR3A = 0x00;			/* normal port operation, WGM31=0 WGM30=0 */
	TCCR3B = (1<<CS32) | (0<<CS31) | (0<<CS30);	/* (clock source/256) for 62500Hz */
	TCCR3B |= (1 << WGM32);	/* normal mode 4: CTC w/OCR3A */
	TCCR3C = 0x00;

	TIMSK3 |= (1<<OCF3A);	/* Clear overflow flag bit */
    TIMSK3 |= (1<<OCIE3A);	/* Output Compare A Match Interrupt Enable */
	
	/* Initialize timer 2 (RTC) */
	TIMSK2 &= ~((1<<TOIE2)|(1<<OCIE2A)|(1<<OCIE2B));     //Disable TC2 interrupt
    ASSR |= (1<<AS2);           //set Timer/Counter2 to be asynchronous from the CPU clock
	//with a second external clock(32.768kHz)driving it.
    TCNT2 = 0x00;
	TCCR2A = 0x00;				//normal mode 0
    TCCR2B = 0x05;              //prescale the timer to be clock source / 128
//
//TIMER2 quit working on me 12/21/2013 -- change rtc & MAC Symbol counter!!!!!!!!!!!!!!!!!!
//
//	while(ASSR&0x1F)
		//	while(ASSR&( (1<<TCR2BUB)|(1<<OCR2BUB)|(1<<TCN2UB) ))
//		;	//Wait until TC0 is updated
//	TIFR2 |= (1<<TOV2);			//Clear overflow flag bit
//    TIMSK2 |= (1<<TOIE2);       //set 8-bit Timer/Counter0 Overflow Interrupt Enable
		
}
/*------------------------------------------------------------------------
 *  tcptimer -  TCP timer process
 *------------------------------------------------------------------------
 */
PROCESS
tcptimer(void)
{
	long	now, lastrun;		/* times from system clock	*/
	int	delta;			/* time since last iteration	*/
	struct	tqent	*tq;		/* temporary delta list ptr	*/

	lastrun = ctr100;		/* initialize to "now"		*/
	tqmutex = screate(1);		/* mutual exclusion semaphore	*/
	tqpid = getpid();		/* record timer process id	*/
	signal(Net.sema);		/* start other network processes*/

	while (TRUE) {
		sleep10(TIMERGRAN);	/* real-time delay		*/
		if (tqhead == 0)	/* block timer process if delta	*/
			suspend(tqpid);	/*   list is empty		*/

		wait(tqmutex);
		now = ctr100;
		delta = now - lastrun;	/* compute elapsed time		*/

		/* Note: check for possible clock reset (time moved	*/
		/* backward or delay was over an order of magnitude too	*/
		/* long)						*/

		if (delta < 0 || delta > TIMERGRAN*100)
			delta = TIMERGRAN*10;	/* estimate the delay	*/
		lastrun = now;
		while (tqhead != 0  &&  tqhead->tq_timeleft <= delta) {
			delta -= tqhead->tq_timeleft;
			if (pcount(tqhead->tq_port) <= tqhead->tq_portlen)
				psend(tqhead->tq_port,
					(int)tqhead->tq_msg);
			tq = tqhead;
			tqhead = tqhead->tq_next;
			freemem(tq, sizeof(struct tqent));
		}
		if (tqhead)
			tqhead->tq_timeleft -=delta;
		signal(tqmutex);
	}
}
Beispiel #23
0
/*------------------------------------------------------------------------
 * tcballoc - allocate a Transmission Control Block
 *------------------------------------------------------------------------
 */
struct tcb *
tcballoc(void)
{
    struct	tcb	*ptcb;
    int		slot;

    wait(tcps_tmutex);
    /* look for a free TCB */

    for (ptcb=&tcbtab[0], slot=0; slot<Ntcp; ++slot, ++ptcb)
        if (ptcb->tcb_state == TCPS_FREE)
            break;
    if (slot < Ntcp) {
        ptcb->tcb_state = TCPS_CLOSED;
        ptcb->tcb_mutex = screate(0);
    } else
        ptcb = (struct tcb *)SYSERR;
    signal(tcps_tmutex);
    return ptcb;
}
Beispiel #24
0
static int
_sgrow(_cstack * cs)
{
    int i;
    _cstack *dummy;

    dummy = screate(cs->size*2);
    if(!dummy)
        return 0;

    for(i=0; i<cs->size; i++) {
        dummy->_items[i].ckey = cs->_items[i].ckey;
        dummy->_items[i].t0 = cs->_items[i].t0;
    }
    yfree(cs->_items);
    cs->_items = dummy->_items;
    cs->size = dummy->size;
    yfree(dummy);
    return 1;
}
Beispiel #25
0
int
main (int argc, char **argv) {

	if ((sema = screate(0)) == -1) {
		perror("couldn't create semaphore");
		exit(1);
	}

	write(STDOUT_FILENO, PARENT_MSG_1, LENGTH(PARENT_MSG_1));
	sleep(1);

	switch(fork(_child)) {
	case -1:
		perror("fork failed");
		exit(1);
	default:
		swait(sema);
		write(STDOUT_FILENO, PARENT_MSG_2, LENGTH(PARENT_MSG_2));
		write(STDOUT_FILENO, TEST_MSG, LENGTH(TEST_MSG));
	}
	return 0;	
}
Beispiel #26
0
void shmem_test() {
    int p1, p2;
    int sem;

    kprintf("\nBasic shared memory test\n");

    // Create semaphore
    sem = screate(1);

    // Create a process that is always ready to run at priority 15
    p1 = create(shmemproducer, 2000, 20, "shmemproducer", 1, sem); 
    p2 = create(shmemconsumer, 2000, 20, "shmemconsumer", 1, sem); 

    // Start the task
    kprintf("start producer (pprio 20), then sleep 1s.\n");
    resume(p1);
    //sleep(1);

    // Start the task
    kprintf("start consumer (pprio 20), then sleep 1s.\n");
    resume(p2);
    
}
/*
 *------------------------------------------------------------------------
 * clkinit - initialize the clock and sleep queue (called at startup)
 *------------------------------------------------------------------------
 */
void clkinit()
{
	unsigned short	intv;
	int clkint();

	set_evec(IRQBASE, (u_long)clkint);

	/* clock rate is 1.190 Mhz; this is 10ms interrupt rate */
	intv = 1190;

	clkruns = 1;
	clockq = newqueue();
	preempt = QUANTUM;		/* initial time quantum		*/
	clmutex = screate(1);

	/*  set to: timer 0, 16-bit counter, rate generator mode,
		counter is binary */
	outb(CLKCNTL, 0x34);
	/* must write LSB first, then MSB */
	outb(CLOCK0, (char)intv);
	outb(CLOCK0, intv>>8);
	outb(CLOCK0, intv>>8);
}
Beispiel #28
0
/*------------------------------------------------------------------------
 *  netinit  -  initialize network data structures
 *------------------------------------------------------------------------
 */
netinit()
{
	struct	netq	*nqptr;
	int	i;

	/* Initialize pool of network buffers and rest of Net structure	*/

	if (clkruns == FALSE)
		panic("net: no clock");
	Net.netpool = mkpool(EMAXPAK, NETBUFS);
	for (i=0 ; i<NETQS ; i++) {
		nqptr = &Net.netqs[i];
		nqptr->valid = FALSE;
		nqptr->uport = -1;
		nqptr->xport = pcreate(NETQLEN);
	}
	Net.mavalid = FALSE;
	dtoIP(&Net.gateway, NETGATE);
	Net.nxtprt = ULPORT;
	Net.nmutex = screate(1);
	Net.npacket = Net.ndrop = Net.nover = 0;
	return(OK);
}
Beispiel #29
0
int main(int argc, char *argv[]) {
    int i, pid[MAX_THR];

  
    for (i = 0; i < MAX_THR; i++) {
        pid[i] = screate((i%3), func, (void *)('A'+i));
       if ( pid[i] == -1) {
          printf("ERRO: criação de thread!\n");
          exit(-1);
       }
     }

    for (i = 0; i < MAX_THR; i++) 
         swait(pid[i]);

    for (i = 0; i < MAX_SIZE; i++) {    
        if ( (i % 20) == 0 )
           printf("\n");
        printf("%c", (char)vetor[i]);
    }
      
    printf("\nConcluido vetor de letras com priuoridades...\n");
    exit(0);
}
Beispiel #30
0
int main()
{
    int lck, lrdm, lwrl, lwrh, sem, srdm, swrl, swrh, lloop, sloop;
    
    kprintf("Start priority inversion test with lock\n");

    lck  = lcreate();
    lloop = create(dowait, 2000, 25, "dowait", 1, 5);
    lwrh = create(lwr, 2000, 30, "writer", 4, "writer H", lck, 20, 2);
    lwrl = create(lwr, 2000, 10, "writer", 4, "writer L", lck, 20, 5);
    lrdm = create(lrd, 2000, 20, "reader", 4, "reader M", lck, 20, 1);

    kprintf("Start Writer L, then sleep 1s\n");
    resume(lwrl);
    sleep(1);


    kprintf("Start Writer H, then sleep 1s\n");
    resume(lwrh);
    sleep(1);
    
    kprintf("Start dowait, then sleep 1s\n");
    resume(lloop);
    sleep(1);

    sleep(10);

    kprintf ("Lock test finished!\n");

    kprintf("Start priority inversion test with semaphore\n");
    
    sem  = screate(1);
    sloop= create(dowait, 2000, 20, "dowait", 1, 5);
    swrh = create(srw, 2000, 30, "writer", 3, "writer H", sem, 5);
    swrl = create(srw, 2000, 10, "writer", 3, "writer L", sem, 3);
    srdm = create(srw, 2000, 40, "reader", 3, "reader M", sem, 1);


    kprintf("Start Writer L, then sleep 1s\n");
    resume(swrl);
    sleep(1);


    kprintf("Start Writer H, then sleep 1s\n");
    resume(swrh);
    sleep(1);

    kprintf("Start dowait, then sleep 1s\n");
    resume(sloop);
    sleep(1);
    
    
    sleep(10);

    kprintf ("Semaphore test finished!\n");




    return 0;


}