SeExpr

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
SeExpr2::Timer::startTime
Time startTime
Definition: Platform.h:105
SeExpr2::PrintTiming
Definition: Platform.h:150
SeExpr2::Timer::start
void start()
Definition: Platform.h:111
SeExprInternal2::_Mutex::unlock
void unlock()
Definition: Platform.h:200
SeExpr2
Definition: Context.h:22
SeExprInternal2::_Mutex::_mutex
pthread_mutex_t _mutex
Definition: Platform.h:203
SeExpr2::PrintTiming::_s
const std::string _s
Definition: Platform.h:159
SeExpr2::Timer::stopTime
Time stopTime
Definition: Platform.h:105
SeExpr2::PrintTiming::~PrintTiming
~PrintTiming()
Definition: Platform.h:154
SeExprInternal2::_SpinLock::~_SpinLock
~_SpinLock()
Definition: Platform.h:221
SeExprInternal2::_Mutex::~_Mutex
~_Mutex()
Definition: Platform.h:198
SeExprInternal2::_SpinLock
Definition: Platform.h:218
SeExpr2::PrintTiming::_timer
Timer _timer
Definition: Platform.h:158
SeExpr2::Timer::Timer
Timer()
Definition: Platform.h:109
SeExprInternal2::_Mutex
Definition: Platform.h:195
FilePos
off_t FilePos
Definition: Platform.h:93
SeExpr2::Timer::Time
timespec Time
Definition: Platform.h:103
SeExpr2::Timer::elapsedTime
long elapsedTime()
Definition: Platform.h:120
SeExpr2::PrintTiming::PrintTiming
PrintTiming(const std::string &s)
Definition: Platform.h:152
SeExprInternal2::_SpinLock::lock
void lock()
Definition: Platform.h:222
SeExprInternal2::_SpinLock::_SpinLock
_SpinLock()
Definition: Platform.h:220
SeExprInternal2
Definition: Mutex.h:25
SeExpr2::Timer
Definition: Platform.h:99
SeExprInternal2::_SpinLock::unlock
void unlock()
Definition: Platform.h:223
SeExprInternal2::_Mutex::_Mutex
_Mutex()
Definition: Platform.h:197
SeExprInternal2::_SpinLock::_spinlock
pthread_spinlock_t _spinlock
Definition: Platform.h:226
SeExpr2::Timer::started
bool started
Definition: Platform.h:106
SeExprInternal2::_Mutex::lock
void lock()
Definition: Platform.h:199
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