/*1* Copyright (c) 2000, 2001, 2002, 2003, 2004, 2005, 2008, 20092* The President and Fellows of Harvard College.3*4* Redistribution and use in source and binary forms, with or without5* modification, are permitted provided that the following conditions6* are met:7* 1. Redistributions of source code must retain the above copyright8* notice, this list of conditions and the following disclaimer.9* 2. Redistributions in binary form must reproduce the above copyright10* notice, this list of conditions and the following disclaimer in the11* documentation and/or other materials provided with the distribution.12* 3. Neither the name of the University nor the names of its contributors13* may be used to endorse or promote products derived from this software14* without specific prior written permission.15*16* THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY AND CONTRIBUTORS ``AS IS'' AND17* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE18* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE19* ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OR CONTRIBUTORS BE LIABLE20* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL21* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS22* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)23* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT24* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY25* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF26* SUCH DAMAGE.27*/2829/*30* Test multiple user level threads inside a process. The program31* forks 3 threads off 2 to functions, each of which displays a string32* every once in a while.33*34* This won't do much of anything unless you implement user-level35* threads.36*37* It also makes various assumptions about the thread API. In38* particular, it believes (1) that you create a thread by calling39* "threadfork()" and passing the address for execution of the new40* thread to begin at, (2) that if the parent thread exits any child41* threads will keep running, and (3) child threads will exit if they42* return from the function they started in. If any or all of these43* assumptions are not met by your user-level threads, you will need44* to patch this test accordingly.45*46* This is also a rather basic test and you'll probably want to write47* some more of your own.48*/495051#include <unistd.h>52#include <stdio.h>5354#define NTHREADS 355#define MAX 1<<255657/* counter for the loop in the threads :58This variable is shared and incremented by each59thread during his computation */60volatile int count = 0;6162/* the 2 threads : */63void ThreadRunner(void);64void BladeRunner(void);6566int67main(int argc, char *argv[])68{69int i;7071(void)argc;72(void)argv;7374for (i=0; i<NTHREADS; i++) {75if (i)76threadfork(ThreadRunner);77else78threadfork(BladeRunner);79}8081printf("Parent has left.\n");82return 0;83}8485/* multiple threads will simply print out the global variable.86Even though there is no synchronization, we should get some87random results.88*/8990void91BladeRunner()92{93while (count < MAX) {94if (count % 500 == 0)95printf("Blade ");96count++;97}98}99100void101ThreadRunner()102{103while (count < MAX) {104if (count % 513 == 0)105printf(" Runner\n");106count++;107}108}109110111112