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);
}