/* pedigrees.c                  -*-C-*-
 *
 *************************************************************************
 *
 *  Copyright (C) 2007-2016, Intel Corporation
 *  All rights reserved.
 *  
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions
 *  are met:
 *  
 *    * Redistributions of source code must retain the above copyright
 *      notice, this list of conditions and the following disclaimer.
 *    * Redistributions in binary form must reproduce the above copyright
 *      notice, this list of conditions and the following disclaimer in
 *      the documentation and/or other materials provided with the
 *      distribution.
 *    * Neither the name of Intel Corporation nor the names of its
 *      contributors may be used to endorse or promote products derived
 *      from this software without specific prior written permission.
 *  
 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 *  HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
 *  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
 *  AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 *  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
 *  WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 *  POSSIBILITY OF SUCH DAMAGE.
 *  
 *  *********************************************************************
 *  
 *  PLEASE NOTE: This file is a downstream copy of a file mainitained in
 *  a repository at cilkplus.org. Changes made to this file that are not
 *  submitted through the contribution process detailed at
 *  http://www.cilkplus.org/submit-cilk-contribution will be lost the next
 *  time that a new version is released. Changes only submitted to the
 *  GNU compiler collection or posted to the git repository at
 *  https://bitbucket.org/intelcilkruntime/intel-cilk-runtime.git are
 *  not tracked.
 *  
 *  We welcome your contributions to this open source project. Thank you
 *  for your assistance in helping us improve Cilk Plus.
 *
 **************************************************************************/

#include "pedigrees.h"
#include "local_state.h"

/*************************************************************
  Pedigree API code.
*************************************************************/

/*
 * C99 requires that every inline function with external linkage have one
 * extern declaration in the program (with the inline definition in scope).
 */
COMMON_PORTABLE
extern void update_pedigree_on_leave_frame(__cilkrts_worker *w,
					   __cilkrts_stack_frame *sf);

void __cilkrts_set_pedigree_leaf(__cilkrts_pedigree *leaf)
{
    __cilkrts_set_tls_pedigree_leaf(leaf);
}

void load_pedigree_leaf_into_user_worker(__cilkrts_worker *w)
{
    __cilkrts_pedigree *pedigree_leaf;
    CILK_ASSERT(w->l->type == WORKER_USER);
    pedigree_leaf = __cilkrts_get_tls_pedigree_leaf(1);
    w->pedigree = *pedigree_leaf;

    // Save a pointer to the old leaf.
    // We'll need to restore it later.
    CILK_ASSERT(w->l->original_pedigree_leaf == NULL);
    w->l->original_pedigree_leaf = pedigree_leaf;
    
    __cilkrts_set_tls_pedigree_leaf(&w->pedigree);
    
    // Check that this new pedigree root has at least two values.
    CILK_ASSERT(w->pedigree.parent);
    CILK_ASSERT(w->pedigree.parent->parent == NULL);
}

void save_pedigree_leaf_from_user_worker(__cilkrts_worker *w)
{
    CILK_ASSERT(w->l->type == WORKER_USER);

    // Existing leaf in tls should be for the current worker.
    // This assert is expensive to check though.
    // CILK_ASSERT(&w->pedigree == __cilkrts_get_tls_pedigree_leaf(0));
    CILK_ASSERT(w->l->original_pedigree_leaf);

    // w should finish with a pedigree node that points to 
    // the same root that we just looked up.

    // TODO: This assert should be valid.
    // But we are removing it now to make exceptions (without pedigrees) work.
    // Currently, reading the pedigree after an exception is caught
    // fails because the pedigree chain not restored correctly. 
    // CILK_ASSERT(w->l->original_pedigree_leaf->next == w->pedigree.parent);
    w->l->original_pedigree_leaf->rank = w->pedigree.rank;

    // Save that leaf pointer back into tls.
    __cilkrts_set_tls_pedigree_leaf(w->l->original_pedigree_leaf);
    // Null out worker's leaf for paranoia.
    w->l->original_pedigree_leaf = NULL;
}



/*
  Local Variables: **
  c-file-style:"bsd" **
  c-basic-offset:4 **
  indent-tabs-mode:nil **
  End: **
*/
