/* metacall_impl.h -*-C++-*- * ************************************************************************* * * @copyright * Copyright (C) 2010-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 metacall_impl.h * * @brief Meta-function calls to be used within the Cilk runtime system. * * These differ from the macros in cilkscreen.h and cilkview.h because they go * through the __cilkrts_metacall interface, which ensures that the operation * is performed even when instrumentation is disabled. */ #ifndef INCLUDED_CILKRTS_METACALL_H #define INCLUDED_CILKRTS_METACALL_H #include "rts-common.h" #include #include __CILKRTS_BEGIN_EXTERN_C /** * This function is effectively an unconditional call from the runtime into * a tool. It is used for operations that must be performed by the tool, * even when the tool is not instrumenting. For example, Cilkscreen always * recognizes the address of this function and performs the action specified * in the contained metadata. * * Note that this function MUST NOT BE INLINED within the runtime. This must * be the ONLY instance of the cilkscreen_metacall metadata. */ CILK_API_VOID __cilkrts_metacall(unsigned int tool, unsigned int code, void *data); /** * Return non-zero if running under Cilkscreen or Cilkview */ COMMON_PORTABLE int __cilkrts_running_under_sequential_ptool(void); /** * Disable Cilkscreen implementation */ #define __cilkrts_cilkscreen_disable_instrumentation() \ __cilkrts_metacall(METACALL_TOOL_SYSTEM, HYPER_DISABLE_INSTRUMENTATION, 0) /** * Enable Cilkscreen implementation */ #define __cilkrts_cilkscreen_enable_instrumentation() \ __cilkrts_metacall(METACALL_TOOL_SYSTEM, HYPER_ENABLE_INSTRUMENTATION, 0) /** * Set the worker on entering runtime. * * @attention Deprecated in favor of __cilkrts_cilkscreen_ignore_block. The * begin/enter pairs in the current metadata mean Cilkscreen no longer has to * have improper knowledge of the __cilkrts_worker or __cilkrts_stack_frame * structures. */ #define __cilkrts_cilkscreen_establish_worker(w) \ __cilkrts_metacall(METACALL_TOOL_SYSTEM, HYPER_ESTABLISH_WORKER, w) /** * Notify Cilkscreen of the extent of the stack. * * @param[in] begin Start (low address) of stack * @param[in] end One past high address of stack */ void __cilkrts_cilkscreen_establish_c_stack(char *begin, char *end); /** * Tell tools to ignore a block of memory - currently the global state and * memory allocated for workers. */ #define __cilkrts_cilkscreen_ignore_block(_begin, _end) \ { \ void *block[2] = {_begin, _end}; \ __cilkrts_metacall(METACALL_TOOL_SYSTEM, \ HYPER_IGNORE_MEMORY_BLOCK, \ block); \ } __CILKRTS_END_EXTERN_C #endif /* ! defined(INCLUDED_CILKRTS_METACALL_H) */