|  | /* | 
|  | Copyright (c) 2014-2016 Intel Corporation.  All Rights Reserved. | 
|  |  | 
|  | 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. | 
|  |  | 
|  | 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 OFFLOAD_UTIL_H_INCLUDED | 
|  | #define OFFLOAD_UTIL_H_INCLUDED | 
|  |  | 
|  | #include <stdlib.h> | 
|  |  | 
|  | #ifdef TARGET_WINNT | 
|  | #define DLL_LOCAL | 
|  | #else | 
|  | #define DLL_LOCAL  __attribute__((visibility("hidden"))) | 
|  | #endif | 
|  |  | 
|  | #ifdef TARGET_WINNT | 
|  | // Don't use <stdint.h> as compiling with VS2010 makes ofldbegin.obj | 
|  | // incompatible with STL library of versions older than VS2010. | 
|  | typedef unsigned long long int  uint64_t; | 
|  | typedef signed long long int    int64_t; | 
|  | #include <windows.h> | 
|  | #include <process.h> | 
|  | #else // TARGET_WINNT | 
|  | #include <stdint.h> | 
|  | #include <dlfcn.h> | 
|  | #include <pthread.h> | 
|  | #endif // TARGET_WINNT | 
|  |  | 
|  | #ifdef TARGET_WINNT | 
|  | typedef unsigned pthread_key_t; | 
|  | typedef int pid_t; | 
|  |  | 
|  | #define __func__ __FUNCTION__ | 
|  | #define strtok_r(s,d,p) strtok_s(s,d,p) | 
|  | #define strcasecmp(a,b) stricmp(a,b) | 
|  |  | 
|  | #define thread_key_create(key, destructor) \ | 
|  | (((*key = TlsAlloc()) > 0) ? 0 : GetLastError()) | 
|  | #define thread_key_delete(key) TlsFree(key) | 
|  |  | 
|  | #ifndef S_ISREG | 
|  | #define S_ISREG(mode)  (((mode) & S_IFMT) == S_IFREG) | 
|  | #endif | 
|  |  | 
|  | void*   thread_getspecific(pthread_key_t key); | 
|  | int     thread_setspecific(pthread_key_t key, const void *value); | 
|  | #else | 
|  | #define thread_key_create(key, destructor) \ | 
|  | pthread_key_create((key), (destructor)) | 
|  | #define thread_key_delete(key)  pthread_key_delete(key) | 
|  | #define thread_getspecific(key) pthread_getspecific(key) | 
|  | #define thread_setspecific(key, value) pthread_setspecific(key, value) | 
|  | #endif // TARGET_WINNT | 
|  |  | 
|  | // Mutex implementation | 
|  | struct mutex_t { | 
|  | mutex_t() { | 
|  | #ifdef TARGET_WINNT | 
|  | InitializeCriticalSection(&m_lock); | 
|  | #else // TARGET_WINNT | 
|  | pthread_mutex_init(&m_lock, 0); | 
|  | #endif // TARGET_WINNT | 
|  | } | 
|  |  | 
|  | ~mutex_t() { | 
|  | #ifdef TARGET_WINNT | 
|  | DeleteCriticalSection(&m_lock); | 
|  | #else // TARGET_WINNT | 
|  | pthread_mutex_destroy(&m_lock); | 
|  | #endif // TARGET_WINNT | 
|  | } | 
|  |  | 
|  | void lock() { | 
|  | #ifdef TARGET_WINNT | 
|  | EnterCriticalSection(&m_lock); | 
|  | #else // TARGET_WINNT | 
|  | pthread_mutex_lock(&m_lock); | 
|  | #endif // TARGET_WINNT | 
|  | } | 
|  |  | 
|  | void unlock() { | 
|  | #ifdef TARGET_WINNT | 
|  | LeaveCriticalSection(&m_lock); | 
|  | #else // TARGET_WINNT | 
|  | pthread_mutex_unlock(&m_lock); | 
|  | #endif // TARGET_WINNT | 
|  | } | 
|  |  | 
|  | private: | 
|  | #ifdef TARGET_WINNT | 
|  | CRITICAL_SECTION    m_lock; | 
|  | #else | 
|  | pthread_mutex_t     m_lock; | 
|  | #endif | 
|  | }; | 
|  |  | 
|  | struct mutex_locker_t { | 
|  | mutex_locker_t(mutex_t &mutex) : m_mutex(mutex) { | 
|  | m_mutex.lock(); | 
|  | } | 
|  |  | 
|  | ~mutex_locker_t() { | 
|  | m_mutex.unlock(); | 
|  | } | 
|  |  | 
|  | private: | 
|  | mutex_t &m_mutex; | 
|  | }; | 
|  |  | 
|  | // Dynamic loader interface | 
|  | #ifdef TARGET_WINNT | 
|  | struct Dl_info | 
|  | { | 
|  | char        dli_fname[MAX_PATH]; | 
|  | void       *dli_fbase; | 
|  | char        dli_sname[MAX_PATH]; | 
|  | const void *dli_saddr; | 
|  | }; | 
|  |  | 
|  | void*   DL_open(const char *path); | 
|  | #define DL_close(handle)        FreeLibrary((HMODULE) (handle)) | 
|  | int     DL_addr(const void *addr, Dl_info *info); | 
|  | #else | 
|  | #define DL_open(path)           dlopen((path), RTLD_NOW) | 
|  | #define DL_close(handle)        dlclose(handle) | 
|  | #define DL_addr(addr, info)     dladdr((addr), (info)) | 
|  | #endif // TARGET_WINNT | 
|  |  | 
|  | DLL_LOCAL extern void* DL_sym(void *handle, const char *name, const char *version); | 
|  |  | 
|  | // One-time initialization API | 
|  | #ifdef TARGET_WINNT | 
|  | typedef INIT_ONCE                   OffloadOnceControl; | 
|  | #define OFFLOAD_ONCE_CONTROL_INIT   INIT_ONCE_STATIC_INIT | 
|  |  | 
|  | extern void __offload_run_once(OffloadOnceControl *ctrl, void (*func)(void)); | 
|  | #else | 
|  | typedef pthread_once_t              OffloadOnceControl; | 
|  | #define OFFLOAD_ONCE_CONTROL_INIT   PTHREAD_ONCE_INIT | 
|  |  | 
|  | #define __offload_run_once(ctrl, func) pthread_once(ctrl, func) | 
|  | #endif // TARGET_WINNT | 
|  |  | 
|  | // Parses size specification string. | 
|  | DLL_LOCAL extern bool __offload_parse_size_string(const char *str, uint64_t &new_size); | 
|  |  | 
|  | // Parses string with integer value | 
|  | DLL_LOCAL extern bool __offload_parse_int_string(const char *str, int64_t &value); | 
|  |  | 
|  | // get value by its base, offset and size | 
|  | DLL_LOCAL int64_t get_el_value( | 
|  | char   *base, | 
|  | int64_t offset, | 
|  | int64_t size | 
|  | ); | 
|  | #endif // OFFLOAD_UTIL_H_INCLUDED |