SeExpr
SeExpr2
Platform.h
Go to the documentation of this file.
1
/*
2
Copyright Disney Enterprises, Inc. All rights reserved.
3
4
Licensed under the Apache License, Version 2.0 (the "License");
5
you may not use this file except in compliance with the License
6
and the following modification to it: Section 6 Trademarks.
7
deleted and replaced with:
8
9
6. Trademarks. This License does not grant permission to use the
10
trade names, trademarks, service marks, or product names of the
11
Licensor and its affiliates, except as required for reproducing
12
the content of the NOTICE file.
13
14
You may obtain a copy of the License at
15
http://www.apache.org/licenses/LICENSE-2.0
16
*/
17
#ifndef Platform_h
18
#define Platform_h
19
23
#include <iostream>
24
25
#ifdef __APPLE__
26
#include <Availability.h>
27
#include <libgen.h>
28
#endif
29
30
// platform-specific includes
31
#if defined(_WIN32) || defined(_WINDOWS) || defined(_MSC_VER)
32
#ifndef WINDOWS
33
#define WINDOWS
34
#endif
35
#define _CRT_NONSTDC_NO_DEPRECATE 1
36
#define _CRT_SECURE_NO_DEPRECATE 1
37
#if !defined(NOMINMAX)
38
#define NOMINMAX 1
39
#endif
40
41
// note: because there are some conflicts preventing the use of
42
// windows.h and COFF.h (one of LLVM include files) in the same
43
// compilation unit (https://groups.google.com/forum/#!topic/llvm-dev/6n5Q0pFdaSA)
44
// do NOT include windows.h here. The Windows implementation is
45
// done on the Platform.cpp file, using opaque types.
46
47
#include <malloc.h>
48
#include <io.h>
49
#include <tchar.h>
50
#include <process.h>
51
52
#else
53
54
// linux/unix/posix
55
#include <stdlib.h>
56
#include <alloca.h>
57
#include <string.h>
58
#include <pthread.h>
59
#include <inttypes.h>
60
#include <sys/time.h>
61
// OS for spinlock
62
#ifdef __APPLE__
63
#include <libkern/OSAtomic.h>
64
#include <sys/types.h>
65
#endif
66
#endif
// defined(_WIN32)...
67
68
// general includes
69
#include <stdio.h>
70
#include <math.h>
71
#include <assert.h>
72
73
// missing functions on Windows
74
#ifdef WINDOWS
75
#define snprintf sprintf_s
76
#define strtok_r strtok_s
77
typedef
__int64
FilePos
;
78
#define fseeko _fseeki64
79
#define ftello _ftelli64
80
81
inline
double
log2(
double
x
) {
return
log(
x
) * 1.4426950408889634; }
82
83
typedef
unsigned
int
uint32_t;
84
#define M_E (2.7182818284590452354)
85
#define M_PI (3.141592653589793238)
86
#if !defined(UINT32_MAX)
87
#define UINT32_MAX (0xffffffff)
88
#endif
89
#if !defined(UINT32_MAX)
90
#define UINT32_MIN (0)
91
#endif
92
#else
93
typedef
off_t
FilePos
;
94
#endif
95
96
namespace
SeExpr2
{
97
#ifndef WINDOWS
98
99
class
Timer
{
100
#ifdef __APPLE__
101
typedef
struct
timeval
Time
;
102
#else
103
typedef
timespec
Time
;
104
#endif
105
Time
startTime
,
stopTime
;
106
bool
started
;
107
108
public
:
109
Timer
() :
started
(
false
) {}
110
111
void
start
() {
112
started
=
true
;
113
#ifdef __APPLE__
114
gettimeofday
(&
startTime
, 0);
115
#else
116
clock_gettime
(
CLOCK_MONOTONIC
, &
startTime
);
117
#endif
118
}
119
120
long
elapsedTime
() {
121
assert
(
started
);
122
#ifdef __APPLE__
123
gettimeofday
(&
stopTime
, 0);
124
long
seconds
=
stopTime
.tv_sec -
startTime
.tv_sec;
125
long
useconds
=
stopTime
.tv_usec -
startTime
.tv_usec;
126
long
elapsedTime
= ((
seconds
) * 1000 +
useconds
/ 1000.0) + 0.5;
127
#else
128
clock_gettime
(
CLOCK_MONOTONIC
, &
stopTime
);
129
long
seconds
=
stopTime
.tv_sec -
startTime
.tv_sec;
130
long
nseconds
=
stopTime
.tv_nsec -
startTime
.tv_nsec;
131
long
elapsedTime
= ((
seconds
) * 1000 +
nseconds
/ 1000000.0) + 0.5;
132
#endif
133
return
elapsedTime
;
134
}
135
};
136
#else
// Windows
137
class
Timer {
138
__int64 time();
139
__int64 ticksPerSeconds;
140
__int64
startTime
,
stopTime
;
141
bool
started
;
142
143
public
:
144
Timer
();
145
void
start
();
146
long
elapsedTime
();
147
};
148
#endif
149
150
class
PrintTiming
{
151
public
:
152
PrintTiming
(
const
std::string& s) :
_s
(s) {
_timer
.
start
(); }
153
154
~PrintTiming
() { std::cout <<
_s
.c_str() <<
" ("
<<
_timer
.
elapsedTime
() <<
" ms)"
<< std::endl; }
155
156
157
private
:
158
Timer
_timer
;
159
const
std::string
_s
;
160
};
161
}
162
163
namespace
SeExprInternal2
{
164
165
/*
166
* Mutex/SpinLock classes
167
*/
168
169
#ifdef WINDOWS
170
171
class
_Mutex {
172
public
:
173
_Mutex
();
174
~_Mutex
();
175
void
lock
();
176
void
unlock
();
177
178
private
:
179
void
*
_mutex
;
180
};
181
182
class
_SpinLock {
183
public
:
184
_SpinLock
();
185
~_SpinLock
();
186
void
lock
();
187
void
unlock
();
188
189
private
:
190
void
*
_spinlock
;
191
};
192
193
#else
194
// assume linux/unix/posix
195
class
_Mutex
{
196
public
:
197
_Mutex
() { pthread_mutex_init(&
_mutex
, 0); }
198
~_Mutex
() { pthread_mutex_destroy(&
_mutex
); }
199
void
lock
() { pthread_mutex_lock(&
_mutex
); }
200
void
unlock
() { pthread_mutex_unlock(&
_mutex
); }
201
202
private
:
203
pthread_mutex_t
_mutex
;
204
};
205
206
#ifdef __APPLE__
207
class
_SpinLock
{
208
public
:
209
_SpinLock
() {
_spinlock
= 0; }
210
~_SpinLock
() {}
211
void
lock
() { OSSpinLockLock(&
_spinlock
); }
212
void
unlock
() { OSSpinLockUnlock(&
_spinlock
); }
213
214
private
:
215
OSSpinLock
_spinlock
;
216
};
217
#else
218
class
_SpinLock
{
219
public
:
220
_SpinLock
() { pthread_spin_init(&
_spinlock
, PTHREAD_PROCESS_PRIVATE); }
221
~_SpinLock
() { pthread_spin_destroy(&
_spinlock
); }
222
void
lock
() { pthread_spin_lock(&
_spinlock
); }
223
void
unlock
() { pthread_spin_unlock(&
_spinlock
); }
224
225
private
:
226
pthread_spinlock_t
_spinlock
;
227
};
228
#endif
// __APPLE__
229
#endif
230
}
231
232
#endif
// Platform_h
FilePos
off_t FilePos
Definition
Platform.h:93
SeExpr2::PrintTiming
Definition
Platform.h:150
SeExpr2::PrintTiming::_s
const std::string _s
Definition
Platform.h:159
SeExpr2::PrintTiming::PrintTiming
PrintTiming(const std::string &s)
Definition
Platform.h:152
SeExpr2::PrintTiming::_timer
Timer _timer
Definition
Platform.h:158
SeExpr2::PrintTiming::~PrintTiming
~PrintTiming()
Definition
Platform.h:154
SeExpr2::Timer
Definition
Platform.h:99
SeExpr2::Timer::started
bool started
Definition
Platform.h:106
SeExpr2::Timer::startTime
Time startTime
Definition
Platform.h:105
SeExpr2::Timer::Time
timespec Time
Definition
Platform.h:103
SeExpr2::Timer::Timer
Timer()
Definition
Platform.h:109
SeExpr2::Timer::elapsedTime
long elapsedTime()
Definition
Platform.h:120
SeExpr2::Timer::start
void start()
Definition
Platform.h:111
SeExpr2::Timer::stopTime
Time stopTime
Definition
Platform.h:105
SeExpr2::Vec
Definition
Vec.h:98
SeExprInternal2::_Mutex
Definition
Platform.h:195
SeExprInternal2::_Mutex::unlock
void unlock()
Definition
Platform.h:200
SeExprInternal2::_Mutex::lock
void lock()
Definition
Platform.h:199
SeExprInternal2::_Mutex::~_Mutex
~_Mutex()
Definition
Platform.h:198
SeExprInternal2::_Mutex::_mutex
pthread_mutex_t _mutex
Definition
Platform.h:203
SeExprInternal2::_Mutex::_Mutex
_Mutex()
Definition
Platform.h:197
SeExprInternal2::_SpinLock
Definition
Platform.h:218
SeExprInternal2::_SpinLock::unlock
void unlock()
Definition
Platform.h:223
SeExprInternal2::_SpinLock::_spinlock
pthread_spinlock_t _spinlock
Definition
Platform.h:226
SeExprInternal2::_SpinLock::~_SpinLock
~_SpinLock()
Definition
Platform.h:221
SeExprInternal2::_SpinLock::lock
void lock()
Definition
Platform.h:222
SeExprInternal2::_SpinLock::_SpinLock
_SpinLock()
Definition
Platform.h:220
SeExpr2
Definition
Context.h:22
SeExprInternal2
Definition
Mutex.h:25
x
</pre >< h3 > A simple variable reference</h3 > This is not a very interesting subclass of expression until we add some additional variables Variables on some applications may be very dynamic In this we only need x
Definition
tutorial.txt:108
Generated by
1.9.8