diff --git a/runner.c b/runner.c index 081509f9b0b739a2d1cd0481fb809a2efd14d301..094886251da189d4a196208e5659c2b11c8a74ea 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 6ec524c5e3b5d7ac2c2bd61fe895f4f160b62052..4dcb2ed8ab2397536c74a223e4656d5725f5eb12 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 ); }