Пример #1
0
int main ( int argc, char **argv )
{
   char text[10] = "123456789";
   char text2[10] = "987654321";
   char* dummy1 = text;
   
   my_args* args = 0;
   nanos_wd_props_t props = {
     .mandatory_creation = true,
     .tied = false,
     .tie_to = false,
   };

   nanos_copy_data_t *cd = 0;

   nanos_wd_t wd1=0;
   nanos_device_t test_devices_1[1] = { NANOS_SMP_DESC( test_device_arg_1) };
   NANOS_SAFE( nanos_create_wd ( &wd1, 1,test_devices_1, sizeof(my_args), __alignof__(my_args), (void**)&args, nanos_current_wd(), &props, 2, &cd) );

   args->a = 1;
   args->b = dummy1;

   cd[0] = (nanos_copy_data_t) {(uint64_t)&(args->a), NANOS_PRIVATE, {true, false}, sizeof(args->a)};
   cd[1] = (nanos_copy_data_t) {(uint64_t)args->b, NANOS_SHARED, {true, true}, sizeof(char)*10}; 

   NANOS_SAFE( nanos_submit( wd1,0,0,0 ) );

   NANOS_SAFE( nanos_wg_wait_completion( nanos_current_wd() ) );

   if ( strcmp( text2, dummy1 ) == 0 ) {
      printf( "Checking for copy-back correctness...  PASS\n" );
   } else {
      printf( "Checking for copy-back correctness...  FAIL\n" );
      printf( "expecting '%s', copied back: '%s'\n", text2, dummy1 );
      return 1;
   }

   return 0;
}
// compiler: outlined function
void main__task_1 ( void *args )
{
   main__task_1_data_t *hargs = (main__task_1_data_t * ) args;

   nanos_wd_t wd = nanos_current_wd();

   char *description;
   NANOS_SAFE( nanos_get_wd_description ( &description, wd ) );

   usleep ( hargs->value );

   fprintf(stdout,"Executing task %s \n", description );
}
Пример #3
0
bool single_dependency()
{
   int my_value;
   int * dep_addr = &my_value;
   my_args *args1=0;
   nanos_dependence_t deps1 = {(void **)&dep_addr,0, {0,1,0,0}, 0};
   nanos_wd_props_t props = {
     .mandatory_creation = true,
     .tied = false,
     .tie_to = false,
   };
   nanos_wd_t wd1=0;
   nanos_device_t test_devices_1[1] = { NANOS_SMP_DESC( test_device_arg_1) };
   NANOS_SAFE( nanos_create_wd ( &wd1, 1,test_devices_1, sizeof(my_args), __alignof__(my_args), (void**)&args1, nanos_current_wd(), &props, 0, NULL) );
   args1->p_i = dep_addr;
   NANOS_SAFE( nanos_submit( wd1,1,&deps1,0 ) );

   my_args *args2=0;
   nanos_dependence_t deps2 = {(void **)&dep_addr,0, {1,1,0,0}, 0};
   nanos_wd_t wd2 = 0;
   nanos_device_t test_devices_2[1] = { NANOS_SMP_DESC( test_device_arg_2 ) };
   NANOS_SAFE( nanos_create_wd ( &wd2, 1,test_devices_2, sizeof(my_args), __alignof__(my_args), (void**)&args2, nanos_current_wd(), &props, 0, NULL) );
   args2->p_i = dep_addr;
   NANOS_SAFE( nanos_submit( wd2,1,&deps2,0 ) );

   NANOS_SAFE( nanos_wg_wait_completion( nanos_current_wd() ) );
   
   return (my_value == 1);
}

