www.pudn.com > pebble.zip > intrtest.c


/*  
 * Copyright 1999, 2000, 2001, 2002 Lucent Technologies Inc. 
 * All Rights Reserved. 
 * Information Sciences Research Center, Bell Labs. 
 * 
 * LUCENT TECHNOLOGIES DOES NOT CLAIM MERCHANTABILITY OF THIS SOFTWARE  
 * OR THE SUITABILITY OF THIS SOFTWARE FOR ANY PARTICULAR PURPOSE. The 
 * software is provided "as is" without expressed or implied warranty  
 * of any kind. 
 * 
 * These notices must be retained in any copies of any part of this 
 * software. 
 * 
 */ 
 
#include "pebble.h" 
#include "unistd.h" 
#include "types.h" 
#include "time.h" 
#include "synch.h" 
 
#define	NDOMAIN	8 
 
static Barrier *b; 
static int my_asid; 
static int worker_asid[NDOMAIN]; 
 
/* change hrtime() to usleep() or sleep() to test RTC/interrupts */ 
 
void 
worker(int i, int n) 
{ 
	my_asid = get_asid(); 
	fdprintf(2, "worker %d of %d initializing. asid=%d\n", i, n, my_asid); 
 
	if (barrier_wait(b, i, n) < 0) 
		panic("barrier_wait:"); 
 
	fdprintf(2, "worker %d of %d going to sleep for %d secs asid=%d, time = %d\n", i, n, i, my_asid, hrtime()); 
	hrsleep(i*sec2ticks()); 
	fdprintf(2, "worker %d of %d after sleep for %d secs asid=%d, time = %d\n", i, n, i, my_asid, hrtime()); 
 
	if (barrier_wait(b, i, n) < 0) 
		panic("barrier_wait:"); 
 
	fdprintf(2, "worker %d of %d passed 2nd barrier. asid=%d\n", i, n, my_asid); 
 
	/* workers wait here to allow parent to terminate first */ 
	if (barrier_wait(b, i, n) < 0) 
		panic("barrier_wait:"); 
} 
 
int 
main(void) 
{ 
	int i; 
 
	fdprintf(2, "intrtest starting\n"); 
 
	b = (Barrier *)shm_create(sizeof(Barrier)); 
	if (b == (Barrier *)-1) 
		panic("shm_create"); 
 
	if (barrier_init(b) < 0) 
		panic("barrier_init:"); 
 
	for (i = 1; i < NDOMAIN; i++) { 
		if ((worker_asid[i] = domain_fork(NULL)) < 0) 
			panic("domain_fork:"); 
		if (worker_asid[i] == 0) { 
			worker(i, NDOMAIN); 
			task_exit(0); 
		} 
	} 
 
	worker_asid[0] = my_asid = get_asid(); 
	fdprintf(2, "parent initializing. asid=%d\n", my_asid); 
 
	if (barrier_wait(b, 0, NDOMAIN) < 0) 
		panic("barrier_wait:"); 
 
	fdprintf(2, "parent going to sleep for 0 secs asid=%d, time = %d\n", my_asid, hrtime()); 
	hrsleep(0); 
	fdprintf(2, "parent after sleep for 0 secs asid=%d, time = %d\n", my_asid, hrtime()); 
 
	if (barrier_wait(b, 0, NDOMAIN) < 0) 
		panic("barrier_wait:"); 
 
	fdprintf(2, "parent passed 2nd barrier. asid=%d\n", my_asid); 
 
	fdprintf(2, "INTRTEST ENDED\n"); 
	task_exit(0); 
	return(1); 
}