00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include <types.h>
00034 #include <lib.h>
00035 #include <thread.h>
00036 #include <synch.h>
00037 #include <test.h>
00038
00039 #define NTHREADS 8
00040
00041 static struct semaphore *tsem = NULL;
00042
00043 static
00044 void
00045 init_sem(void)
00046 {
00047 if (tsem==NULL) {
00048 tsem = sem_create("tsem", 0);
00049 if (tsem == NULL) {
00050 panic("threadtest: sem_create failed\n");
00051 }
00052 }
00053 }
00054
00055 static
00056 void
00057 loudthread(void *junk, unsigned long num)
00058 {
00059 int ch = '0' + num;
00060 int i;
00061
00062 (void)junk;
00063
00064 for (i=0; i<120; i++) {
00065 putch(ch);
00066 }
00067 V(tsem);
00068 }
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080 static
00081 void
00082 quietthread(void *junk, unsigned long num)
00083 {
00084 int ch = '0' + num;
00085 volatile int i;
00086
00087 (void)junk;
00088
00089 putch(ch);
00090 for (i=0; i<200000; i++);
00091 putch(ch);
00092
00093 V(tsem);
00094 }
00095
00096 static
00097 void
00098 runthreads(int doloud)
00099 {
00100 char name[16];
00101 int i, result;
00102
00103 for (i=0; i<NTHREADS; i++) {
00104 snprintf(name, sizeof(name), "threadtest%d", i);
00105 result = thread_fork(name, NULL,
00106 doloud ? loudthread : quietthread,
00107 NULL, i);
00108 if (result) {
00109 panic("threadtest: thread_fork failed %s)\n",
00110 strerror(result));
00111 }
00112 }
00113
00114 for (i=0; i<NTHREADS; i++) {
00115 P(tsem);
00116 }
00117 }
00118
00119
00120 int
00121 threadtest(int nargs, char **args)
00122 {
00123 (void)nargs;
00124 (void)args;
00125
00126 init_sem();
00127 kprintf("Starting thread test...\n");
00128 runthreads(1);
00129 kprintf("\nThread test done.\n");
00130
00131 return 0;
00132 }
00133
00134 int
00135 threadtest2(int nargs, char **args)
00136 {
00137 (void)nargs;
00138 (void)args;
00139
00140 init_sem();
00141 kprintf("Starting thread test 2...\n");
00142 runthreads(0);
00143 kprintf("\nThread test 2 done.\n");
00144
00145 return 0;
00146 }