bool single_inout_chain()
{
   int i;
   int my_value;
   int * dep_addr = &my_value;
   my_args *args1=0;
   nanos_dependence_t deps1 = {(void **)&dep_addr,0, {0,1,0,0}, 0};
   nanos_wd_props_t props = {
     .mandatory_creation = true,
     .tied = false,
     .tie_to = false,
   };
   nanos_wd_t wd1=0;
   nanos_device_t test_devices_1[1] = { NANOS_SMP_DESC( test_device_arg_1) };
   NANOS_SAFE( nanos_create_wd ( &wd1, 1,test_devices_1, sizeof(my_args), __alignof__(my_args), (void**)&args1, nanos_current_wd(), &props, 0, NULL) );
   args1->p_i = dep_addr;
   NANOS_SAFE( nanos_submit( wd1,1,&deps1,0 ) );

   for ( i = 0; i < 100; i++ ) {
      my_args *args2=0;
      nanos_dependence_t deps2 = {(void **)&dep_addr,0, {1,1,0,0}, 0};
      nanos_wd_t wd2 = 0;
      nanos_device_t test_devices_2[1] = { NANOS_SMP_DESC( test_device_arg_2 ) };
      NANOS_SAFE( nanos_create_wd ( &wd2, 1,test_devices_2, sizeof(my_args), __alignof__(my_args), (void**)&args2, nanos_current_wd(), &props, 0, NULL) );
      args2->p_i = dep_addr;
      NANOS_SAFE( nanos_submit( wd2,1,&deps2,0 ) );
   }

   NANOS_SAFE( nanos_wg_wait_completion( nanos_current_wd() ) );
   
   return (my_value == 100);
}

bool multiple_inout_chains()
{
   int i, j;
   int size = 10;
   int my_value[size];

   for ( i = 0; i < size; i++ ) {
      int * dep_addr = &my_value[i];
      my_args *args1=0;
      nanos_dependence_t deps1 = {(void **)&dep_addr,0, {0,1,0,0}, 0};
      nanos_wd_props_t props = {
        .mandatory_creation = true,
        .tied = false,
        .tie_to = false,
      };
      nanos_wd_t wd1=0;
      nanos_device_t test_devices_1[1] = { NANOS_SMP_DESC( test_device_arg_1) };
      NANOS_SAFE( nanos_create_wd ( &wd1, 1,test_devices_1, sizeof(my_args), __alignof__(my_args), (void**)&args1, nanos_current_wd(), &props, 0, NULL) );
      args1->p_i = dep_addr;
      NANOS_SAFE( nanos_submit( wd1,1,&deps1,0 ) );

      for ( j = 0; j < size; j++ ) {
         my_args *args2=0;
         nanos_dependence_t deps2 = {(void **)&dep_addr,0, {1,1,0,0}, 0};
         nanos_wd_t wd2 = 0;
         nanos_device_t test_devices_2[1] = { NANOS_SMP_DESC( test_device_arg_2 ) };
         NANOS_SAFE( nanos_create_wd ( &wd2, 1,test_devices_2, sizeof(my_args), __alignof__(my_args), (void**)&args2, nanos_current_wd(), &props, 0, NULL) );
         args2->p_i = dep_addr;
         NANOS_SAFE( nanos_submit( wd2,1,&deps2,0 ) );
      }
   }

   NANOS_SAFE( nanos_wg_wait_completion( nanos_current_wd() ) );

   for ( i = 0; i < size; i++ ) {
      if ( my_value[i] != size ) return false;
   }
   return true;
}

