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