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