bool multiple_predecessors()
{
   int j;
   int size=100;
   int my_value[size];
   nanos_wd_props_t props = {
     .mandatory_creation = true,
     .tied = false,
     .tie_to = false,
   };

   for ( j = 0; j < size; j++ ) {
      int * dep_addr1 = &my_value[j];
      my_args *args1=0;
      nanos_dependence_t deps1 = {(void **)&dep_addr1,0, {0,1,0,0}, 0};
      nanos_wd_t wd1 = 0;

      nanos_device_t test_devices_1[1] = { NANOS_SMP_DESC( test_device_arg_1 ) };
      NANOS_SAFE( nanos_create_wd ( &wd1, 1,test_devices_1, sizeof(my_args), __alignof(my_args), (void**)&args1, nanos_current_wd(), &props, 0, NULL) );
      args1->p_i = dep_addr1;
      NANOS_SAFE( nanos_submit( wd1,1,&deps1,0 ) );
   }

   nanos_dependence_t deps2[size];
   int *dep_addr2[size];
   my_args *args2=0;
   for ( j = 0; j < size; j++ ) {
      dep_addr2[j] = &my_value[j];
      deps2[j] = (nanos_dependence_t){(void **) &dep_addr2[j],0, {1,1,0,0},0};
   }

   nanos_wd_t wd2=0;
   nanos_device_t test_devices_3[1] = { NANOS_SMP_DESC( test_device_arg_3) };
   NANOS_SAFE( nanos_create_wd ( &wd2, 1,test_devices_3, sizeof(my_args)*size, __alignof__(my_args), (void**)&args2, nanos_current_wd(), &props, 0, NULL) );
   for ( j = 0; j < size; j++)
      args2[j].p_i = dep_addr2[j];
   NANOS_SAFE( nanos_submit( wd2,size,&deps2[0],0 ) );

   NANOS_SAFE( nanos_wg_wait_completion( nanos_current_wd() ) );
   for ( j = 0; j < size; j++ ) {
      if ( my_value[j] != 1 ) return false;
   }
   return true;
}

bool multiple_antidependencies()
{
   int j;
   int my_value=1500;
   int my_reslt[100];
   nanos_wd_props_t props = {
     .mandatory_creation = true,
     .tied = false,
     .tie_to = false,
   };

   for ( j = 0; j < 100; j++ ) {
      int * dep_addr1 = &my_value;
      int * reslt_addr =&my_reslt[j];
      my_args *args1=0;
      nanos_dependence_t deps1 = {(void **)&dep_addr1,0, {1,0,0,0}, 0};

      nanos_wd_t wd1 = 0;
      nanos_device_t test_devices_4[1] = { NANOS_SMP_DESC( test_device_arg_4 ) };
      NANOS_SAFE( nanos_create_wd ( &wd1, 1,test_devices_4, sizeof(my_args)*2, __alignof__(my_args), (void**)&args1, nanos_current_wd(), &props, 0, NULL) );
      args1[0].p_i = dep_addr1;
      args1[1].p_i = reslt_addr;
      NANOS_SAFE( nanos_submit( wd1,1,&deps1,0 ) );
   }

   int *dep_addr2 = &my_value;
   nanos_dependence_t deps2 = (nanos_dependence_t){(void **) &dep_addr2,0, {1,1,0,0},0};
   my_args *args2=0;

   nanos_wd_t wd2=0;
   nanos_device_t test_devices_2[1] = { NANOS_SMP_DESC( test_device_arg_2) };
   NANOS_SAFE( nanos_create_wd ( &wd2, 1,test_devices_2, sizeof(my_args), __alignof__(my_args), (void**)&args2, nanos_current_wd(), &props, 0, NULL) );
   args2->p_i = dep_addr2;
   NANOS_SAFE( nanos_submit( wd2,1,&deps2,0 ) );

   NANOS_SAFE( nanos_wg_wait_completion( nanos_current_wd() ) );
   for ( j = 0; j < 100; j++ ) {
      if ( my_reslt[j] != 1500 ) return false;
   }
   if (my_value != 1501) return false;
   return true;
}

