chiark / gitweb /
WIP new retry-based pager
authorIan Jackson <ian@liberator.relativity.greenend.org.uk>
Sun, 28 Jun 2009 15:37:10 +0000 (16:37 +0100)
committerIan Jackson <ian@liberator.relativity.greenend.org.uk>
Sun, 28 Jun 2009 15:37:10 +0000 (16:37 +0100)
pctb/pages.c

index 1a9970162ce10c8fd667208b5476f1ca9cde44f8..a0a52b45e4da60e653a73dc76d67bef6226399de 100644 (file)
@@ -301,7 +301,7 @@ static int identical(const Snapshot *a, const Snapshot *b) {
     return 0;
 
   int compare_to= a->h;
     return 0;
 
   int compare_to= a->h;
-  if (max_relevant_y && compare_to > max_relevant_y)
+  if (max_relevant_y>=0 && compare_to > max_relevant_y)
     compare_to= max_relevant_y;
   
   return !memcmp(a->data, b->data, a->w * 3 * compare_to);
     compare_to= max_relevant_y;
   
   return !memcmp(a->data, b->data, a->w * 3 * compare_to);
@@ -327,14 +327,21 @@ static void wait_for_stability(Snapshot **output,
 
   char *doing;
   sysassert( vasprintf(&doing,fmt,al) >=0 );
 
   char *doing;
   sysassert( vasprintf(&doing,fmt,al) >=0 );
-  progress("%s",doing);
 
   debugf("PAGING  wait_for_stability"
          "  last_input=%f previously=%p `%s'\n",
          last_input, previously, doing);
 
 
   debugf("PAGING  wait_for_stability"
          "  last_input=%f previously=%p `%s'\n",
          last_input, previously, doing);
 
+  double min_interval= 25000; /*us*/
   for (;;) {
   for (;;) {
-    usleep(250000);
+    progress_spinner("%s",doing);
+    
+    double since_last_input= timestamp() - last_input;
+    double this_interval= min_interval - since_last_input;
+
+    if (this_interval >= 0)
+      usleep(this_interval);
+
     snapshot(output);
 
     if (!last) {
     snapshot(output);
 
     if (!last) {
@@ -344,23 +351,27 @@ static void wait_for_stability(Snapshot **output,
       debugf("PAGING  wait_for_stability changed...\n");
       free(last); last=*output; *output=0;
       nidentical=0;
       debugf("PAGING  wait_for_stability changed...\n");
       free(last); last=*output; *output=0;
       nidentical=0;
+      if (!with_keypress) {
+       min_interval *= 3.0;
+       min_interval += 0.5;
+      }
     } else {
       nidentical++;
       int threshold=
        !previously ? 3 :
     } else {
       nidentical++;
       int threshold=
        !previously ? 3 :
-       identical(*output,previously) ? 3
+       identical(*output,previously) ? 5
        : 1;
       debugf("PAGING  wait_for_stability nidentical=%d threshold=%d\n",
              nidentical, threshold);
       if (nidentical >= threshold)
        break;
        : 1;
       debugf("PAGING  wait_for_stability nidentical=%d threshold=%d\n",
              nidentical, threshold);
       if (nidentical >= threshold)
        break;
+
+      min_interval += 0.5;
+      min_interval *= 2.0;
     }
     }
-    progress_spinner("%s",doing);
 
     if (with_keypress)
       with_keypress();
 
     if (with_keypress)
       with_keypress();
-
-    usleep(250000);
   }
 
   free_snapshot(&last);
   }
 
   free_snapshot(&last);