/*
Minetest
-Copyright (C) 2010 celeron55, Perttu Ahola <celeron55@gmail.com>
+Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
#include "irrlichttypes.h" // u32
#include "debug.h"
#include "constants.h"
+#include "gettime.h"
+#include "threads.h"
#ifdef _MSC_VER
#define SWPRINTF_CHARSTRING L"%S"
//#define ALIGNOF(type) offsetof (alignment_trick<type>, member)
#ifdef _WIN32
+ #ifndef _WIN32_WINNT
+ #define _WIN32_WINNT 0x0501
+ #endif
#include <windows.h>
#define sleep_ms(x) Sleep(x)
#include <unistd.h>
#include <stdint.h> //for uintptr_t
+ #if (defined(linux) || defined(__linux)) && !defined(_GNU_SOURCE)
+ #define _GNU_SOURCE
+ #endif
+
+ #include <sched.h>
+
+ #ifdef __FreeBSD__
+ #include <pthread_np.h>
+ typedef cpuset_t cpu_set_t;
+ #elif defined(__sun) || defined(sun)
+ #include <sys/types.h>
+ #include <sys/processor.h>
+ #elif defined(_AIX)
+ #include <sys/processor.h>
+ #elif __APPLE__
+ #include <mach/mach_init.h>
+ #include <mach/thread_policy.h>
+ #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 THREAD_PRIORITY_ABOVE_NORMAL 3
+ #define THREAD_PRIORITY_HIGHEST 4
#endif
#ifdef _MSC_VER
*/
void initializePaths();
+/*
+ Get number of online processors in the system.
+*/
+int getNumberOfProcessors();
+
+/*
+ Set a thread's affinity to a particular processor.
+*/
+bool threadBindToProcessor(threadid_t tid, int pnumber);
+
+/*
+ Set a thread's priority.
+*/
+bool threadSetPriority(threadid_t tid, int prio);
+
+/*
+ Return system information
+ e.g. "Linux/3.12.7 x86_64"
+*/
+std::string get_sysinfo();
+
/*
Resolution is 10-20ms.
Remember to check for overflows.
Overflow can occur at any value higher than 10000000.
*/
#ifdef _WIN32 // Windows
+#ifndef _WIN32_WINNT
+ #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;
+ QueryPerformanceFrequency(&freq);
+ QueryPerformanceCounter(&t);
+ return (double)(t.QuadPart) / ((double)(freq.QuadPart) / 1000000.0);
+ }
+
+ inline u32 getTimeNs()
+ {
+ LARGE_INTEGER freq, t;
+ QueryPerformanceFrequency(&freq);
+ QueryPerformanceCounter(&t);
+ return (double)(t.QuadPart) / ((double)(freq.QuadPart) / 1000000000.0);
+ }
+
#else // Posix
#include <sys/time.h>
+ #include <time.h>
+
+ 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;
+ clock_gettime(CLOCK_REALTIME, &ts);
+ return ts.tv_sec * 1000000000 + ts.tv_nsec;
+ }
+
/*#include <sys/timeb.h>
inline u32 getTimeMs()
{
}*/
#endif
+inline u32 getTime(TimePrecision prec)
+{
+ switch (prec) {
+ case PRECISION_SECONDS:
+ return getTimeS();
+ case PRECISION_MILLI:
+ return getTimeMs();
+ case PRECISION_MICRO:
+ return getTimeUs();
+ case PRECISION_NANO:
+ return getTimeNs();
+ }
+ return 0;
+}
+
+
} // namespace porting
#endif // PORTING_HEADER