bool out_dep_chain()
{
   int i;
   int my_value;
   int * dep_addr = &my_value;
   nanos_wd_props_t props = {
     .mandatory_creation = true,
     .tied = false,
     .tie_to = false,
   };

   for ( i = 0; i < 100; i++ ) {
      my_args *args2=0;
      nanos_dependence_t deps2 = {(void **)&dep_addr,0, {0,1,0,0}, 0};
      nanos_wd_t wd2 = 0;
      nanos_device_t test_devices_1[1] = { NANOS_SMP_DESC( test_device_arg_1 ) };
      NANOS_SAFE( nanos_create_wd ( &wd2, 1,test_devices_1, sizeof(my_args), __alignof__(my_args),(void**)&args2, nanos_current_wd(), &props, 0, NULL) );
      args2->p_i = dep_addr;
      NANOS_SAFE( nanos_submit( wd2,1,&deps2,0 ) );
   }

   int input=500;
   int * input_addr = &input;
   nanos_dependence_t deps1 = {(void **)&dep_addr,0, {0,1,0,0}, 0};
   my_args *args1=0;
   nanos_wd_t wd1=0;
   nanos_device_t test_devices_1[1] = { NANOS_SMP_DESC( test_device_arg_4) };
   NANOS_SAFE( nanos_create_wd ( &wd1, 1,test_devices_1, sizeof(my_args)*2, __alignof__(my_args), (void**)&args1, nanos_current_wd(), &props, 0, NULL) );
   args1[0].p_i = input_addr;
   args1[1].p_i = dep_addr;
   NANOS_SAFE( nanos_submit( wd1,1,&deps1,0 ) );

   NANOS_SAFE( nanos_wg_wait_completion( nanos_current_wd() ) );
   
   return (my_value == 500);
}

bool wait_on_test()
{
   int j;
   int size=10;
   int my_value[size];
   nanos_wd_props_t props = {
     .mandatory_creation = true,
     .tied = false,
     .tie_to = false,
   };

   for ( j = 0; j < size; j++ ) {
      my_value[j] = 500;
      int * dep_addr1 = &my_value[j];
      my_args *args1=0;
      nanos_dependence_t deps1 = {(void **)&dep_addr1,0, {0,1,0,0}, 0};
      nanos_wd_t wd1 = 0;

      nanos_device_t test_devices_1[1] = { NANOS_SMP_DESC( test_device_arg_1 ) };
      NANOS_SAFE( nanos_create_wd ( &wd1, 1,test_devices_1, sizeof(my_args), __alignof__(my_args), (void**)&args1, nanos_current_wd(), &props, 0, NULL) );
      args1->p_i = dep_addr1;
      NANOS_SAFE( nanos_submit( wd1,1,&deps1,0 ) );
   }

   nanos_dependence_t deps2[size];
   int *dep_addr2[size];
   for ( j = 0; j < size; j++ ) {
      dep_addr2[j] = &my_value[j];
      deps2[j] = (nanos_dependence_t){(void **) &dep_addr2[j],0, {1,0,0,0},0};
   }
   
   NANOS_SAFE( nanos_wait_on( size, &deps2[0] ));

   for ( j = 0; j < size; j++ ) {
    if ( my_value[j] != 0 ) return false;
   }
   return true;
}

bool create_and_run_test()
{
   int j;
   int my_value[100];
   int other_value=0;
   nanos_wd_props_t props = {
     .mandatory_creation = true,
     .tied = false,
     .tie_to = false,
   };

   for ( j = 0; j < 100; j++ ) {
      my_value[j] = 500;
      int * dep_addr1 = &my_value[j];
      my_args *args1=0;
      nanos_dependence_t deps1 = {(void **)&dep_addr1,0, {0,1,0,0}, 0};
      nanos_wd_t wd1 = 0;

      nanos_device_t test_devices_1[1] = { NANOS_SMP_DESC( test_device_arg_1 ) };
      NANOS_SAFE( nanos_create_wd ( &wd1, 1,test_devices_1, sizeof(my_args), __alignof__(my_args), (void**)&args1, nanos_current_wd(), &props, 0, NULL) );
      args1->p_i = dep_addr1;
      NANOS_SAFE( nanos_submit( wd1,1,&deps1,0 ) );
   }

   nanos_dependence_t deps2[100];
   int *dep_addr2[100];
   for ( j = 0; j < 100; j++ ) {
      dep_addr2[j] = &my_value[j];
      deps2[j] = (nanos_dependence_t){(void **) &dep_addr2[j],0, {1,0,0,0},0};
   }

   my_args arg;
   arg.p_i = &other_value;
   nanos_device_t test_devices_2[1] = { NANOS_SMP_DESC( test_device_arg_1 ) };

   NANOS_SAFE( nanos_create_wd_and_run( 1, test_devices_2, sizeof(my_args), __alignof__(my_args),  (void *)&arg, 100, &deps2[0], &props , 0, NULL, NULL ) );

   for ( j = 0; j < 100; j++ ) {
    if ( my_value[j] != 0 ) return false;
   }
   return true;
}

