/*
* Copyright 2000, International Business Machines Corporation and others.
* All Rights Reserved.
- *
+ *
* This software has been released under the terms of the IBM Public
* License. For details, see the LICENSE file in the top-level source
* directory or online at http://www.openafs.org/dl/license10.html
#include <afsconfig.h>
#include <afs/param.h>
-
-#ifdef AFS_NT40_ENV
-#include <malloc.h>
-#include <stdlib.h>
-#else
-#include <sys/time.h>
-extern char *calloc();
-#endif
-#include <stdio.h>
-#include <stdlib.h>
+#include <roken.h>
#include "lwp.h"
#include "lock.h"
-#include "preempt.h"
-#include <afs/assert.h>
#define DEFAULT_READERS 5
} queue;
queue *
-init()
+init(void)
{
queue *q;
- q = (queue *) malloc(sizeof(queue));
+ q = malloc(sizeof(queue));
q->prev = q->next = q;
return (q);
}
char
-empty(q)
- queue *q;
+empty(queue *q)
{
return (q->prev == q && q->next == q);
}
{
queue *new;
- new = (queue *) malloc(sizeof(queue));
+ new = malloc(sizeof(queue));
new->data = s;
new->prev = q->prev;
q->prev->next = new;
}
char *
-Remove(q)
- queue *q;
+Remove(queue *q)
{
queue *old;
char *s;
if (empty(q)) {
printf("Remove from empty queue");
- assert(0);
+ exit(0);
}
old = q->next;
free(old);
return (s);
}
-\f
+
queue *q;
int asleep; /* Number of processes sleeping -- used for
* clean termination */
-static int
-read_process(id)
- int *id;
+static void *
+read_process(void *arg)
{
+ int *id = (int *) arg;
printf("\t[Reader %d]\n", *id);
LWP_DispatchProcess(); /* Just relinquish control for now */
- PRE_PreemptMe();
for (;;) {
- register int i;
+ int i;
/* Wait until there is something in the queue */
asleep++;
}
asleep--;
for (i = 0; i < 10000; i++);
- PRE_BeginCritical();
printf("[%d: %s]\n", *id, Remove(q));
- PRE_EndCritical();
ReleaseReadLock(&q->lock);
LWP_DispatchProcess();
}
return 0;
}
-static int
-write_process()
+static void *
+write_process(void *dummy)
{
static char *messages[] = {
"Mary had a little lamb,",
char **mesg;
printf("\t[Writer]\n");
- PRE_PreemptMe();
/* Now loop & write data */
for (mesg = messages; *mesg != 0; mesg++) {
#include "AFS_component_version_number.c"
-main(argc, argv)
- int argc;
- char **argv;
+int
+main(int argc, char **argv)
{
int nreaders, i;
PROCESS pid;
- afs_int32 interval; /* To satisfy Brad */
PROCESS *readers;
int *readerid;
PROCESS writer;
- struct timeval tv;
printf("\n*Readers & Writers*\n\n");
setbuf(stdout, 0);
sscanf(*++argv, "%d", &nreaders);
printf("[There will be %d readers]\n", nreaders);
- interval = (argc >= 3 ? atoi(*++argv) * 1000 : 50000);
-
if (argc == 4)
lwp_debug = 1;
LWP_InitializeProcessSupport(0, &pid);
printf("[Support initialized]\n");
- tv.tv_sec = 0;
- tv.tv_usec = interval;
- PRE_InitPreempt(&tv);
/* Initialize queue */
q = init();
/* Now create readers */
printf("[Creating Readers...\n");
readers = (PROCESS *) calloc(nreaders, sizeof(PROCESS));
- readerid = (int *)calloc(nreaders, sizeof(i));
- for (i = 0; i < nreaders; i++)
+ readerid = calloc(nreaders, sizeof(i));
+ for (i = 0; i < nreaders; i++) {
+ readerid[i] = i;
LWP_CreateProcess(read_process, STACK_SIZE, 0, (void *)&readerid[i],
"Reader", &readers[i]);
+ }
printf("done]\n");
printf("\t[Creating Writer...\n");
for (i = nreaders - 1; i >= 0; i--)
LWP_DestroyProcess(readers[i]);
printf("\n*Exiting*\n");
+
+ exit(0);
}