aboutsummaryrefslogtreecommitdiff
path: root/liboffloadmic/runtime/offload_util.h
blob: 2cffd82f70a458a9254af06deb1009594c18d9ef (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
/*
    Copyright (c) 2014 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 <stdio.h>
#include <stdlib.h>
#include <stdint.h>

#ifdef TARGET_WINNT
#include <windows.h>
#include <process.h>
#else // TARGET_WINNT
#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

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.
extern bool __offload_parse_size_string(const char *str, uint64_t &new_size);

// Parses string with integer value
extern bool __offload_parse_int_string(const char *str, int64_t &value);

// get value by its base, offset and size
int64_t get_el_value(
    char   *base,
    int64_t offset,
    int64_t size
);
#endif // OFFLOAD_UTIL_H_INCLUDED