start of new file
[IRC.git] / Robust / src / Runtime / task.c
index 788ee67698c371a1e7b9f5dc8765f0214622af8d..57bcbf07f2c986383aa6278f6d13f89b261b9a7c 100644 (file)
@@ -77,8 +77,9 @@ void createstartupobject(int argc, char ** argv) {
     ((void **)(((char *)& stringarray->___length___)+sizeof(int)))[i-1]=newstring;
   }
   
-  /* Set initialized flag for startup object */
+  /* Set initialized flag for startup object */ 
   flagorand(startupobject,1,0xFFFFFFFF);
+  enqueueObject(startupobject);
 }
 
 int hashCodetpd(struct taskparamdescriptor *ftd) {
@@ -324,7 +325,7 @@ void flagorand(void * ptr, int ormask, int andmask) {
     }
 }
  
-void intflagorand(void * ptr, int ormask, int andmask) {
+bool intflagorand(void * ptr, int ormask, int andmask) {
 #ifdef OPTIONAL
   struct ___Object___ * obj = (struct ___Object___ *)ptr;
   if(obj->numfses) {/*store the information about fses*/
@@ -348,8 +349,11 @@ void intflagorand(void * ptr, int ormask, int andmask) {
       int flag=ormask|oldflag;
       flag&=andmask;
       if (flag==oldflag) /* Don't do anything */
-       return;
-      else flagbody(ptr, flag);
+       return false;
+      else {
+                flagbody(ptr, flag);
+                return true;
+         }
     }
 }
 
@@ -375,6 +379,10 @@ void flagbody(struct ___Object___ *ptr, int flag) {
       free(enterflags);
     flagptr=next;
   }
+ }
+
+ void enqueueObject(void *vptr) {
+   struct ___Object___ *ptr = (struct ___Object___ *)vptr;
   
   {
     struct QueueItem *tmpptr;
@@ -420,7 +428,7 @@ void flagbody(struct ___Object___ *ptr, int flag) {
       for(i=0;i<parameter->numberofterms;i++) {
        int andmask=parameter->intarray[i*2];
        int checkmask=parameter->intarray[i*2+1];
-       if ((flag&andmask)==checkmask) {
+       if ((ptr->flag&andmask)==checkmask) {
          enqueuetasks(parameter, prevptr, ptr, NULL, 0);
          prevptr=parameter;
          break;
@@ -432,7 +440,7 @@ void flagbody(struct ___Object___ *ptr, int flag) {
     ptr->flagptr=prevptr;
   }
 }
+
 #ifdef OPTIONAL
 
 int checktags(struct ___Object___ * currobj, struct fsanalysiswrapper * fswrapper) {
@@ -895,8 +903,9 @@ int enqueuetasks(struct parameterwrapper *parameter, struct parameterwrapper *pr
   /* Find initial state */
   for(j=0;j<numiterators;j++) {
   backtrackinit:
-    if(toiHasNext(&parameter->iterators[j], taskpointerarray OPTARG(failed)))
+    if(toiHasNext(&parameter->iterators[j], taskpointerarray OPTARG(failed))){
       toiNext(&parameter->iterators[j], taskpointerarray OPTARG(failed));
+       }
     else if (j>0) {
       /* Need to backtrack */
       toiReset(&parameter->iterators[j]);
@@ -938,15 +947,16 @@ int enqueuetasks(struct parameterwrapper *parameter, struct parameterwrapper *pr
 #endif
       RUNFREE(tpd);
     }
-    
+
     /* This loop iterates to the next parameter combination */
     if (numiterators==0)
       return retval;
 
     for(j=numiterators-1; j<numiterators;j++) {
     backtrackinc:
-      if(toiHasNext(&parameter->iterators[j], taskpointerarray OPTARG(failed)))
+      if(toiHasNext(&parameter->iterators[j], taskpointerarray OPTARG(failed))){
        toiNext(&parameter->iterators[j], taskpointerarray OPTARG(failed));
+         }
       else if (j>0) {
        /* Need to backtrack */
        toiReset(&parameter->iterators[j]);
@@ -1060,7 +1070,9 @@ void executetasks() {
            void * objptr;
            //      printf("Setting fd %d\n",fd);
            if (RuntimeHashget(fdtoobject, fd,(int *) &objptr)) {
-             intflagorand(objptr,1,0xFFFFFFFF); /* Set the first flag to 1 */
+             if(intflagorand(objptr,1,0xFFFFFFFF)) { /* Set the first flag to 1 */
+                        enqueueObject(objptr);
+                 }
            }
          }
        }
@@ -1077,6 +1089,9 @@ void executetasks() {
       if (gencontains(failedtasks, currtpd)) {
        // Free up task parameter descriptor
        RUNFREE(currtpd->parameterArray);
+#ifdef OPTIONAL
+       RUNFREE(currtpd->failed);
+#endif
        RUNFREE(currtpd);
        goto newtask;
       }
@@ -1135,6 +1150,9 @@ void executetasks() {
          struct ___TagDescriptor___ *tagd=currtpd->parameterArray[slotid];
          if (!containstag(parameter, tagd)) {
            RUNFREE(currtpd->parameterArray);
+#ifdef OPTIONAL
+           RUNFREE(currtpd->failed);
+#endif
            RUNFREE(currtpd);
            goto newtask;
          }
@@ -1217,6 +1235,9 @@ void executetasks() {
          freemalloc();
          // Free up task parameter descriptor
          RUNFREE(currtpd->parameterArray);
+#ifdef OPTIONAL
+         RUNFREE(currtpd->failed);
+#endif
          RUNFREE(currtpd);
          forward=NULL;
          reverse=NULL;
@@ -1335,7 +1356,7 @@ void builditerators(struct taskdescriptor * task, int index, struct parameterwra
    int i;
    int j;
    for(i=0;i<numtasks;i++) {
-     struct taskdescriptor * task=taskarray[i];
+        struct taskdescriptor * task=taskarray[i];
      printf("%s\n", task->name);
      for(j=0;j<task->numParameters;j++) {
        struct parameterdescriptor *param=task->descriptorarray[j];
@@ -1380,7 +1401,7 @@ void builditerators(struct taskdescriptor * task, int index, struct parameterwra
 void processtasks() {
   int i;
   for(i=0;i<numtasks;i++) {
-    struct taskdescriptor * task=taskarray[i];
+       struct taskdescriptor * task=taskarray[i];
     int j;
 
     for(j=0;j<task->numParameters;j++) {
@@ -1395,6 +1416,7 @@ void processtasks() {
       parameter->numbertags=param->numbertags;
       parameter->tagarray=param->tagarray;
       parameter->task=task;
+         parameter->slot=j;
       /* Link new queue in */
       while((*ptr)!=NULL)
        ptr=&((*ptr)->next);
@@ -1404,8 +1426,7 @@ void processtasks() {
     /* Build iterators for parameters */
     for(j=0;j<task->numParameters;j++) {
       struct parameterdescriptor *param=task->descriptorarray[j];
-      struct parameterwrapper *parameter=param->queue;      
-      parameter->slot=j;
+      struct parameterwrapper *parameter=param->queue;
       builditerators(task, j, parameter);
     }
   }
@@ -1628,7 +1649,8 @@ void toiNext(struct tagobjectiterator *it , void ** objectarray OPTARG(int * fai
     }
   } else {
     /* Iterate object */
-    objectarray[it->slot]=(void *)Objkey(&it->it);
+         void * tmpp = (void *) Objkey(&it->it);
+    objectarray[it->slot]=tmpp;
 #ifdef OPTIONAL
     failed[it->slot]=it->failedstate;
     if (it->failedstate==0) {