rw: Properly cleanup LWP environment
[openafs.git] / src / lwp / rw.c
index 6572b4f..d0ca13a 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * 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
@@ -17,21 +17,10 @@ Created: 11/1/83, J. Rosenberg
 #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
 
@@ -45,18 +34,17 @@ typedef struct QUEUE {
 } 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);
 }
@@ -66,7 +54,7 @@ insert(queue * q, char *s)
 {
     queue *new;
 
-    new = (queue *) malloc(sizeof(queue));
+    new = malloc(sizeof(queue));
     new->data = s;
     new->prev = q->prev;
     q->prev->next = new;
@@ -75,15 +63,14 @@ insert(queue * q, char *s)
 }
 
 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;
@@ -93,20 +80,19 @@ Remove(q)
     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 (;;) {
        int i;
 
@@ -120,17 +106,15 @@ read_process(id)
        }
        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,",
@@ -178,7 +162,6 @@ write_process()
     char **mesg;
 
     printf("\t[Writer]\n");
-    PRE_PreemptMe();
 
     /* Now loop & write data */
     for (mesg = messages; *mesg != 0; mesg++) {
@@ -202,17 +185,14 @@ write_process()
 
 #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);
@@ -224,15 +204,10 @@ main(argc, argv)
        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();
@@ -244,10 +219,12 @@ main(argc, argv)
     /* 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");
@@ -260,5 +237,11 @@ main(argc, argv)
     /* Destroy the readers */
     for (i = nreaders - 1; i >= 0; i--)
        LWP_DestroyProcess(readers[i]);
+    LWP_DestroyProcess(writer);
+
+    LWP_TerminateProcessSupport();
+
     printf("\n*Exiting*\n");
+
+    exit(0);
 }