mirror of
https://github.com/autc04/Retro68.git
synced 2024-09-08 20:55:01 +00:00
173 lines
6.3 KiB
C
173 lines
6.3 KiB
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.
|
|
*
|
|
*/
|
|
|
|
#ifndef INCLUDED_CILK_HYPEROBJECT_BASE
|
|
#define INCLUDED_CILK_HYPEROBJECT_BASE
|
|
|
|
#ifdef __cplusplus
|
|
# include <cstdlib>
|
|
# include <cstddef>
|
|
#else
|
|
# include <stdlib.h>
|
|
# include <stddef.h>
|
|
#endif
|
|
|
|
#include <cilk/common.h>
|
|
|
|
#if defined _WIN32 || defined _WIN64
|
|
# if !defined CILK_STUB && !defined IN_CILK_RUNTIME
|
|
/* bring in the Cilk library, which has definitions for some of these
|
|
* functions. */
|
|
# pragma comment(lib, "cilkrts")
|
|
# endif
|
|
#endif
|
|
|
|
/* The __CILKRTS_STRAND_PURE attribute tells the compiler that the value
|
|
* returned by 'func' for a given argument to 'func' will remain valid until
|
|
* the next strand boundary (spawn or sync) or until the next call to a
|
|
* function with the __CILKRTS_STRAND_STALE attribute using the same function
|
|
* argument.
|
|
*/
|
|
#if 0 && defined __cilk && (defined __GNUC__ && !defined _WIN32) && defined __cilkartsrev
|
|
# define __CILKRTS_STRAND_PURE(func) \
|
|
func __attribute__((__cilk_hyper__("lookup")))
|
|
# define __CILKRTS_STRAND_STALE(func) \
|
|
func __attribute__((__cilk_hyper__("flush")))
|
|
#else
|
|
# define __CILKRTS_STRAND_PURE(func) func
|
|
# define __CILKRTS_STRAND_STALE(func) func
|
|
#endif
|
|
|
|
/*****************************************************************************
|
|
* C runtime interface to the hyperobject subsystem
|
|
*****************************************************************************/
|
|
|
|
__CILKRTS_BEGIN_EXTERN_C
|
|
|
|
/* Callback function signatures. The 'r' argument always points to the
|
|
* reducer itself and is commonly ignored. */
|
|
typedef void (*cilk_c_reducer_reduce_fn_t)(void* r, void* lhs, void* rhs);
|
|
typedef void (*cilk_c_reducer_identity_fn_t)(void* r, void* view);
|
|
typedef void (*cilk_c_reducer_destroy_fn_t)(void* r, void* view);
|
|
typedef void* (*cilk_c_reducer_allocate_fn_t)(void* r, __STDNS size_t bytes);
|
|
typedef void (*cilk_c_reducer_deallocate_fn_t)(void* r, void* view);
|
|
|
|
/** Representation of the monoid */
|
|
typedef struct cilk_c_monoid {
|
|
cilk_c_reducer_reduce_fn_t reduce_fn;
|
|
cilk_c_reducer_identity_fn_t identity_fn;
|
|
cilk_c_reducer_destroy_fn_t destroy_fn;
|
|
cilk_c_reducer_allocate_fn_t allocate_fn;
|
|
cilk_c_reducer_deallocate_fn_t deallocate_fn;
|
|
} cilk_c_monoid;
|
|
|
|
/** Base of the hyperobject */
|
|
typedef struct __cilkrts_hyperobject_base
|
|
{
|
|
cilk_c_monoid __c_monoid;
|
|
unsigned long long __flags;
|
|
__STDNS ptrdiff_t __view_offset; /* offset (in bytes) to leftmost view */
|
|
__STDNS size_t __view_size; /* Size of each view */
|
|
} __cilkrts_hyperobject_base;
|
|
|
|
|
|
#ifndef CILK_STUB
|
|
|
|
/* Library functions. */
|
|
CILK_EXPORT
|
|
void __cilkrts_hyper_create(__cilkrts_hyperobject_base *key);
|
|
CILK_EXPORT void __CILKRTS_STRAND_STALE(
|
|
__cilkrts_hyper_destroy(__cilkrts_hyperobject_base *key));
|
|
CILK_EXPORT void* __CILKRTS_STRAND_PURE(
|
|
__cilkrts_hyper_lookup(__cilkrts_hyperobject_base *key));
|
|
|
|
CILK_EXPORT
|
|
void* __cilkrts_hyperobject_alloc(void* ignore, __STDNS size_t bytes);
|
|
CILK_EXPORT
|
|
void __cilkrts_hyperobject_dealloc(void* ignore, void* view);
|
|
|
|
/* No-op destroy function */
|
|
CILK_EXPORT
|
|
void __cilkrts_hyperobject_noop_destroy(void* ignore, void* ignore2);
|
|
|
|
|
|
#else // CILK_STUB
|
|
|
|
// Programs compiled with CILK_STUB are not linked with the Cilk runtime
|
|
// library, so they should not have external references to cilkrts functions.
|
|
// Furthermore, they don't need the hyperobject functionality, so the
|
|
// functions can be stubbed.
|
|
|
|
#define __cilkrts_hyperobject_create __cilkrts_hyperobject_create__stub
|
|
__CILKRTS_INLINE
|
|
void __cilkrts_hyper_create(__cilkrts_hyperobject_base *key)
|
|
{}
|
|
|
|
#define __cilkrts_hyperobject_destroy __cilkrts_hyperobject_destroy__stub
|
|
__CILKRTS_INLINE
|
|
void __cilkrts_hyper_destroy(__cilkrts_hyperobject_base *key)
|
|
{}
|
|
|
|
#define __cilkrts_hyperobject_lookup __cilkrts_hyperobject_lookup__stub
|
|
__CILKRTS_INLINE
|
|
void* __cilkrts_hyper_lookup(__cilkrts_hyperobject_base *key)
|
|
{ return (char*)(key) + key->__view_offset; }
|
|
|
|
// Pointers to these functions are stored into monoids, so real functions
|
|
// are needed.
|
|
|
|
#define __cilkrts_hyperobject_alloc __cilkrts_hyperobject_alloc__stub
|
|
__CILKRTS_INLINE
|
|
void* __cilkrts_hyperobject_alloc(void* ignore, __STDNS size_t bytes)
|
|
{ assert(0); return __STDNS malloc(bytes); }
|
|
|
|
#define __cilkrts_hyperobject_dealloc __cilkrts_hyperobject_dealloc__stub
|
|
__CILKRTS_INLINE
|
|
void __cilkrts_hyperobject_dealloc(void* ignore, void* view)
|
|
{ assert(0); __STDNS free(view); }
|
|
|
|
#define __cilkrts_hyperobject_noop_destroy \
|
|
__cilkrts_hyperobject_noop_destroy__stub
|
|
__CILKRTS_INLINE
|
|
void __cilkrts_hyperobject_noop_destroy(void* ignore, void* ignore2)
|
|
{}
|
|
|
|
#endif
|
|
|
|
__CILKRTS_END_EXTERN_C
|
|
|
|
#endif /* INCLUDED_CILK_HYPEROBJECT_BASE */
|