2 #include "structdefs.h"
13 extern int classsize[];
14 jmp_buf error_handler;
17 #include "checkpoint.h"
19 #include "SimpleHash.h"
20 #include "GenericHashtable.h"
22 struct Queue * activetasks;
23 struct parameterwrapper * objectqueues[NUMCLASSES];
24 struct genhashtable * failedtasks;
26 int main(int argc, char **argv) {
30 /* Allocate startup object */
31 struct ___StartupObject___ *startupobject=(struct ___StartupObject___*) allocate_new(STARTUPTYPE);
32 struct ArrayObject * stringarray=allocate_newarray(STRINGARRAYTYPE, argc);
33 failedtasks=genallocatehashtable((unsigned int (*)(void *)) &hashCodetpd,
34 (int (*)(void *,void *)) &comparetpd);
36 activetasks=createQueue();
40 flagorand(startupobject,1,0xFFFFFFFF);
42 /* Build array of strings */
44 startupobject->___parameters___=stringarray;
47 int length=strlen(argv[i]);
48 struct ___String___ *newstring=NewString(argv[i],length);
49 ((void **)(((char *)& stringarray->___length___)+sizeof(int)))[i]=newstring;
55 int hashCodetpd(struct taskparamdescriptor *ftd) {
56 int hash=(int)ftd->task;
58 for(i=0;i<ftd->numParameters;i++) {
59 hash^=(int)ftd->parameterArray[i];
64 int comparetpd(struct taskparamdescriptor *ftd1, struct taskparamdescriptor *ftd2) {
66 if (ftd1->task!=ftd2->task)
68 for(i=0;i<ftd1->numParameters;i++)
69 if (ftd1->parameterArray[i]!=ftd2->parameterArray[i])
74 void flagorand(void * ptr, int ormask, int andmask) {
75 int flag=((int *)ptr)[1];
76 struct RuntimeHash *flagptr=(struct RuntimeHash *)(((int*)ptr)[2]);
80 /*Remove from all queues */
81 while(flagptr!=NULL) {
82 struct RuntimeHash *next;
83 RuntimeHashget(flagptr, (int) ptr, (int *) &next);
84 RuntimeHashremove(flagptr, (int)ptr, (int) next);
89 struct QueueItem *tmpptr;
90 struct parameterwrapper * parameter=objectqueues[((int *)ptr)[0]];
92 struct RuntimeHash * prevptr=NULL;
93 while(parameter!=NULL) {
94 for(i=0;i<parameter->numberofterms;i++) {
95 int andmask=parameter->intarray[i*2];
96 int checkmask=parameter->intarray[i*2+1];
97 if ((flag&andmask)==checkmask) {
98 RuntimeHashadd(parameter->objectset, (int) ptr, (int) prevptr);
99 prevptr=parameter->objectset;
101 struct RuntimeIterator iteratorarray[MAXTASKPARAMS];
102 void * taskpointerarray[MAXTASKPARAMS];
104 int numparams=parameter->task->numParameters;
106 struct taskdescriptor * task=parameter->task;
108 for(j=0;j<numparams;j++) {
109 struct parameterwrapper *pw=(struct parameterwrapper *)task->descriptorarray[j]->queue;
111 taskpointerarray[j]=ptr;
114 RuntimeHashiterator(pw->objectset, &iteratorarray[j]);
115 if (RunhasNext(&iteratorarray[j]))
116 taskpointerarray[j]=(void *) Runnext(&iteratorarray[j]);
118 break; /* No tasks to dispatch */
121 /* Queue task items... */
124 struct taskparamdescriptor *tpd=RUNMALLOC(sizeof(struct taskparamdescriptor));
126 tpd->numParameters=numparams;
127 tpd->parameterArray=RUNMALLOC(sizeof(void *)*numparams);
128 for(j=0;j<numparams;j++)
129 tpd->parameterArray[j]=taskpointerarray[j];
131 if (!gencontains(failedtasks, tpd))
132 addNewItem(activetasks, tpd);
134 /* This loop iterates to the next paramter combination */
135 for(j=0;j<numparams;j++) {
137 if ((j+1)==numparams)
141 if (RunhasNext(&iteratorarray[j])) {
142 taskpointerarray[j]=(void *) Runnext(&iteratorarray[j]);
144 } else if ((j+1)!=numparams) {
145 RuntimeHashiterator(task->descriptorarray[j]->queue, &iteratorarray[j]);
156 parameter=parameter->next;
158 ((struct RuntimeHash **)ptr)[2]=prevptr;
162 /* Handler for signals */
163 void myhandler(int sig, struct __siginfo *info, void *uap) {
165 printf("sig=%d\n",sig);
168 longjmp(error_handler,1);
171 void executetasks() {
172 void * taskpointerarray[MAXTASKPARAMS];
174 /* Set up signal handlers */
175 struct sigaction sig;
176 sig.sa_sigaction=&myhandler;
177 sig.sa_flags=SA_SIGINFO;
178 sigemptyset(&sig.sa_mask);
180 /* Catch bus errors, segmentation faults, and floating point exceptions*/
181 sigaction(SIGBUS,&sig,0);
182 sigaction(SIGSEGV,&sig,0);
183 sigaction(SIGFPE,&sig,0);
185 /* Map first block of memory to protected, anonymous page */
186 mmap(0, 0x1000, 0, MAP_SHARED|MAP_FIXED|MAP_ANON, -1, 0);
189 while(!isEmpty(activetasks)) {
190 struct QueueItem * qi=(struct QueueItem *) getTail(activetasks);
191 struct taskparamdescriptor *tpd=(struct taskparamdescriptor *) qi->objectptr;
193 removeItem(activetasks, qi);
195 for(i=0;i<tpd->task->numParameters;i++) {
196 void * parameter=tpd->parameterArray[i];
197 struct parameterdescriptor * pd=tpd->task->descriptorarray[i];
198 struct parameterwrapper *pw=(struct parameterwrapper *) pd->queue;
199 if (!RuntimeHashcontainskey(pw->objectset, (int) parameter))
201 taskpointerarray[i]=parameter;
204 struct RuntimeHash * forward=allocateRuntimeHash(100);
205 struct RuntimeHash * reverse=allocateRuntimeHash(100);
206 void ** checkpoint=makecheckpoint(tpd->task->numParameters, taskpointerarray, forward, reverse);
207 if (setjmp(error_handler)) {
211 printf("Recovering\n");
213 genputtable(failedtasks,tpd,tpd);
214 restorecheckpoint(tpd->task->numParameters, taskpointerarray, checkpoint, forward, reverse);
216 /* Actually call task */
217 ((void (*) (void **)) tpd->task->taskptr)(taskpointerarray);
223 void processtasks() {
225 for(i=0;i<numtasks;i++) {
226 struct taskdescriptor * task=taskarray[i];
229 for(j=0;j<task->numParameters;j++) {
230 struct parameterdescriptor *param=task->descriptorarray[j];
231 struct parameterwrapper * parameter=RUNMALLOC(sizeof(struct parameterwrapper));
232 struct parameterwrapper ** ptr=&objectqueues[param->type];
234 param->queue=parameter;
235 parameter->objectset=allocateRuntimeHash(10);
236 parameter->numberofterms=param->numberterms;
237 parameter->intarray=param->intarray;
238 parameter->task=task;
239 /* Link new queue in */
248 int ___Object______hashcode____(struct ___Object___ * ___this___) {
249 return (int) ___this___;
252 void ___System______printString____L___String___(struct ___String___ * s) {
253 struct ArrayObject * chararray=s->___string___;
255 for(i=0;i<chararray->___length___;i++) {
256 short s= ((short *)(((char *)& chararray->___length___)+sizeof(int)))[i];
261 void * allocate_new(int type) {
262 void * v=FREEMALLOC(classsize[type]);
267 struct ArrayObject * allocate_newarray(int type, int length) {
268 struct ArrayObject * v=FREEMALLOC(sizeof(struct ArrayObject)+length*classsize[type]);
270 v->___length___=length;
274 struct ___String___ * NewString(char *str,int length) {
275 struct ArrayObject * chararray=allocate_newarray(CHARARRAYTYPE, length);
276 struct ___String___ * strobj=allocate_new(STRINGTYPE);
278 strobj->___string___=chararray;
279 for(i=0;i<length;i++) {
280 ((short *)(((char *)& chararray->___length___)+sizeof(int)))[i]=(short)str[i]; }
284 void failedboundschk() {
286 printf("Array out of bounds\n");
289 longjmp(error_handler,2);
293 void failednullptr() {
295 printf("Dereferenced a null pointer\n");
298 longjmp(error_handler,3);