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
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050 #define NTRIES 1200
00051 #define ITEMSIZE 997
00052 #define NTHREADS 8
00053
00054 static
00055 void
00056 mallocthread(void *sm, unsigned long num)
00057 {
00058 struct semaphore *sem = sm;
00059 void *ptr;
00060 void *oldptr=NULL;
00061 void *oldptr2=NULL;
00062 int i;
00063
00064 for (i=0; i<NTRIES; i++) {
00065 ptr = kmalloc(ITEMSIZE);
00066 if (ptr==NULL) {
00067 if (sem) {
00068 kprintf("thread %lu: kmalloc returned NULL\n",
00069 num);
00070 V(sem);
00071 return;
00072 }
00073 kprintf("kmalloc returned null; test failed.\n");
00074 return;
00075 }
00076 if (oldptr2) {
00077 kfree(oldptr2);
00078 }
00079 oldptr2 = oldptr;
00080 oldptr = ptr;
00081 }
00082 if (oldptr2) {
00083 kfree(oldptr2);
00084 }
00085 if (oldptr) {
00086 kfree(oldptr);
00087 }
00088 if (sem) {
00089 V(sem);
00090 }
00091 }
00092
00093 int
00094 malloctest(int nargs, char **args)
00095 {
00096 (void)nargs;
00097 (void)args;
00098
00099 kprintf("Starting kmalloc test...\n");
00100 mallocthread(NULL, 0);
00101 kprintf("kmalloc test done\n");
00102
00103 return 0;
00104 }
00105
00106 int
00107 mallocstress(int nargs, char **args)
00108 {
00109 struct semaphore *sem;
00110 int i, result;
00111
00112 (void)nargs;
00113 (void)args;
00114
00115 sem = sem_create("mallocstress", 0);
00116 if (sem == NULL) {
00117 panic("mallocstress: sem_create failed\n");
00118 }
00119
00120 kprintf("Starting kmalloc stress test...\n");
00121
00122 for (i=0; i<NTHREADS; i++) {
00123 result = thread_fork("mallocstress", NULL,
00124 mallocthread, sem, i);
00125 if (result) {
00126 panic("mallocstress: thread_fork failed: %s\n",
00127 strerror(result));
00128 }
00129 }
00130
00131 for (i=0; i<NTHREADS; i++) {
00132 P(sem);
00133 }
00134
00135 sem_destroy(sem);
00136 kprintf("kmalloc stress test done\n");
00137
00138 return 0;
00139 }