예제 #1
0
int main( int argc, char *argv[] )
{
	hthread_t           tid[ CHILDREN ];
    hthread_mutex_t     mutex;
    hthread_mutexattr_t attr;
    Huint               i;

    hthread_mutexattr_init( &attr );
    hthread_mutexattr_settype( &attr, HTHREAD_MUTEX_FAST_NP );
    hthread_mutexattr_setnum( &attr, 1 );
    hthread_mutex_init( &mutex, &attr );
    
    for( i = 0; i < CHILDREN; i++ )
    {
        hthread_create( &tid[i], NULL, child, &mutex );
    }
    
    for( i = 0; i < CHILDREN; i++ )
    {
   	    hthread_join( tid[i], NULL );
    }

	printf( "--DONE--\n" );
	return 1;
}
예제 #2
0
int main(int argc, char *argv[]) {
    hthread_mutexattr_t mutexAttr;
    hthread_mutex_t     mutex;
	hthread_attr_t      threadAttr;
    hthread_t           thread;
	Huint               arg;
	log_t               log;

    //Initialize Log
	log_create( &log, 1024 );

	//Mutex operations
	printf( "Starting mutex operations\n" );
	hthread_mutexattr_init( &mutexAttr );
	hthread_mutexattr_setnum( &mutexAttr, 0 );
	hthread_mutexattr_getnum( &mutexAttr, &arg );
	hthread_mutexattr_destroy( &mutexAttr );

    hthread_mutex_init(&mutex, NULL);
	hthread_mutex_lock( &mutex );
	hthread_mutex_unlock( &mutex );

	hthread_mutex_trylock( &mutex );
	hthread_mutex_unlock( &mutex );
	hthread_mutex_destroy( &mutex );

    //Condition Variable operations
	/*
	printf( "Starting condition variable operations\n" );
	hthread_condattr_init( &condvarAttr );
	hthread_condattr_setnum( &condvarAttr, 0 );
	hthread_condattr_getnum( &condvarAttr, &arg );
	hthread_condattr_destroy( &condvarAttr );

	hthread_cond_init( &condvar, NULL );
	hthread_mutex_lock( &mutex );
	hthread_cond_wait( &condvar, &mutex );
	hthread_mutex_unlock( &mutex );
	hthread_cond_signal( &condvar );
	hthread_cond_broadcast( &condvar );
	hthread_cond_destroy( &condvar );
	*/

    //Thread operations
	printf( "Starting thread operations\n" );
	hthread_attr_init( &threadAttr );
    hthread_create( &thread, &threadAttr, foo, &log );
	hthread_attr_destroy( &threadAttr );

	hthread_join( thread, NULL );

    printf( " -- End of Program --\n" );
	log_close_ascii( &log );

	return 0;
}
예제 #3
0
int main( int argc, char *argv[] )
{
	hthread_t           tid[ CHILDREN ];
    hthread_mutex_t     mutex[ MUTEXES ];
    hthread_mutexattr_t attr;
    Huint               i;
    Huint               j;
    Huint               c;

    hthread_mutexattr_init( &attr );
    hthread_mutexattr_settype( &attr, HTHREAD_MUTEX_FAST_NP );
    
    c = 0;
    for( i = 0; i < MUTEXES; i++ )
    {
        hthread_mutexattr_setnum( &attr, i );
        hthread_mutex_init( &mutex[i], &attr );
        
        for( j = 0; j < CHILDREN_PER_MUTEX; j++ )
        {
            hthread_create( &tid[c], NULL, child, &mutex[i] );
            printf( "Created Child %u\n", tid[c] );

            c++;
        }
    }
    
    for( i = 0; i < CHILDREN; i++ )
    {
        printf( "Join Child %u\n", tid[i] );
   	    hthread_join( tid[i], NULL );
    }
    
	printf( "--DONE--\n" );
	return 1;
}
예제 #4
0
int main()
{
  struct threadpool tp;
  hthread_mutex_t task_queue_mutex;
  hthread_cond_t active_task;

  // Init. global print mutex
  hthread_mutex_init(&print_mutex, NULL);

  // Setup mutex
  printf("Setting up mutex...");
  hthread_mutexattr_t mta;
  hthread_mutexattr_settype(&mta, HTHREAD_MUTEX_RECURSIVE_NP);
  hthread_mutexattr_setnum(&mta, 1);
  hthread_mutex_init(&task_queue_mutex, &mta);
  printf("DONE\n");

  // Setup cond. var
  printf("Setting up cond.var...");
  hthread_condattr_t cta;
  hthread_condattr_init(&cta);
  hthread_cond_init(&active_task, &cta);
  printf("DONE\n");

  // Setup threadpool struct
  tp.task_queue_mutex = &task_queue_mutex;
  tp.active_task = &active_task;
  tp.total_tasks = 0;
  tp.request_errors = 0;
  tp.head_ptr = NULL;
  tp.tail_ptr = NULL;

  // Init threadpool
  printf("Creating thread pool...");
  thread_pool_init(&tp, 8);
  printf("DONE\n");

  int i;
  void (*x) (void *);
  void (*y) (void *);
  x = func;
  y = func2; 
  for (i = 0; i < 15; i++) {
    aprintf("Adding task %d...\n", i);
    if (i %4 == 0)
    {
        add_task(&tp, i, *x, (void*)i);
    }
    else
    {
        add_task(&tp, i, *y, (void*)i);
    }
  }

  aprintf("Waiting for completion...\n");
  while (tp.total_tasks > 0) {
    aprintf("Main running (%d)...\n", tp.total_tasks);
    hthread_yield();
  }
  aprintf("DONE!!!\n");

  /*
    while(1)
    {
    hthread_yield();
    }
  */
  return 0;
}
// Initialize all of the PR data
void init_PR_data() {
    // Initialize the ICAP
    hthread_mutexattr_t attr;
    if (hthread_mutexattr_init(&attr)) {
        printf("Error intializing mutex attribute\n");
        while(1);
    }

    // Set MID to maximum ID allowed    
    if (hthread_mutexattr_setnum(&attr,(Huint) HT_SEM_MAXNUM)) {
        printf("Error setting MID (%u) for mutex attribute\n", HT_SEM_MAXNUM);
        while(1);
    }
    
    if(hthread_mutex_init(&icap_mutex, &attr)) {
        printf("error initializing icap mutex\n");
        while(1);
    }

    #ifdef ICAP
    // Initialize the ICAP
    if(XHwIcap_CfgInitialize(&HwIcap, (XHwIcap_Config *) 0x1, ICAP_BASEADDR)) {
        printf("Error initializing the ICAP\n");
        while(1);
    }

    // Initialize the pointers
    // init CRC
    crc_bit[0] = (unsigned char *) (&crc0_bit[0]);
    crc_bit[1] = (unsigned char *) (&crc1_bit[0]);
    crc_bit[2] = (unsigned char *) (&crc2_bit[0]);
    crc_bit[3] = (unsigned char *) (&crc3_bit[0]);
    crc_bit[4] = (unsigned char *) (&crc4_bit[0]);
    crc_bit[5] = (unsigned char *) (&crc5_bit[0]);

    // init sort
    sort_bit[0] = (unsigned char *) (&sort0_bit[0]);
    sort_bit[1] = (unsigned char *) (&sort1_bit[0]);
    sort_bit[2] = (unsigned char *) (&sort2_bit[0]);
    sort_bit[3] = (unsigned char *) (&sort3_bit[0]);
    sort_bit[4] = (unsigned char *) (&sort4_bit[0]);
    sort_bit[5] = (unsigned char *) (&sort5_bit[0]);
    
    // init vector
    vector_bit[0] = (unsigned char *) (&vector0_bit[0]);
    vector_bit[1] = (unsigned char *) (&vector1_bit[0]);
    vector_bit[2] = (unsigned char *) (&vector2_bit[0]);
    vector_bit[3] = (unsigned char *) (&vector3_bit[0]);
    vector_bit[4] = (unsigned char *) (&vector4_bit[0]);
    vector_bit[5] = (unsigned char *) (&vector5_bit[0]);

    // Create accelerate profiles - containers that hold
    // pointers to each accelerator specific for each slave.
    unsigned int i;
    for (i = 0; i < NUM_AVAILABLE_HETERO_CPUS; i++) { 
        set_accelerator_structure((accelerator_list_t *) &accelerator_list[i], i);

        // -------------------------------------------------------------- //
        //         Write extra parameters for PR functionality            //
        // -------------------------------------------------------------- //
        _hwti_set_accelerator_ptr((Huint) hwti_array[i], (Huint)&accelerator_list[i]);

        // Write the ICAP Mutex
        _hwti_set_icap_mutex( (Huint) hwti_array[i], (Huint) &icap_mutex);

        // Write the ICAP Data Strucutre
        _hwti_set_icap_struct_ptr( (Huint) hwti_array[i], (Huint) &HwIcap);

        // Write pointer for last_used_accelerator so slave can update the table
        _hwti_set_last_accelerator_ptr( (Huint) hwti_array[i], (Huint) &slave_table[i].last_used_acc);
            
        // Write pointer to tuning_table
        _hwti_set_tuning_table_ptr((Huint) hwti_array[i], (Huint) &tuning_table);

    }
    #endif
   
    // Reset thread create statistical data 
    no_free_slaves_num = 0;
    possible_slaves_num = 0;
    best_slaves_num = 0;
}