
//===----------------------------------------------------------------------===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.txt for details.
//
//===----------------------------------------------------------------------===//


#include "kmp.h"
#include "kmp_i18n.h"
#include "kmp_io.h"
#include "kmp_str.h"

#if OMP_40_ENABLED

/*!
@ingroup CANCELLATION
@param loc_ref location of the original task directive
@param gtid Global thread ID of encountering thread
@param cncl_kind Cancellation kind (parallel, for, sections, taskgroup)

@return returns true if the cancellation request has been activated and the execution thread
needs to proceed to the end of the canceled region.

Request cancellation of the binding OpenMP region.
*/
kmp_int32 __kmpc_cancel(ident_t* loc_ref, kmp_int32 gtid, kmp_int32 cncl_kind) {
    kmp_info_t *this_thr = __kmp_threads [ gtid ];
    
    KC_TRACE( 10, ("__kmpc_cancel: T#%d request %d OMP_CANCELLATION=%d\n", gtid, cncl_kind, __kmp_omp_cancellation) );

    KMP_DEBUG_ASSERT(cncl_kind != cancel_noreq);
    KMP_DEBUG_ASSERT(cncl_kind == cancel_parallel || cncl_kind == cancel_loop || 
                     cncl_kind == cancel_sections || cncl_kind == cancel_taskgroup); 
    KMP_DEBUG_ASSERT(__kmp_get_gtid() == gtid);

    if (__kmp_omp_cancellation) {
        switch (cncl_kind) {
        case cancel_parallel:
        case cancel_loop:
        case cancel_sections:
            // cancellation requests for parallel and worksharing constructs
            // are handled through the team structure
            {
                kmp_team_t *this_team = this_thr->th.th_team;
                KMP_DEBUG_ASSERT(this_team);
                kmp_int32 old = KMP_COMPARE_AND_STORE_RET32(&(this_team->t.t_cancel_request), cancel_noreq, cncl_kind);
                if (old == cancel_noreq || old == cncl_kind) {
                    //printf("__kmpc_cancel: this_team->t.t_cancel_request=%d @ %p\n", 
                    //       this_team->t.t_cancel_request, &(this_team->t.t_cancel_request));
                    // we do not have a cancellation request in this team or we do have one
                    // that matches the current request -> cancel
                    return 1 /* true */;
                }
                break;
            }
        case cancel_taskgroup:
            // cancellation requests for parallel and worksharing constructs
            // are handled through the taskgroup structure
            {
                kmp_taskdata_t*  task; 
                kmp_taskgroup_t* taskgroup;
                
                task = this_thr->th.th_current_task;
                KMP_DEBUG_ASSERT( task );
                
                taskgroup = task->td_taskgroup;
                if (taskgroup) {
                    kmp_int32 old = KMP_COMPARE_AND_STORE_RET32(&(taskgroup->cancel_request), cancel_noreq, cncl_kind);
                    if (old == cancel_noreq || old == cncl_kind) {
                        // we do not have a cancellation request in this taskgroup or we do have one
                        // that matches the current request -> cancel
                        return 1 /* true */;
                    }
                }
                else {
                    // TODO: what needs to happen here?
                    // the specification disallows cancellation w/o taskgroups
                    // so we might do anything here, let's abort for now
                    KMP_ASSERT( 0 /* false */);
                }
            }
            break;
        default:
            KMP_ASSERT (0 /* false */);
        }
    }

    // ICV OMP_CANCELLATION=false, so we ignored this cancel request
    KMP_DEBUG_ASSERT(!__kmp_omp_cancellation);
    return 0 /* false */;
}

