os161-1.99
 All Data Structures
userthreads.c
00001 /*
00002  * Copyright (c) 2000, 2001, 2002, 2003, 2004, 2005, 2008, 2009
00003  *      The President and Fellows of Harvard College.
00004  *
00005  * Redistribution and use in source and binary forms, with or without
00006  * modification, are permitted provided that the following conditions
00007  * are met:
00008  * 1. Redistributions of source code must retain the above copyright
00009  *    notice, this list of conditions and the following disclaimer.
00010  * 2. Redistributions in binary form must reproduce the above copyright
00011  *    notice, this list of conditions and the following disclaimer in the
00012  *    documentation and/or other materials provided with the distribution.
00013  * 3. Neither the name of the University nor the names of its contributors
00014  *    may be used to endorse or promote products derived from this software
00015  *    without specific prior written permission.
00016  *
00017  * THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY AND CONTRIBUTORS ``AS IS'' AND
00018  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00019  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00020  * ARE DISCLAIMED.  IN NO EVENT SHALL THE UNIVERSITY OR CONTRIBUTORS BE LIABLE
00021  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
00022  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
00023  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
00024  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
00025  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
00026  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
00027  * SUCH DAMAGE.
00028  */
00029 
00030 /*
00031  * Test multiple user level threads inside a process. The program
00032  * forks 3 threads off 2 to functions, each of which displays a string
00033  * every once in a while.
00034  *
00035  * This won't do much of anything unless you implement user-level
00036  * threads.
00037  *
00038  * It also makes various assumptions about the thread API. In
00039  * particular, it believes (1) that you create a thread by calling
00040  * "threadfork()" and passing the address for execution of the new
00041  * thread to begin at, (2) that if the parent thread exits any child
00042  * threads will keep running, and (3) child threads will exit if they
00043  * return from the function they started in. If any or all of these
00044  * assumptions are not met by your user-level threads, you will need
00045  * to patch this test accordingly.
00046  *
00047  * This is also a rather basic test and you'll probably want to write
00048  * some more of your own.
00049  */
00050 
00051 
00052 #include <unistd.h>
00053 #include <stdio.h>
00054 
00055 #define NTHREADS  3
00056 #define MAX       1<<25
00057 
00058 /* counter for the loop in the threads : 
00059    This variable is shared and incremented by each 
00060    thread during his computation */
00061 volatile int count = 0;
00062 
00063 /* the 2 threads : */
00064 void ThreadRunner(void);
00065 void BladeRunner(void);
00066 
00067 int
00068 main(int argc, char *argv[])
00069 {
00070     int i;
00071 
00072     (void)argc;
00073     (void)argv;
00074 
00075     for (i=0; i<NTHREADS; i++) {
00076         if (i)
00077             threadfork(ThreadRunner);
00078         else
00079             threadfork(BladeRunner);
00080     }
00081 
00082     printf("Parent has left.\n");
00083     return 0;
00084 }
00085 
00086 /* multiple threads will simply print out the global variable.
00087    Even though there is no synchronization, we should get some 
00088    random results.
00089 */
00090 
00091 void
00092 BladeRunner()
00093 {
00094     while (count < MAX) {
00095         if (count % 500 == 0)
00096             printf("Blade ");
00097         count++;
00098     }
00099 }
00100 
00101 void
00102 ThreadRunner()
00103 {
00104     while (count < MAX) {
00105         if (count % 513 == 0)
00106             printf(" Runner\n");
00107         count++;
00108     }
00109 }
00110     
 All Data Structures