From fa60b92034524d00ddd4a733a0d0b9adb2aea19b Mon Sep 17 00:00:00 2001
From: Pedro Gonnet <pedro.gonnet@durham.ac.uk>
Date: Thu, 30 Aug 2012 18:48:45 +0000
Subject: [PATCH] be more careful regarding empty cells.

Former-commit-id: 4f9fea4c98297fbdc115398e1ed84e9f6a69ab5a
---
 runner.c | 219 ++++++++++++++++++++++++++++++++++++-------------------
 space.c  |   3 +-
 2 files changed, 148 insertions(+), 74 deletions(-)

diff --git a/runner.c b/runner.c
index 081509f9b0..094886251d 100644
--- a/runner.c
+++ b/runner.c
@@ -547,106 +547,179 @@ void runner_dosub ( struct runner_thread *rt , struct cell *ci , struct cell *cj
         case 0:
             for ( j = 0 ; j < 7 ; j++ )
                 for ( k = j + 1 ; k < 8 ; k++ )
-                    runner_dopair( rt , ci->progeny[j] , ci->progeny[k] );
+                    if ( ci->progeny[j] != NULL && ci->progeny[k] != NULL )
+                        runner_dopair( rt , ci->progeny[j] , ci->progeny[k] );
             break;
             
         case 1: /* (  1 ,  1 ,  0 ) */
-            runner_dopair( rt , ci->progeny[6] , cj->progeny[0] );
-            runner_dopair( rt , ci->progeny[6] , cj->progeny[1] );
-            runner_dopair( rt , ci->progeny[7] , cj->progeny[0] );
-            runner_dopair( rt , ci->progeny[7] , cj->progeny[1] );
+            if ( ci->progeny[6] != NULL && cj->progeny[0] != NULL )
+                runner_dopair( rt , ci->progeny[6] , cj->progeny[0] );
+            if ( ci->progeny[6] != NULL && cj->progeny[1] != NULL )
+                runner_dopair( rt , ci->progeny[6] , cj->progeny[1] );
+            if ( ci->progeny[7] != NULL && cj->progeny[0] != NULL )
+                runner_dopair( rt , ci->progeny[7] , cj->progeny[0] );
+            if ( ci->progeny[7] != NULL && cj->progeny[1] != NULL )
+                runner_dopair( rt , ci->progeny[7] , cj->progeny[1] );
             break;
     
         case 3: /* (  1 ,  0 ,  1 ) */
-            runner_dopair( rt , ci->progeny[5] , cj->progeny[0] );
-            runner_dopair( rt , ci->progeny[5] , cj->progeny[2] );
-            runner_dopair( rt , ci->progeny[7] , cj->progeny[0] );
-            runner_dopair( rt , ci->progeny[7] , cj->progeny[2] );
+            if ( ci->progeny[5] != NULL && cj->progeny[0] != NULL )
+                runner_dopair( rt , ci->progeny[5] , cj->progeny[0] );
+            if ( ci->progeny[5] != NULL && cj->progeny[2] != NULL )
+                runner_dopair( rt , ci->progeny[5] , cj->progeny[2] );
+            if ( ci->progeny[7] != NULL && cj->progeny[0] != NULL )
+                runner_dopair( rt , ci->progeny[7] , cj->progeny[0] );
+            if ( ci->progeny[7] != NULL && cj->progeny[2] != NULL )
+                runner_dopair( rt , ci->progeny[7] , cj->progeny[2] );
             break;
                     
         case 4: /* (  1 ,  0 ,  0 ) */
-            runner_dopair( rt , ci->progeny[4] , cj->progeny[0] );
-            runner_dopair( rt , ci->progeny[4] , cj->progeny[1] );
-            runner_dopair( rt , ci->progeny[4] , cj->progeny[2] );
-            runner_dopair( rt , ci->progeny[4] , cj->progeny[3] );
-            runner_dopair( rt , ci->progeny[5] , cj->progeny[0] );
-            runner_dopair( rt , ci->progeny[5] , cj->progeny[1] );
-            runner_dopair( rt , ci->progeny[5] , cj->progeny[2] );
-            runner_dopair( rt , ci->progeny[5] , cj->progeny[3] );
-            runner_dopair( rt , ci->progeny[6] , cj->progeny[0] );
-            runner_dopair( rt , ci->progeny[6] , cj->progeny[1] );
-            runner_dopair( rt , ci->progeny[6] , cj->progeny[2] );
-            runner_dopair( rt , ci->progeny[6] , cj->progeny[3] );
-            runner_dopair( rt , ci->progeny[7] , cj->progeny[0] );
-            runner_dopair( rt , ci->progeny[7] , cj->progeny[1] );
-            runner_dopair( rt , ci->progeny[7] , cj->progeny[2] );
-            runner_dopair( rt , ci->progeny[7] , cj->progeny[3] );
+            if ( ci->progeny[4] != NULL && cj->progeny[0] != NULL )
+                runner_dopair( rt , ci->progeny[4] , cj->progeny[0] );
+            if ( ci->progeny[4] != NULL && cj->progeny[1] != NULL )
+                runner_dopair( rt , ci->progeny[4] , cj->progeny[1] );
+            if ( ci->progeny[4] != NULL && cj->progeny[2] != NULL )
+                runner_dopair( rt , ci->progeny[4] , cj->progeny[2] );
+            if ( ci->progeny[4] != NULL && cj->progeny[3] != NULL )
+                runner_dopair( rt , ci->progeny[4] , cj->progeny[3] );
+            if ( ci->progeny[5] != NULL && cj->progeny[0] != NULL )
+                runner_dopair( rt , ci->progeny[5] , cj->progeny[0] );
+            if ( ci->progeny[5] != NULL && cj->progeny[1] != NULL )
+                runner_dopair( rt , ci->progeny[5] , cj->progeny[1] );
+            if ( ci->progeny[5] != NULL && cj->progeny[2] != NULL )
+                runner_dopair( rt , ci->progeny[5] , cj->progeny[2] );
+            if ( ci->progeny[5] != NULL && cj->progeny[3] != NULL )
+                runner_dopair( rt , ci->progeny[5] , cj->progeny[3] );
+            if ( ci->progeny[6] != NULL && cj->progeny[0] != NULL )
+                runner_dopair( rt , ci->progeny[6] , cj->progeny[0] );
+            if ( ci->progeny[6] != NULL && cj->progeny[1] != NULL )
+                runner_dopair( rt , ci->progeny[6] , cj->progeny[1] );
+            if ( ci->progeny[6] != NULL && cj->progeny[2] != NULL )
+                runner_dopair( rt , ci->progeny[6] , cj->progeny[2] );
+            if ( ci->progeny[6] != NULL && cj->progeny[3] != NULL )
+                runner_dopair( rt , ci->progeny[6] , cj->progeny[3] );
+            if ( ci->progeny[7] != NULL && cj->progeny[0] != NULL )
+                runner_dopair( rt , ci->progeny[7] , cj->progeny[0] );
+            if ( ci->progeny[7] != NULL && cj->progeny[1] != NULL )
+                runner_dopair( rt , ci->progeny[7] , cj->progeny[1] );
+            if ( ci->progeny[7] != NULL && cj->progeny[2] != NULL )
+                runner_dopair( rt , ci->progeny[7] , cj->progeny[2] );
+            if ( ci->progeny[7] != NULL && cj->progeny[3] != NULL )
+                runner_dopair( rt , ci->progeny[7] , cj->progeny[3] );
             break;
             
         case 5: /* (  1 ,  0 , -1 ) */
-            runner_dopair( rt , ci->progeny[4] , cj->progeny[1] );
-            runner_dopair( rt , ci->progeny[4] , cj->progeny[3] );
-            runner_dopair( rt , ci->progeny[6] , cj->progeny[1] );
-            runner_dopair( rt , ci->progeny[6] , cj->progeny[3] );
+            if ( ci->progeny[4] != NULL && cj->progeny[1] != NULL )
+                runner_dopair( rt , ci->progeny[4] , cj->progeny[1] );
+            if ( ci->progeny[4] != NULL && cj->progeny[3] != NULL )
+                runner_dopair( rt , ci->progeny[4] , cj->progeny[3] );
+            if ( ci->progeny[6] != NULL && cj->progeny[1] != NULL )
+                runner_dopair( rt , ci->progeny[6] , cj->progeny[1] );
+            if ( ci->progeny[6] != NULL && cj->progeny[3] != NULL )
+                runner_dopair( rt , ci->progeny[6] , cj->progeny[3] );
             break;
                     
         case 7: /* (  1 , -1 ,  0 ) */
-            runner_dopair( rt , ci->progeny[4] , cj->progeny[2] );
-            runner_dopair( rt , ci->progeny[4] , cj->progeny[3] );
-            runner_dopair( rt , ci->progeny[5] , cj->progeny[2] );
-            runner_dopair( rt , ci->progeny[5] , cj->progeny[3] );
+            if ( ci->progeny[4] != NULL && cj->progeny[2] != NULL )
+                runner_dopair( rt , ci->progeny[4] , cj->progeny[2] );
+            if ( ci->progeny[4] != NULL && cj->progeny[3] != NULL )
+                runner_dopair( rt , ci->progeny[4] , cj->progeny[3] );
+            if ( ci->progeny[5] != NULL && cj->progeny[2] != NULL )
+                runner_dopair( rt , ci->progeny[5] , cj->progeny[2] );
+            if ( ci->progeny[5] != NULL && cj->progeny[3] != NULL )
+                runner_dopair( rt , ci->progeny[5] , cj->progeny[3] );
             break;
                     
         case 9: /* (  0 ,  1 ,  1 ) */
-            runner_dopair( rt , ci->progeny[3] , cj->progeny[0] );
-            runner_dopair( rt , ci->progeny[3] , cj->progeny[4] );
-            runner_dopair( rt , ci->progeny[7] , cj->progeny[0] );
-            runner_dopair( rt , ci->progeny[7] , cj->progeny[4] );
+            if ( ci->progeny[3] != NULL && cj->progeny[0] != NULL )
+                runner_dopair( rt , ci->progeny[3] , cj->progeny[0] );
+            if ( ci->progeny[3] != NULL && cj->progeny[4] != NULL )
+                runner_dopair( rt , ci->progeny[3] , cj->progeny[4] );
+            if ( ci->progeny[7] != NULL && cj->progeny[0] != NULL )
+                runner_dopair( rt , ci->progeny[7] , cj->progeny[0] );
+            if ( ci->progeny[7] != NULL && cj->progeny[4] != NULL )
+                runner_dopair( rt , ci->progeny[7] , cj->progeny[4] );
             break;
                     
         case 10: /* (  0 ,  1 ,  0 ) */
-            runner_dopair( rt , ci->progeny[2] , cj->progeny[0] );
-            runner_dopair( rt , ci->progeny[2] , cj->progeny[1] );
-            runner_dopair( rt , ci->progeny[2] , cj->progeny[4] );
-            runner_dopair( rt , ci->progeny[2] , cj->progeny[5] );
-            runner_dopair( rt , ci->progeny[3] , cj->progeny[0] );
-            runner_dopair( rt , ci->progeny[3] , cj->progeny[1] );
-            runner_dopair( rt , ci->progeny[3] , cj->progeny[4] );
-            runner_dopair( rt , ci->progeny[3] , cj->progeny[5] );
-            runner_dopair( rt , ci->progeny[6] , cj->progeny[0] );
-            runner_dopair( rt , ci->progeny[6] , cj->progeny[1] );
-            runner_dopair( rt , ci->progeny[6] , cj->progeny[4] );
-            runner_dopair( rt , ci->progeny[6] , cj->progeny[5] );
-            runner_dopair( rt , ci->progeny[7] , cj->progeny[0] );
-            runner_dopair( rt , ci->progeny[7] , cj->progeny[1] );
-            runner_dopair( rt , ci->progeny[7] , cj->progeny[4] );
-            runner_dopair( rt , ci->progeny[7] , cj->progeny[5] );
+            if ( ci->progeny[2] != NULL && cj->progeny[0] != NULL )
+                runner_dopair( rt , ci->progeny[2] , cj->progeny[0] );
+            if ( ci->progeny[2] != NULL && cj->progeny[1] != NULL )
+                runner_dopair( rt , ci->progeny[2] , cj->progeny[1] );
+            if ( ci->progeny[2] != NULL && cj->progeny[4] != NULL )
+                runner_dopair( rt , ci->progeny[2] , cj->progeny[4] );
+            if ( ci->progeny[2] != NULL && cj->progeny[5] != NULL )
+                runner_dopair( rt , ci->progeny[2] , cj->progeny[5] );
+            if ( ci->progeny[3] != NULL && cj->progeny[0] != NULL )
+                runner_dopair( rt , ci->progeny[3] , cj->progeny[0] );
+            if ( ci->progeny[3] != NULL && cj->progeny[1] != NULL )
+                runner_dopair( rt , ci->progeny[3] , cj->progeny[1] );
+            if ( ci->progeny[3] != NULL && cj->progeny[4] != NULL )
+                runner_dopair( rt , ci->progeny[3] , cj->progeny[4] );
+            if ( ci->progeny[3] != NULL && cj->progeny[5] != NULL )
+                runner_dopair( rt , ci->progeny[3] , cj->progeny[5] );
+            if ( ci->progeny[6] != NULL && cj->progeny[0] != NULL )
+                runner_dopair( rt , ci->progeny[6] , cj->progeny[0] );
+            if ( ci->progeny[6] != NULL && cj->progeny[1] != NULL )
+                runner_dopair( rt , ci->progeny[6] , cj->progeny[1] );
+            if ( ci->progeny[6] != NULL && cj->progeny[4] != NULL )
+                runner_dopair( rt , ci->progeny[6] , cj->progeny[4] );
+            if ( ci->progeny[6] != NULL && cj->progeny[5] != NULL )
+                runner_dopair( rt , ci->progeny[6] , cj->progeny[5] );
+            if ( ci->progeny[7] != NULL && cj->progeny[0] != NULL )
+                runner_dopair( rt , ci->progeny[7] , cj->progeny[0] );
+            if ( ci->progeny[7] != NULL && cj->progeny[1] != NULL )
+                runner_dopair( rt , ci->progeny[7] , cj->progeny[1] );
+            if ( ci->progeny[7] != NULL && cj->progeny[4] != NULL )
+                runner_dopair( rt , ci->progeny[7] , cj->progeny[4] );
+            if ( ci->progeny[7] != NULL && cj->progeny[5] != NULL )
+                runner_dopair( rt , ci->progeny[7] , cj->progeny[5] );
             break;
                     
         case 11: /* (  0 ,  1 , -1 ) */
-            runner_dopair( rt , ci->progeny[2] , cj->progeny[1] );
-            runner_dopair( rt , ci->progeny[2] , cj->progeny[5] );
-            runner_dopair( rt , ci->progeny[6] , cj->progeny[1] );
-            runner_dopair( rt , ci->progeny[6] , cj->progeny[5] );
+            if ( ci->progeny[2] != NULL && cj->progeny[1] != NULL )
+                runner_dopair( rt , ci->progeny[2] , cj->progeny[1] );
+            if ( ci->progeny[2] != NULL && cj->progeny[5] != NULL )
+                runner_dopair( rt , ci->progeny[2] , cj->progeny[5] );
+            if ( ci->progeny[6] != NULL && cj->progeny[1] != NULL )
+                runner_dopair( rt , ci->progeny[6] , cj->progeny[1] );
+            if ( ci->progeny[6] != NULL && cj->progeny[5] != NULL )
+                runner_dopair( rt , ci->progeny[6] , cj->progeny[5] );
             break;
                     
         case 12: /* (  0 ,  0 ,  1 ) */
-            runner_dopair( rt , ci->progeny[1] , cj->progeny[0] );
-            runner_dopair( rt , ci->progeny[1] , cj->progeny[2] );
-            runner_dopair( rt , ci->progeny[1] , cj->progeny[4] );
-            runner_dopair( rt , ci->progeny[1] , cj->progeny[6] );
-            runner_dopair( rt , ci->progeny[3] , cj->progeny[0] );
-            runner_dopair( rt , ci->progeny[3] , cj->progeny[2] );
-            runner_dopair( rt , ci->progeny[3] , cj->progeny[4] );
-            runner_dopair( rt , ci->progeny[3] , cj->progeny[6] );
-            runner_dopair( rt , ci->progeny[5] , cj->progeny[0] );
-            runner_dopair( rt , ci->progeny[5] , cj->progeny[2] );
-            runner_dopair( rt , ci->progeny[5] , cj->progeny[4] );
-            runner_dopair( rt , ci->progeny[5] , cj->progeny[6] );
-            runner_dopair( rt , ci->progeny[7] , cj->progeny[0] );
-            runner_dopair( rt , ci->progeny[7] , cj->progeny[2] );
-            runner_dopair( rt , ci->progeny[7] , cj->progeny[4] );
-            runner_dopair( rt , ci->progeny[7] , cj->progeny[6] );
+            if ( ci->progeny[1] != NULL && cj->progeny[0] != NULL )
+                runner_dopair( rt , ci->progeny[1] , cj->progeny[0] );
+            if ( ci->progeny[1] != NULL && cj->progeny[2] != NULL )
+                runner_dopair( rt , ci->progeny[1] , cj->progeny[2] );
+            if ( ci->progeny[1] != NULL && cj->progeny[4] != NULL )
+                runner_dopair( rt , ci->progeny[1] , cj->progeny[4] );
+            if ( ci->progeny[1] != NULL && cj->progeny[6] != NULL )
+                runner_dopair( rt , ci->progeny[1] , cj->progeny[6] );
+            if ( ci->progeny[3] != NULL && cj->progeny[0] != NULL )
+                runner_dopair( rt , ci->progeny[3] , cj->progeny[0] );
+            if ( ci->progeny[3] != NULL && cj->progeny[2] != NULL )
+                runner_dopair( rt , ci->progeny[3] , cj->progeny[2] );
+            if ( ci->progeny[3] != NULL && cj->progeny[4] != NULL )
+                runner_dopair( rt , ci->progeny[3] , cj->progeny[4] );
+            if ( ci->progeny[3] != NULL && cj->progeny[6] != NULL )
+                runner_dopair( rt , ci->progeny[3] , cj->progeny[6] );
+            if ( ci->progeny[5] != NULL && cj->progeny[0] != NULL )
+                runner_dopair( rt , ci->progeny[5] , cj->progeny[0] );
+            if ( ci->progeny[5] != NULL && cj->progeny[2] != NULL )
+                runner_dopair( rt , ci->progeny[5] , cj->progeny[2] );
+            if ( ci->progeny[5] != NULL && cj->progeny[4] != NULL )
+                runner_dopair( rt , ci->progeny[5] , cj->progeny[4] );
+            if ( ci->progeny[5] != NULL && cj->progeny[6] != NULL )
+                runner_dopair( rt , ci->progeny[5] , cj->progeny[6] );
+            if ( ci->progeny[7] != NULL && cj->progeny[0] != NULL )
+                runner_dopair( rt , ci->progeny[7] , cj->progeny[0] );
+            if ( ci->progeny[7] != NULL && cj->progeny[2] != NULL )
+                runner_dopair( rt , ci->progeny[7] , cj->progeny[2] );
+            if ( ci->progeny[7] != NULL && cj->progeny[4] != NULL )
+                runner_dopair( rt , ci->progeny[7] , cj->progeny[4] );
+            if ( ci->progeny[7] != NULL && cj->progeny[6] != NULL )
+                runner_dopair( rt , ci->progeny[7] , cj->progeny[6] );
             break;
                 
         }
diff --git a/space.c b/space.c
index 6ec524c5e3..4dcb2ed8ab 100644
--- a/space.c
+++ b/space.c
@@ -916,7 +916,8 @@ void space_maketasks ( struct space *s , int do_sort ) {
                 /* Make it depend on all the sorts of its progeny. */
                 for ( k = 0 ; k < 8 ; k++ )
                     for ( j = 0 ; j < 13 ; j++ )
-                        task_addunlock( c->progeny[k]->sorts[j] , t );
+                        if ( c->progeny[k] != NULL )
+                            task_addunlock( c->progeny[k]->sorts[j] , t );
             
                 }
 
-- 
GitLab