/*!
@ingroup CANCELLATION
@param loc_ref location of the original task directive
@param gtid Global thread ID of encountering thread
@param cncl_kind Cancellation kind (parallel, for, sections, taskgroup)

@return returns true if a matching cancellation request has been flagged in the RTL and the 
encountering thread has to cancel..

Cancellation point for the encountering thread.
*/
kmp_int32 __kmpc_cancellationpoint(ident_t* loc_ref, kmp_int32 gtid, kmp_int32 cncl_kind) {
    kmp_info_t *this_thr = __kmp_threads [ gtid ];

    KC_TRACE( 10, ("__kmpc_cancellationpoint: T#%d request %d OMP_CANCELLATION=%d\n", gtid, cncl_kind, __kmp_omp_cancellation) );

    KMP_DEBUG_ASSERT(cncl_kind != cancel_noreq);
    KMP_DEBUG_ASSERT(cncl_kind == cancel_parallel || cncl_kind == cancel_loop || 
                     cncl_kind == cancel_sections || cncl_kind == cancel_taskgroup); 
    KMP_DEBUG_ASSERT(__kmp_get_gtid() == gtid);

    if (__kmp_omp_cancellation) {
        switch (cncl_kind) {
        case cancel_parallel:
        case cancel_loop:
        case cancel_sections:
            // cancellation requests for parallel and worksharing constructs
            // are handled through the team structure
            {
                kmp_team_t *this_team = this_thr->th.th_team;
                KMP_DEBUG_ASSERT(this_team);
                if (this_team->t.t_cancel_request) {
                    if (cncl_kind == this_team->t.t_cancel_request) {
                        // the request in the team structure matches the type of
                        // cancellation point so we can cancel
                        return 1 /* true */;
                    }
                    KMP_ASSERT( 0 /* false */);
                }
                else {
                    // we do not have a cancellation request pending, so we just
                    // ignore this cancellation point
                    return 0;
                }
                break;
            }
        case cancel_taskgroup:
            // cancellation requests for parallel and worksharing constructs
            // are handled through the taskgroup structure
            {
                kmp_taskdata_t*  task; 
                kmp_taskgroup_t* taskgroup;
                
                task = this_thr->th.th_current_task;
                KMP_DEBUG_ASSERT( task );
                
                taskgroup = task->td_taskgroup;
                if (taskgroup) {
                    // return the current status of cancellation for the 
                    // taskgroup
                    return !!taskgroup->cancel_request;
                }
                else {
                    // if a cancellation point is encountered by a task
                    // that does not belong to a taskgroup, it is OK
                    // to ignore it
                    return 0 /* false */;
                }
            }
        default:
            KMP_ASSERT (0 /* false */);
        }
    }

    // ICV OMP_CANCELLATION=false, so we ignore the cancellation point
    KMP_DEBUG_ASSERT(!__kmp_omp_cancellation);
    return 0 /* false */;
}

/*!
@ingroup CANCELLATION
@param loc_ref location of the original task directive
@param gtid Global thread ID of encountering thread

@return returns true if a matching cancellation request has been flagged in the RTL and the 
encountering thread has to cancel..

Barrier with cancellation point to send threads from the barrier to the
end of the parallel region.  Needs a special code pattern as documented 
in the design document for the cancellation feature.
*/
kmp_int32
__kmpc_cancel_barrier(ident_t *loc, kmp_int32 gtid) {
    int ret = 0 /* false */;
    kmp_info_t *this_thr = __kmp_threads [ gtid ];
    kmp_team_t *this_team = this_thr->th.th_team;

    KMP_DEBUG_ASSERT(__kmp_get_gtid() == gtid);

    // call into the standard barrier
    __kmpc_barrier(loc, gtid);

    // if cancellation is active, check cancellation flag
    if (__kmp_omp_cancellation) {
        // depending on which construct to cancel, check the flag and
        // reset the flag
        switch (this_team->t.t_cancel_request) {
        case cancel_parallel:
            ret = 1;
            // ensure that threads have checked the flag, when
            // leaving the above barrier
            __kmpc_barrier(loc, gtid);
            this_team->t.t_cancel_request = cancel_noreq;
            // the next barrier is the fork/join barrier, which
            // synchronizes the threads leaving here        
            break;
        case cancel_loop:
        case cancel_sections:
            ret = 1;
            // ensure that threads have checked the flag, when
            // leaving the above barrier
            __kmpc_barrier(loc, gtid);
            this_team->t.t_cancel_request = cancel_noreq;
            // synchronize the threads again to make sure we
            // do not have any run-away threads that cause a race
            // on the cancellation flag
            __kmpc_barrier(loc, gtid);
            break;
        case cancel_taskgroup:
            // this case should not occur
            KMP_ASSERT (0 /* false */ );
            break;
        case cancel_noreq:
            // do nothing
            break;
        default:
            KMP_ASSERT ( 0 /* false */);
        }
    }
    
    return ret;
}

/*!
@ingroup CANCELLATION
@param loc_ref location of the original task directive
@param gtid Global thread ID of encountering thread

@return returns true if a matching cancellation request has been flagged in the RTL and the 
encountering thread has to cancel..

Query function to query the current status of cancellation requests.
Can be used to implement the following pattern:
 
if (kmp_get_cancellation_status(kmp_cancel_parallel)) {
    perform_cleanup();
    #pragma omp cancellation point parallel      
}
*/
int __kmp_get_cancellation_status(int cancel_kind) {
    if (__kmp_omp_cancellation) {
        kmp_info_t *this_thr = __kmp_entry_thread();
        
        switch (cancel_kind) {
        case cancel_parallel:
        case cancel_loop:
        case cancel_sections:
            {
                kmp_team_t *this_team = this_thr->th.th_team;
                return this_team->t.t_cancel_request == cancel_kind;
            }
        case cancel_taskgroup:
            {
                kmp_taskdata_t*  task; 
                kmp_taskgroup_t* taskgroup;
                task = this_thr->th.th_current_task;
                taskgroup = task->td_taskgroup;
                return taskgroup && taskgroup->cancel_request;
            }
        }
    }

    return 0 /* false */;
}

#endif
