void * Task::allocate( const unsigned arg_sizeof_derived , const unsigned arg_dependence_capacity ) { // Counting on 'malloc' thread safety so lock/unlock not required. // However, isolate calls here to mitigate future need to introduce lock/unlock. // lock // while ( ! Kokkos::atomic_compare_exchange_strong( & lock_alloc_dealloc , 0 , 1 ) ); void * const ptr = malloc( padded_sizeof_derived( arg_sizeof_derived ) + arg_dependence_capacity * sizeof(Task*) ); // unlock // Kokkos::atomic_compare_exchange_strong( & lock_alloc_dealloc , 1 , 0 ); return ptr ; }
Task::TaskMember( const Task::function_dealloc_type arg_dealloc , const Task::function_apply_type arg_apply , const unsigned arg_sizeof_derived , const unsigned arg_dependence_capacity ) : m_dealloc( arg_dealloc ) , m_verify( & Task::verify_type<void> ) , m_apply( arg_apply ) , m_dep( (Task **)( ((unsigned char *) this) + padded_sizeof_derived( arg_sizeof_derived ) ) ) , m_wait( 0 ) , m_next( 0 ) , m_dep_capacity( arg_dependence_capacity ) , m_dep_size( 0 ) , m_ref_count( 0 ) , m_state( TASK_STATE_CONSTRUCTING ) { for ( unsigned i = 0 ; i < arg_dependence_capacity ; ++i ) m_dep[i] = 0 ; }
Task::TaskMember( const function_dealloc_type arg_dealloc , const function_single_type arg_apply_single , const function_team_type arg_apply_team , volatile int & arg_active_count , const unsigned arg_sizeof_derived , const unsigned arg_dependence_capacity ) : m_dealloc( arg_dealloc ) , m_verify( & Task::verify_type<void> ) , m_apply_single( arg_apply_single ) , m_apply_team( arg_apply_team ) , m_active_count( & arg_active_count ) , m_qfeb(0) , m_dep( (Task **)( ((unsigned char *) this) + padded_sizeof_derived( arg_sizeof_derived ) ) ) , m_dep_capacity( arg_dependence_capacity ) , m_dep_size( 0 ) , m_ref_count( 0 ) , m_state( Kokkos::Experimental::TASK_STATE_CONSTRUCTING ) { qthread_empty( & m_qfeb ); // Set to full when complete for ( unsigned i = 0 ; i < arg_dependence_capacity ; ++i ) m_dep[i] = 0 ; }
void * Task::allocate( const unsigned arg_sizeof_derived , const unsigned arg_dependence_capacity ) { return malloc( padded_sizeof_derived( arg_sizeof_derived ) + arg_dependence_capacity * sizeof(Task*) ); }