along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#if !defined(LOCK_H_INCLUDED)
-#define LOCK_H_INCLUDED
+#if !defined(PLATFORM_H_INCLUDED)
+#define PLATFORM_H_INCLUDED
-#if !defined(_WIN32) && !defined(_WIN64)
+#if defined(_MSC_VER)
-# include <pthread.h>
+// Disable some silly and noisy warning from MSVC compiler
+#pragma warning(disable: 4127) // Conditional expression is constant
+#pragma warning(disable: 4146) // Unary minus operator applied to unsigned type
+#pragma warning(disable: 4800) // Forcing value to bool 'true' or 'false'
+#pragma warning(disable: 4996) // Function _ftime() may be unsafe
+
+// MSVC does not support <inttypes.h>
+typedef signed __int8 int8_t;
+typedef unsigned __int8 uint8_t;
+typedef signed __int16 int16_t;
+typedef unsigned __int16 uint16_t;
+typedef signed __int32 int32_t;
+typedef unsigned __int32 uint32_t;
+typedef signed __int64 int64_t;
+typedef unsigned __int64 uint64_t;
+
+#else
+# include <inttypes.h>
+#endif
+
+#if !defined(_WIN32) && !defined(_WIN64) // Linux - Unix
+# include <sys/time.h>
+typedef timeval sys_time_t;
+
+inline void system_time(sys_time_t* t) { gettimeofday(t, NULL); }
+inline uint64_t time_to_msec(const sys_time_t& t) { return t.tv_sec * 1000LL + t.tv_usec / 1000; }
+
+# include <pthread.h>
typedef pthread_mutex_t Lock;
typedef pthread_cond_t WaitCondition;
typedef pthread_t ThreadHandle;
# define thread_create(x,f,id) !pthread_create(&(x),NULL,(start_fn)f,&(id))
# define thread_join(x) pthread_join(x, NULL)
-#else
+#else // Windows and MinGW
+
+# include <sys/timeb.h>
+typedef _timeb sys_time_t;
+
+inline void system_time(sys_time_t* t) { _ftime(t); }
+inline uint64_t time_to_msec(const sys_time_t& t) { return t.time * 1000LL + t.millitm; }
#if !defined(NOMINMAX)
# define NOMINMAX // disable macros min() and max()
#endif
-#endif // !defined(LOCK_H_INCLUDED)
+#endif // !defined(PLATFORM_H_INCLUDED)