start of new file
[IRC.git] / Robust / src / Runtime / task.c
index 96b78d8cf6feb1731a80c0f415cf7cfc487d75bf..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;
+         }
     }
 }
 
@@ -367,11 +371,18 @@ void flagbody(struct ___Object___ *ptr, int flag) {
   /*Remove object from all queues */
   while(flagptr!=NULL) {
     struct parameterwrapper *next;
-    int UNUSED, UNUSED2, UNUSED3;
-    ObjectHashget(flagptr->objectset, (int) ptr, (int *) &next, &UNUSED, &UNUSED2, &UNUSED3);
+    int UNUSED, UNUSED2;
+    int * enterflags;
+    ObjectHashget(flagptr->objectset, (int) ptr, (int *) &next, (int *) &enterflags, &UNUSED, &UNUSED2);
     ObjectHashremove(flagptr->objectset, (int)ptr);
+    if (enterflags!=NULL)
+      free(enterflags);
     flagptr=next;
   }
+ }
+
+ void enqueueObject(void *vptr) {
+   struct ___Object___ *ptr = (struct ___Object___ *)vptr;
   
   {
     struct QueueItem *tmpptr;
@@ -417,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;
@@ -429,7 +440,7 @@ void flagbody(struct ___Object___ *ptr, int flag) {
     ptr->flagptr=prevptr;
   }
 }
+
 #ifdef OPTIONAL
 
 int checktags(struct ___Object___ * currobj, struct fsanalysiswrapper * fswrapper) {
@@ -803,9 +814,12 @@ void enqueueoptional(struct ___Object___ * currobj, int numfailedfses, int * fai
     /*Remove object from all queues */
     while(flagptr!=NULL) {
       struct parameterwrapper *next;
-      int UNUSED, UNUSED2, UNUSED3;
-      ObjectHashget(flagptr->objectset, (int) currobj, (int *) &next, &UNUSED, &UNUSED2, &UNUSED3);
+      int UNUSED, UNUSED2;
+      int * enterflags;
+      ObjectHashget(flagptr->objectset, (int) currobj, (int *) &next, (int *) &enterflags, &UNUSED, &UNUSED2);
       ObjectHashremove(flagptr->objectset, (int)currobj);
+      if (enterflags!=NULL)
+       free(enterflags);
       flagptr=next;
     }
 
@@ -889,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]);
@@ -932,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]);
@@ -1054,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);
+                 }
            }
          }
        }
@@ -1071,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;
       }
@@ -1129,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;
          }
@@ -1211,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;
@@ -1329,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];
@@ -1374,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++) {
@@ -1389,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);
@@ -1398,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);
     }
   }
@@ -1622,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) {