#ifdef _WIN32
#include <windows.h>
-
+
#define sleep_ms(x) Sleep(x)
#else
#include <unistd.h>
#include <stdint.h> //for uintptr_t
-
+
#if (defined(linux) || defined(__linux)) && !defined(_GNU_SOURCE)
#define _GNU_SOURCE
#endif
#endif
#define sleep_ms(x) usleep(x*1000)
-
+
#define THREAD_PRIORITY_LOWEST 0
#define THREAD_PRIORITY_BELOW_NORMAL 1
#define THREAD_PRIORITY_NORMAL 2
#define PADDING(x, y) ((ALIGNOF(y) - ((uintptr_t)(x) & (ALIGNOF(y) - 1))) & (ALIGNOF(y) - 1))
+#if defined(__APPLE__)
+ #include <mach-o/dyld.h>
+ #include <CoreFoundation/CoreFoundation.h>
+#endif
+
namespace porting
{
#define _WIN32_WINNT 0x0501
#endif
#include <windows.h>
-
+
inline u32 getTimeS()
{
return GetTickCount() / 1000;
}
-
+
inline u32 getTimeMs()
{
return GetTickCount();
}
-
+
inline u32 getTimeUs()
{
LARGE_INTEGER freq, t;
QueryPerformanceCounter(&t);
return (double)(t.QuadPart) / ((double)(freq.QuadPart) / 1000000.0);
}
-
+
inline u32 getTimeNs()
{
LARGE_INTEGER freq, t;
QueryPerformanceCounter(&t);
return (double)(t.QuadPart) / ((double)(freq.QuadPart) / 1000000000.0);
}
-
+
#else // Posix
- #include <sys/time.h>
- #include <time.h>
-
+#include <sys/time.h>
+#include <time.h>
+#ifdef __MACH__
+#include <mach/clock.h>
+#include <mach/mach.h>
+#endif
+
inline u32 getTimeS()
{
struct timeval tv;
gettimeofday(&tv, NULL);
return tv.tv_sec;
}
-
+
inline u32 getTimeMs()
{
struct timeval tv;
gettimeofday(&tv, NULL);
return tv.tv_sec * 1000 + tv.tv_usec / 1000;
}
-
+
inline u32 getTimeUs()
{
struct timeval tv;
gettimeofday(&tv, NULL);
return tv.tv_sec * 1000000 + tv.tv_usec;
}
-
+
inline u32 getTimeNs()
{
struct timespec ts;
+ // from http://stackoverflow.com/questions/5167269/clock-gettime-alternative-in-mac-os-x
+#ifdef __MACH__ // OS X does not have clock_gettime, use clock_get_time
+ clock_serv_t cclock;
+ mach_timespec_t mts;
+ host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock);
+ clock_get_time(cclock, &mts);
+ mach_port_deallocate(mach_task_self(), cclock);
+ ts.tv_sec = mts.tv_sec;
+ ts.tv_nsec = mts.tv_nsec;
+#else
clock_gettime(CLOCK_REALTIME, &ts);
+#endif
return ts.tv_sec * 1000000000 + ts.tv_nsec;
}
-
+
/*#include <sys/timeb.h>
inline u32 getTimeMs()
{
return 0;
}
+/**
+ * Delta calculation function taking two 32bit arguments.
+ * @param old_time_ms old time for delta calculation (order is relevant!)
+ * @param new_time_ms new time for delta calculation (order is relevant!)
+ * @return positive 32bit delta value
+ */
+inline u32 getDeltaMs(u32 old_time_ms, u32 new_time_ms)
+{
+ if (new_time_ms >= old_time_ms) {
+ return (new_time_ms - old_time_ms);
+ } else {
+ return (old_time_ms - new_time_ms);
+ }
+}
+
#if defined(linux) || defined(__linux)
#include <sys/prctl.h>
*/
prctl(PR_SET_NAME, name);
}
-#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
+#elif defined(__FreeBSD__) || defined(__OpenBSD__)
#include <pthread.h>
+ #include <pthread_np.h>
inline void setThreadName(const char *name) {
pthread_set_name_np(pthread_self(), name);
}
+#elif defined(__NetBSD__)
+ #include <pthread.h>
+
+ inline void setThreadName(const char *name) {
+ pthread_setname_np(pthread_self(), name);
+ }
#elif defined(_MSC_VER)
typedef struct tagTHREADNAME_INFO {
DWORD dwType; // must be 0x1000
} // namespace porting
+#ifdef __ANDROID__
+#include "porting_android.h"
+#endif
+
#endif // PORTING_HEADER