// Test commutative tasks, this test creates a task with an inout dependency on an array an then
// a bunch of commutative (reduction) tasks that update it. Finally it waits for them all to finish and
// checks the result
bool commutative_task_1()
{
   int i, j;
   int size = 100;
   int my_value[size];
   int *value_ref = (int *)&my_value;

   for ( i = 0; i < size; i++ ) {
      my_value[i] = 0;
   }

   nanos_wd_props_t props = {
     .mandatory_creation = true,
     .tied = false,
     .tie_to = false,
   };

   my_args2 *args1=0;
   nanos_dependence_t deps1 = {(void **)&value_ref,0, {0,1,0,0}, 0};
   nanos_wd_t wd1 = 0;

   nanos_device_t test_devices_1[1] = { NANOS_SMP_DESC( test_device_arg_6 ) };
   NANOS_SAFE( nanos_create_wd ( &wd1, 1,test_devices_1, sizeof(my_args2), __alignof__(my_args2), (void**)&args1, nanos_current_wd(), &props, 0, NULL) );
   args1->p_i = my_value;
   args1->index = size;
   NANOS_SAFE( nanos_submit( wd1,1,&deps1,0 ) );

   for ( j = 0; j < size; j++ ) {
      my_args2 *args1=0;
      nanos_dependence_t deps1 = {(void **)&value_ref,0, {1,1,0,1}, 0};
      nanos_wd_t wd1 = 0;

      nanos_device_t test_devices_1[1] = { NANOS_SMP_DESC( test_device_arg_5 ) };
      NANOS_SAFE( nanos_create_wd ( &wd1, 1,test_devices_1, sizeof(my_args2), __alignof__(my_args2), (void**)&args1, nanos_current_wd(), &props, 0, NULL) );
      args1->p_i = my_value;
      args1->index = j;
      NANOS_SAFE( nanos_submit( wd1,1,&deps1,0 ) );
   }

   NANOS_SAFE( nanos_wg_wait_completion( nanos_current_wd() ) );
   for ( j = 0; j < 100; j++ ) {
      if ( my_value[j] != 2 ) return false;
   }
   return true;
}

// Test commutative tasks, this test creates a task with an inout dependency on an array an then
// a bunch of commutative (reduction) tasks that update it. Then, another set of tasks are successors
// of the commutative ones. This checks that the commutation task behaves correctly
bool commutative_task_2()
{
   int i, j;
   int size = 100;
   int my_value[size];
   int *value_ref = (int *)&my_value;
   int my_results[size];

   for ( i = 0; i < size; i++ ) {
      my_value[i] = 0;
      my_results[i] = 0;
   }

   nanos_wd_props_t props = {
     .mandatory_creation = true,
     .tied = false,
     .tie_to = false,
   };

   my_args2 *args1=0;
   nanos_dependence_t deps1 = {(void **)&value_ref,0, {0,1,0,0}, 0};
   nanos_wd_t wd1 = 0;

   nanos_device_t test_devices_1[1] = { NANOS_SMP_DESC( test_device_arg_6 ) };
   NANOS_SAFE( nanos_create_wd ( &wd1, 1,test_devices_1, sizeof(my_args2), __alignof__(my_args2), (void**)&args1, nanos_current_wd(), &props, 0, NULL) );
   args1->p_i = my_value;
   args1->index = size;
   NANOS_SAFE( nanos_submit( wd1,1,&deps1,0 ) );

   for ( j = 0; j < size; j++ ) {
      my_args2 *args1=0;
      nanos_dependence_t deps1 = {(void **)&value_ref,0, {1,1,0,1}, 0};
      nanos_wd_t wd1 = 0;

      nanos_device_t test_devices_1[1] = { NANOS_SMP_DESC( test_device_arg_5 ) };
      NANOS_SAFE( nanos_create_wd ( &wd1, 1,test_devices_1, sizeof(my_args2), __alignof__(my_args2), (void**)&args1, nanos_current_wd(), &props, 0, NULL) );
      args1->p_i = my_value;
      args1->index = j;
      NANOS_SAFE( nanos_submit( wd1,1,&deps1,0 ) );
   }

   for ( j = 0; j < size; j++ ) {
      my_args3 *args1=0;
      nanos_dependence_t deps1 = {(void **)&value_ref,0, {1,0,0,0}, 0};
      nanos_wd_t wd1 = 0;

      nanos_device_t test_devices_1[1] = { NANOS_SMP_DESC( test_device_arg_7 ) };
      NANOS_SAFE( nanos_create_wd ( &wd1, 1,test_devices_1, sizeof(my_args3), __alignof__(my_args3), (void**)&args1, nanos_current_wd(), &props, 0, NULL) );
      args1->p_i = my_value;
      args1->p_result = &my_results[j];
      args1->index = j;
      NANOS_SAFE( nanos_submit( wd1,1,&deps1,0 ) );
   }

   NANOS_SAFE( nanos_wg_wait_completion( nanos_current_wd() ) );

   for ( j = 0; j < size; j++ ) {
      if ( my_results[j] < 0 ) return false;
   }
   return true;
}

