1 /* pedigrees.h                  -*-C++-*-
2  *
3  *************************************************************************
4  *
5  *  @copyright
6  *  Copyright (C) 2009-2013, Intel Corporation
7  *  All rights reserved.
8  *
9  *  @copyright
10  *  Redistribution and use in source and binary forms, with or without
11  *  modification, are permitted provided that the following conditions
12  *  are met:
13  *
14  *    * Redistributions of source code must retain the above copyright
15  *      notice, this list of conditions and the following disclaimer.
16  *    * Redistributions in binary form must reproduce the above copyright
17  *      notice, this list of conditions and the following disclaimer in
18  *      the documentation and/or other materials provided with the
19  *      distribution.
20  *    * Neither the name of Intel Corporation nor the names of its
21  *      contributors may be used to endorse or promote products derived
22  *      from this software without specific prior written permission.
23  *
24  *  @copyright
25  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26  *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27  *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28  *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29  *  HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
30  *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
31  *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
32  *  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
33  *  AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34  *  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
35  *  WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36  *  POSSIBILITY OF SUCH DAMAGE.
37  **************************************************************************/
38 
39 #ifndef INCLUDED_PEDIGREES_DOT_H
40 #define INCLUDED_PEDIGREES_DOT_H
41 
42 
43 #include <cilk/common.h>
44 #include <internal/abi.h>
45 
46 #include "rts-common.h"
47 #include "global_state.h"
48 #include "os.h"
49 
50 __CILKRTS_BEGIN_EXTERN_C
51 
52 /**
53  * @file pedigrees.h
54  *
55  * @brief pedigrees.h declares common routines related to pedigrees
56  * and the pedigree API.
57  */
58 
59 
60 /**
61  * @brief Sets the leaf pedigree node for the current user thread.
62  *
63  * A typical implementation stores this pedigree node in thread-local
64  * storage.
65  *
66  * Preconditions:
67  *  - Current thread should be a user thread.
68  *
69  * @param leaf The pedigree node to store as a leaf.
70  */
71 COMMON_PORTABLE
72 void __cilkrts_set_pedigree_leaf(__cilkrts_pedigree* leaf);
73 
74 
75 /**
76  * Load the pedigree leaf node from thread-local storage into the
77  * current user worker.  This method should execute as a part of
78  * binding the user thread to a worker.
79  *
80  * Preconditions:
81  *
82  *  - w should be the worker for the current thread
83  *  - w should be a user thread.
84  */
85 COMMON_PORTABLE
86 void load_pedigree_leaf_into_user_worker(__cilkrts_worker *w);
87 
88 /**
89  * Save the pedigree leaf node from the worker into thread-local
90  * storage.  This method should execute as part of unbinding a user
91  * thread from a worker.
92  *
93  * Preconditions:
94  *
95  *  - w should be the worker for the current thread
96  *  - w should be a user thread.
97  */
98 COMMON_PORTABLE
99 void save_pedigree_leaf_from_user_worker(__cilkrts_worker *w);
100 
101 
102 
103 /**
104  * Update pedigree for a worker when leaving a frame.
105  *
106  * If this is the frame of a spawn helper (indicated by the
107  *  CILK_FRAME_DETACHED flag) we must update the pedigree.  The
108  *  pedigree points to nodes allocated on the stack.  Failing to
109  *  update it will result in a accvio/segfault if the pedigree is
110  *  walked.  This must happen for all spawn helper frames, even if
111  *  we're processing an exception.
112  */
113 COMMON_PORTABLE
update_pedigree_on_leave_frame(__cilkrts_worker * w,__cilkrts_stack_frame * sf)114 inline void update_pedigree_on_leave_frame(__cilkrts_worker *w,
115 					   __cilkrts_stack_frame *sf)
116 {
117     // Update the worker's pedigree information if this is an ABI 1 or later
118     // frame
119     if (CILK_FRAME_VERSION_VALUE(sf->flags) >= 1)
120     {
121 	w->pedigree.rank = sf->spawn_helper_pedigree.rank + 1;
122 	w->pedigree.parent = sf->spawn_helper_pedigree.parent;
123     }
124 }
125 
126 
127 
128 __CILKRTS_END_EXTERN_C
129 
130 #endif // ! defined(INCLUDED_PEDIGREES_DOT_H)
131