123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193 |
- /* cilk-tbb-interop.h -*-C++-*-
- *
- *************************************************************************
- *
- * @copyright
- * Copyright (C) 2009-2013, Intel Corporation
- * All rights reserved.
- *
- * @copyright
- * 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.
- *
- * @copyright
- * 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.
- **************************************************************************/
- /**
- * @file cilk-tbb-interop.h
- *
- * @brief Interface between TBB and Cilk to allow TBB to associate it's
- * per-thread data with Cilk workers, and maintain the association as work
- * moves between worker threads. This handles the case where TBB calls
- * into a Cilk function which may later call back to a function making
- * TBB calls.
- *
- * Each thunk structure has two pointers: \"routine\" and \"data\".
- * The caller of the thunk invokes *routine, passing \"data\" as the void*
- * parameter.
- */
- #ifndef INCLUDED_CILK_TBB_INTEROP_DOT_H
- #define INCLUDED_CILK_TBB_INTEROP_DOT_H
- #include <cilk/common.h> // for CILK_EXPORT
- __CILKRTS_BEGIN_EXTERN_C
- /** A return code. 0 indicates success. */
- typedef int __cilk_tbb_retcode;
- /**
- * Enumeration of reasons that Cilk will call the TBB stack operation
- * function.
- *
- * When a non-empty stack is transfered between threads, the first thread must
- * orphan it and the second thread must adopt it.
- *
- * An empty stack can be transfered similarly, or simply released by the first
- * thread.
- *
- * Here is a summary of the actions as transitions on a state machine.
- @verbatim
- watch ORPHAN
- -->--> -->--
- / \ / \
- (freed empty stack) (TBB sees stack running on thread) (stack in limbo)
- \ / \ /
- --<-- --<--
- RELEASE or ADOPT
- unwatch
- @endverbatim
- */
- typedef enum __cilk_tbb_stack_op {
- /**
- * Disconnecting stack from a thread.
- *
- * The thunk must be invoked on the thread disconnecting itself from the
- * stack. Must \"happen before\" the stack is adopted elsewhere.
- */
- CILK_TBB_STACK_ORPHAN,
- /**
- * Reconnecting orphaned stack to a thread.
- *
- * The thunk must be invoked on the thread adopting the stack.
- */
- CILK_TBB_STACK_ADOPT,
- /**
- * Releasing stack.
- *
- * The thunk must be invoked on the thread doing the releasing, Must
- * \"happen before\" the stack is used elsewhere.
- */
- CILK_TBB_STACK_RELEASE
- } __cilk_tbb_stack_op;
- /**
- * Function that will be called by the Cilk runtime to inform TBB of a change
- * in the stack associated with the current thread.
- *
- * It does not matter what stack the thunk runs on.
- * The thread (not fiber) on which the thunk runs is important.
- *
- * @param op Enumerated value indicating what type of change is ocurring.
- * @param data Context value provided by TBB in the __cilkrts_watch_stack
- * call. This data is opaque to Cilk.
- *
- * @return 0 indicates success.
- */
- typedef __cilk_tbb_retcode (*__cilk_tbb_pfn_stack_op)(enum __cilk_tbb_stack_op op,
- void* data);
- /**
- * Function that will be called by TBB to inform the Cilk runtime that TBB
- * is no longer interested in watching the stack bound to the current thread.
- *
- * @param data Context value provided to TBB by the __cilkrts_watch_stack
- * call. This data is opaque to TBB.
- *
- * @return 0 indicates success.
- */
- typedef __cilk_tbb_retcode (*__cilk_tbb_pfn_unwatch_stacks)(void *data);
- /**
- * Thunk invoked by Cilk to call back to TBB to tell it about a change in
- * the stack bound to the current thread.
- */
- typedef struct __cilk_tbb_stack_op_thunk {
- /// Function in TBB the Cilk runtime should call when something
- // "interesting" happens involving a stack
- __cilk_tbb_pfn_stack_op routine;
- /// TBB context data to pass with the call to the stack_op routine
- void* data;
- } __cilk_tbb_stack_op_thunk;
- /**
- * Thunk invoked by TBB when it is no longer interested in watching the stack
- * bound to the current thread.
- */
- typedef struct __cilk_tbb_unwatch_thunk {
- /// Function in Cilk runtime to call when TBB no longer wants to watch
- // stacks
- __cilk_tbb_pfn_unwatch_stacks routine;
- /// Cilk runtime context data to pass with the call to the unwatch_stacks
- /// routine
- void* data;
- } __cilk_tbb_unwatch_thunk;
- /**
- * Requests that Cilk invoke __cilk_tbb_orphan_thunk when it orphans a stack.
- * Cilk sets *u to a thunk that TBB should call when it is no longer
- * interested in watching the stack.
- *
- * If the thread is not yet bound to the Cilk runtime, the Cilk runtime should
- * save this data in thread-local storage until __cilkrts_bind_thread is called.
- *
- * Called by TBB, defined by Cilk. This function is exported from the Cilk
- * runtime DLL/shared object. This declaration also appears in
- * cilk/cilk_undocumented.h -- don't change one declaration without also
- * changing the other.
- *
- * @param u __cilk_tbb_unwatch_thunk. This structure will be filled in by
- * the Cilk runtime to allow TBB to register that it is no longer interested
- * in watching the stack bound to the current thread.
- * @param o __cilk_tbb_stack_op_thunk. This structure specifies the routine
- * that the Cilk runtime should call when an "interesting" change in the stack
- * associate with the current worker occurs.
- *
- * @return 0 indicates success.
- */
- CILK_EXPORT
- __cilk_tbb_retcode __cilkrts_watch_stack(__cilk_tbb_unwatch_thunk* u,
- __cilk_tbb_stack_op_thunk o);
- __CILKRTS_END_EXTERN_C
- #endif // ! defined(INCLUDED_CILK_TBB_INTEROP_DOT_H)
|