// Test commutative tasks, this test creates a task with an inout dependency on an array an then
// a bunch of tasks that read the dependency, then, again, a bunch of commutative (reduction) tasks 
// that update it. Then, another set of tasks are successors
// of the commutative ones. This checks that the commutation task behaves correctly
bool commutative_task_3()
{
   int i, j;
   int size = 100;
   int my_value[size];
   int *value_ref = (int *)&my_value;
   int my_results[size];

   for ( i = 0; i < size; i++ ) {
      my_value[i] = 0;
      my_results[i] = 0;
   }

   nanos_wd_props_t props = {
     .mandatory_creation = true,
     .tied = false,
     .tie_to = false,
   };

   my_args2 *args1=0;
   nanos_dependence_t deps1 = {(void **)&value_ref,0, {0,1,0,0}, 0};
   nanos_wd_t wd1 = 0;

   nanos_device_t test_devices_1[1] = { NANOS_SMP_DESC( test_device_arg_6 ) };
   NANOS_SAFE( nanos_create_wd ( &wd1, 1,test_devices_1, sizeof(my_args2), __alignof__(my_args2), (void**)&args1, nanos_current_wd(), &props, 0, NULL) );
   args1->p_i = my_value;
   args1->index = size;
   NANOS_SAFE( nanos_submit( wd1,1,&deps1,0 ) );

   for ( j = 0; j < size; j++ ) {
      my_args2 *args1=0;
      nanos_dependence_t deps1 = {(void **)&value_ref,0, {1,0,0,0}, 0};
      nanos_wd_t wd1 = 0;

      nanos_device_t test_devices_1[1] = { NANOS_SMP_DESC( test_device_arg_8 ) };
      NANOS_SAFE( nanos_create_wd ( &wd1, 1,test_devices_1, sizeof(my_args2), __alignof__(my_args2), (void**)&args1, nanos_current_wd(), &props, 0, NULL) );
      args1->p_i = my_value;
      args1->index = j;
      NANOS_SAFE( nanos_submit( wd1,1,&deps1,0 ) );
   }

   for ( j = 0; j < size; j++ ) {
      my_args2 *args1=0;
      nanos_dependence_t deps1 = {(void **)&value_ref,0, {1,1,0,1}, 0};
      nanos_wd_t wd1 = 0;

      nanos_device_t test_devices_1[1] = { NANOS_SMP_DESC( test_device_arg_5 ) };
      NANOS_SAFE( nanos_create_wd ( &wd1, 1,test_devices_1, sizeof(my_args2), __alignof__(my_args2), (void**)&args1, nanos_current_wd(), &props, 0, NULL) );
      args1->p_i = my_value;
      args1->index = j;
      NANOS_SAFE( nanos_submit( wd1,1,&deps1,0 ) );
   }

   for ( j = 0; j < size; j++ ) {
      my_args3 *args1=0;
      nanos_dependence_t deps1 = {(void **)&value_ref,0, {1,0,0,0}, 0};
      nanos_wd_t wd1 = 0;

      nanos_device_t test_devices_1[1] = { NANOS_SMP_DESC( test_device_arg_7 ) };
      NANOS_SAFE( nanos_create_wd ( &wd1, 1,test_devices_1, sizeof(my_args3), __alignof__(my_args3), (void**)&args1, nanos_current_wd(), &props, 0, NULL) );
      args1->p_i = my_value;
      args1->p_result = &my_results[j];
      args1->index = j;
      NANOS_SAFE( nanos_submit( wd1,1,&deps1,0 ) );
   }

   NANOS_SAFE( nanos_wg_wait_completion( nanos_current_wd() ) );

   for ( j = 0; j < size; j++ ) {
      if ( my_results[j] < 0 ) return false;
   }
   return true;
}



