1/* except.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/**
40 * @file except.h
41 *
42 * @brief Common definitions for the various implementations of exception
43 * handling.
44 */
45
46#ifndef INCLUDED_EXCEPT_DOT_H
47#define INCLUDED_EXCEPT_DOT_H
48
49#include <cilk/common.h>
50#include <internal/abi.h>
51#include "full_frame.h"
52
53__CILKRTS_BEGIN_EXTERN_C
54
55/**
56 * OS-dependent information about an exception that's being moved between
57 * strands.
58 */
59typedef struct pending_exception_info pending_exception_info;
60
61/**
62 * Merge the right exception record into the left.  The left is logically
63 * earlier.
64 *
65 * On entry the left state is synched and can not have an unresolved
66 * exception.  The merge may result in an unresolved exception.
67 *
68 * If there is both a right and left exception, the right exception will
69 * be disposed of in preference to the left exception, destructing the
70 * exception object.
71 *
72 * @param w The worker that is preparing to resume execution.
73 * @param left_exception The exception that would have happened earlier
74 * if the code executed serially.  Can be NULL if the left strand has not
75 * raised an exception.
76 * @param right_exception The exception that would have happened later
77 * if the code executed serially.  Can be NULL if the right strand has not
78 * raised an exception.
79 *
80 * @return NULL if there both the right and left exception are NULL. This
81 * indicates that there are no pending exceptions.
82 * @return The pending exception that is to be raised to continue searching
83 * for a catch block to handle the exception.
84 */
85COMMON_SYSDEP
86struct pending_exception_info *__cilkrts_merge_pending_exceptions(
87    __cilkrts_worker *w,
88    pending_exception_info *left_exception,
89    pending_exception_info *right_exception);
90
91/**
92 * Move the exception information from the worker to the full_frame.
93 *
94 * @param w The worker which is suspending work on a full_frame.
95 * @param ff The full_frame which is being suspended.
96 */
97COMMON_SYSDEP
98void __cilkrts_save_exception_state(__cilkrts_worker *w,
99                                    full_frame *ff);
100
101/**
102 * Function to delete pending exception.  This will delete the
103 * exception object and then free the stack/fiber.
104 *
105 * @param w The worker we're running on.
106 * @param pei The pending exception to be delete
107 * @param delete_object Unused.  Should always be 1.
108 */
109void delete_exception_obj (__cilkrts_worker *w,
110                           struct pending_exception_info *pei,
111                           int delete_object);
112
113#ifndef _WIN32
114/* gcc-style exception handling */
115NON_COMMON NORETURN __cilkrts_c_sync_except(__cilkrts_worker *w,
116                                            __cilkrts_stack_frame *sf);
117NON_COMMON void __attribute__((nonnull))
118__cilkrts_gcc_rethrow(__cilkrts_stack_frame *sf);
119#endif
120
121__CILKRTS_END_EXTERN_C
122
123#endif // ! defined(INCLUDED_EXCEPT_DOT_H)
124