/*
    Copyright 2005-2010 Intel Corporation.  All Rights Reserved.

    This file is part of Threading Building Blocks.

    Threading Building Blocks is free software; you can redistribute it
    and/or modify it under the terms of the GNU General Public License
    version 2 as published by the Free Software Foundation.

    Threading Building Blocks is distributed in the hope that it will be
    useful, but WITHOUT ANY WARRANTY; without even the implied warranty
    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with Threading Building Blocks; if not, write to the Free Software
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

    As a special exception, you may use this file as part of a free software
    library without restriction.  Specifically, if other files instantiate
    templates or use macros or inline functions from this file, or you compile
    this file and link it with other files to produce an executable, this
    file does not by itself cause the resulting executable to be covered by
    the GNU General Public License.  This exception does not however
    invalidate any other reasons why the executable file might be covered by
    the GNU General Public License.
*/

#ifndef __TBB_dynamic_link
#define __TBB_dynamic_link

// Support for dynamically linking to a shared library.
// By default, the symbols defined here go in namespace tbb::internal.
// The symbols can be put in another namespace by defining the preprocessor
// symbols OPEN_INTERNAL_NAMESPACE and CLOSE_INTERNAL_NAMESPACE to open and
// close the other namespace.  See default definition below for an example.

#ifndef OPEN_INTERNAL_NAMESPACE
#define OPEN_INTERNAL_NAMESPACE namespace tbb { namespace internal {
#define CLOSE_INTERNAL_NAMESPACE }}
#endif /* OPEN_INTERNAL_NAMESPACE */

#include <stddef.h>
#if _WIN32||_WIN64
#if _XBOX
    #define NONET
    #define NOD3D
    #include <xtl.h>
#else
#include <windows.h>
#endif
#endif /* _WIN32||_WIN64 */

OPEN_INTERNAL_NAMESPACE

//! Type definition for a pointer to a void somefunc(void)
typedef void (*pointer_to_handler)();

// Double cast through the void* from func_ptr in DLD macro is necessary to 
// prevent warnings from some compilers (g++ 4.1)
#if __TBB_WEAK_SYMBOLS

#define DLD(s,h) {(pointer_to_handler)&s, (pointer_to_handler*)(void*)(&h)}
//! Association between a handler name and location of pointer to it.
struct dynamic_link_descriptor {
    //! pointer to the handler
    pointer_to_handler ptr;
    //! Pointer to the handler
    pointer_to_handler* handler;
};

#else /* !__TBB_WEAK_SYMBOLS */

#define DLD(s,h) {#s, (pointer_to_handler*)(void*)(&h)}
//! Association between a handler name and location of pointer to it.
struct dynamic_link_descriptor {
    //! Name of the handler
    const char* name;
    //! Pointer to the handler
    pointer_to_handler* handler;
};

#endif /* !__TBB_WEAK_SYMBOLS */

#if _WIN32||_WIN64
typedef HMODULE dynamic_link_handle;
#else 
typedef void* dynamic_link_handle;
#endif /* _WIN32||_WIN64 */

//! Fill in dynamically linked handlers.
/** 'n' is the length of the array descriptors[].
    'required' is the number of the initial entries in the array descriptors[] 
    that have to be found in order for the call to succeed. If the library and 
    all the required handlers are found, then the corresponding handler pointers 
    are set, and the return value is true.  Otherwise the original array of 
    descriptors is left untouched and the return value is false. **/
bool dynamic_link( const char* libraryname, 
                   const dynamic_link_descriptor descriptors[], 
                   size_t n, 
                   size_t required = ~(size_t)0,
                   dynamic_link_handle* handle = 0 );

void dynamic_unlink( dynamic_link_handle handle );

CLOSE_INTERNAL_NAMESPACE

#endif /* __TBB_dynamic_link */
