chiark / gitweb /
check in abortive confused attempt to deal with resolution movpos bug; will revert...
authorian <ian>
Sun, 8 Jun 2008 20:00:46 +0000 (20:00 +0000)
committerian <ian>
Sun, 8 Jun 2008 20:00:46 +0000 (20:00 +0000)
hostside/resolve.c

index c15b44e7df69fd3afe4a84d493443598328d44fb..ac855884b7157bae3e956e4db2887792b29ba71d 100644 (file)
@@ -324,49 +324,58 @@ static int resolve_complete_main(void) {
       problems++;
     }
   }
-    
+  return problems;
+}
+
+static int resolve_complete_movpos_segment(Segment *d) {
+  int problems= 0;
   TrackAdvanceContext tac;
   MovPosComb target;
   tac.getmovpos= resmain_getmovpos;
 
-  FOR_SEGMENT(d,NOOP,NOOP) {
-    if (problems) return problems;
+  d->iselem_u= 0;
 
-    d->iselem_u= 0;
+  target= just_getmovpos(d,&tac);
 
-    target= just_getmovpos(d,&tac);
-
-    if (d->i->invertible) {
-      Segment *interferer= segment_interferes(&tac,d);
-      if (interferer) {
-       actual_inversions_start();
-       d->seg_inverted= interferer->seg_inverted
-           ^ d->i->interferes_polarity_opposed;
-       actual_inversions_segment(d);
-       actual_inversions_done();
-      }
+  if (d->i->invertible) {
+    Segment *interferer= segment_interferes(&tac,d);
+    if (interferer) {
+      actual_inversions_start();
+      d->seg_inverted= interferer->seg_inverted
+       ^ d->i->interferes_polarity_opposed;
+      actual_inversions_segment(d);
+      actual_inversions_done();
     }
+  }
 
-    if (d->i->n_poscombs>1) {
-      d->movposcomb= -1;
-      if (target >= 0) {
-       assert(!d->motion);
-       ErrorCode ec= movpos_reserve(d,-1,&d->motion,target,-1);
-       if (ec) {
-         ouprintf("resolution movpos-change-failed %s/%s %s\n",
-                  d->i->pname, d->i->poscombs[target].pname,
-                  errorcodelist[ec]);
-         problems++;
-       }
+  if (d->i->n_poscombs>1) {
+    d->movposcomb= -1;
+    if (target >= 0) {
+      assert(!d->motion);
+      ErrorCode ec= movpos_reserve(d,-1,&d->motion,target,-1);
+      if (ec) {
+       ouprintf("resolution movpos-change-failed %s/%s %s\n",
+                d->i->pname, d->i->poscombs[target].pname,
+                errorcodelist[ec]);
+       problems++;
       }
-    } else {
-      assert(!d->i->n_movfeats);
-      d->movposcomb= 0;
     }
+  } else {
+    assert(!d->i->n_movfeats);
+    d->movposcomb= 0;
   }
   return problems;
 }
 
+static int resolve_complete_movpos(void) {
+  SEGMENT_ITERVARS(d);
+  int problems= 0;
+
+  FOR_SEGMENT(d,NOOP,NOOP)
+    problems += resolve_complete_movpos_segment(d);
+  return problems;
+}
+
 #undef iselem_u
 
 /*---------- heads and tails of trains, final placement ----------*/
@@ -380,18 +389,6 @@ typedef struct {
   int extraspace;
 } FindEndUserContext;
 
-static int findends_getmovpos(TrackLocation *t, TrackAdvanceContext *c,
-                             MovPosComb *use_io) {
-  const char *pn= t->seg->i->pname;
-  if (t->seg->motion) *use_io= movpos_change_intent(t->seg->motion);
-  if (*use_io<0) {
-    DPRINTF(resolving,ends, " getmovpos %s fails\n", pn);
-    return -1;
-  }
-  DPRINTF(resolving,ends, " getmovpos %s -> %d\n", pn, *use_io);
-  return 0;
-}
-
 static int segdist(Segment *seg) {
   TrackLocation t;
   int r;
@@ -400,7 +397,7 @@ static int segdist(Segment *seg) {
   t.seg= seg;
   mpc= seg->movposcomb;
   
-  r= findends_getmovpos(&t,0,&mpc);
+  r= resmain_getmovpos(&t,0,&mpc);
   assert(!r);  assert(mpc >= 0);
   return seg->i->poscombs[mpc].dist;
 }
@@ -485,7 +482,7 @@ static int resolve_complete_ends_train(Train *tra) {
 
   tc.distance= TL_DIST_INF;
   tc.nextseg= findhead_nextseg;
-  tc.getmovpos= findends_getmovpos;
+  tc.getmovpos= resmain_getmovpos;
   tc.trackend= 0;
   tc.u= &u;
 
@@ -503,6 +500,11 @@ static int resolve_complete_ends_train(Train *tra) {
          tra->foredetect->tr_backwards?"-":"", tra->foredetect->i->pname,
          segdist(tra->foredetect));
 
+//  if (u.furthest != tra->foredetect) {
+//    int problems= resolve_complete_movpos_segment(u.furthest);
+//    if (problems) return problems;
+//  }
+
   tra->maxinto= segdist(tra->foredetect) - u.extraspace;
   if (tra->maxinto < 0) {
     ouprintf("resolution mispositioned head %s %s %d\n",
@@ -589,6 +591,8 @@ int resolve_complete(void) {
   problems= resolve_complete_main();
   if (!problems)
     problems += resolve_complete_ends();
+  if (!problems)
+    problems += resolve_complete_movpos();
 
   if (problems) {
     ouprintf("resolution problems %d\n",problems);