int main ( int argc, char **argv )
{
   printf("Single dependency test... \n");
   fflush(stdout);
   if ( single_dependency() ) {
      printf("PASS\n");
      fflush(stdout);
   } else {
      printf("FAIL\n");
      fflush(stdout);
   }
   
   printf("Single inout chain test... \n");
   fflush(stdout);
   if ( single_inout_chain() ) {
      printf("PASS\n");
      fflush(stdout);
   } else {
      printf("FAIL\n");
      fflush(stdout);
   }

   printf("Multiple inout chains test... \n");
   fflush(stdout);
   if ( multiple_inout_chains() ) {
      printf("PASS\n");
      fflush(stdout);
   } else {
      printf("FAIL\n");
      fflush(stdout);
      return 1;
   }

   printf("task with multiple predecessors... \n");
   fflush(stdout);
   if ( multiple_predecessors() ) {
      printf("PASS\n");
      fflush(stdout);
   } else {
      printf("FAIL\n");
      fflush(stdout);
      return 1;
   }
   printf("task with multiple anti-dependencies... \n");
   fflush(stdout);
   if ( multiple_antidependencies() ) {
      printf("PASS\n");
      fflush(stdout);
   } else {
      printf("FAIL\n");
      fflush(stdout);
      return 1;
   }

   printf("Out dependencies chain... \n");
   fflush(stdout);
   if ( out_dep_chain() ) {
      printf("PASS\n");
      fflush(stdout);
   } else {
      printf("FAIL\n");
      fflush(stdout);
      return 1;
   }

   printf("Wait on test...\n");
   fflush(stdout);
   if ( wait_on_test() ) {
      printf("PASS\n");
      fflush(stdout);
   } else {
      printf("FAIL\n");
      fflush(stdout);
      return 1;
   }

   printf("create and run test...\n");
   fflush(stdout);
   if ( create_and_run_test() ) {
      printf("PASS\n");
      fflush(stdout);
   } else {
      printf("FAIL\n");
      fflush(stdout);
      return 1;
   }

   printf("commutative tasks test...\n");
   fflush(stdout);
   if ( commutative_task_1() ) {
      printf("PASS\n");
      fflush(stdout);
   } else {
      printf("FAIL\n");
      fflush(stdout);
      return 1;
   }

   printf("commutative tasks 2 test...\n");
   fflush(stdout);
   if ( commutative_task_2() ) {
      printf("PASS\n");
      fflush(stdout);
   } else {
      printf("FAIL\n");
      fflush(stdout);
      return 1;
   }

   printf("commutative tasks 3 test...\n");
   fflush(stdout);
   if ( commutative_task_3() ) {
      printf("PASS\n");
      fflush(stdout);
   } else {
      printf("FAIL\n");
      fflush(stdout);
      return 1;
   }

   return 0;
}