You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			145 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C++
		
	
			
		
		
	
	
			145 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C++
		
	
| // ©2013-2014 Cameron Desrochers
 | |
| 
 | |
| #include "systemtime.h"
 | |
| #include <climits>
 | |
| 
 | |
| #if defined(_MSC_VER) && _MSC_VER < 1700
 | |
| #include <intrin.h>
 | |
| #define CompilerMemBar() _ReadWriteBarrier()
 | |
| #else
 | |
| #include <atomic>
 | |
| #define CompilerMemBar() std::atomic_signal_fence(std::memory_order_seq_cst)
 | |
| #endif
 | |
| 
 | |
| #if defined(ST_WINDOWS)
 | |
| 
 | |
| #include <windows.h>
 | |
| 
 | |
| namespace moodycamel
 | |
| {
 | |
| 
 | |
| void sleep(int milliseconds)
 | |
| {
 | |
| 	::Sleep(milliseconds);
 | |
| }
 | |
| 
 | |
| SystemTime getSystemTime()
 | |
| {
 | |
| 	LARGE_INTEGER t;
 | |
| 	CompilerMemBar();
 | |
| 	if (!QueryPerformanceCounter(&t)) {
 | |
| 		return static_cast<SystemTime>(-1);
 | |
| 	}
 | |
| 	CompilerMemBar();
 | |
| 	
 | |
| 	return static_cast<SystemTime>(t.QuadPart);
 | |
| }
 | |
| 
 | |
| double getTimeDelta(SystemTime start)
 | |
| {
 | |
| 	LARGE_INTEGER t;
 | |
| 	CompilerMemBar();
 | |
| 	if (start == static_cast<SystemTime>(-1) || !QueryPerformanceCounter(&t)) {
 | |
| 		return -1;
 | |
| 	}
 | |
| 	CompilerMemBar();
 | |
| 
 | |
| 	auto now = static_cast<SystemTime>(t.QuadPart);
 | |
| 
 | |
| 	LARGE_INTEGER f;
 | |
| 	if (!QueryPerformanceFrequency(&f)) {
 | |
| 		return -1;
 | |
| 	}
 | |
| 
 | |
| #if defined(__GNUC__)
 | |
| #pragma GCC diagnostic push
 | |
| #pragma GCC diagnostic ignored "-Wconversion"
 | |
| #endif
 | |
| 	return static_cast<double>(static_cast<__int64>(now - start)) / f.QuadPart * 1000;
 | |
| #if defined(__GNUC__)
 | |
| #pragma GCC diagnostic pop
 | |
| #endif
 | |
| }
 | |
| 
 | |
| }  // end namespace moodycamel
 | |
| 
 | |
| #elif defined(ST_APPLE)
 | |
| 
 | |
| #include <mach/mach.h>
 | |
| #include <mach/mach_time.h>
 | |
| #include <unistd.h>
 | |
| #include <time.h>
 | |
| 
 | |
| namespace moodycamel
 | |
| {
 | |
| 
 | |
| void sleep(int milliseconds)
 | |
| {
 | |
| 	::usleep(milliseconds * 1000);
 | |
| }
 | |
| 
 | |
| SystemTime getSystemTime()
 | |
| {
 | |
| 	CompilerMemBar();
 | |
| 	std::uint64_t result = mach_absolute_time();
 | |
| 	CompilerMemBar();
 | |
| 	
 | |
| 	return result;
 | |
| }
 | |
| 
 | |
| double getTimeDelta(SystemTime start)
 | |
| {
 | |
| 	CompilerMemBar();
 | |
| 	std::uint64_t end = mach_absolute_time();
 | |
| 	CompilerMemBar();
 | |
| 
 | |
| 	mach_timebase_info_data_t tb = { 0 };
 | |
| 	mach_timebase_info(&tb);
 | |
| 	double toNano = static_cast<double>(tb.numer) / tb.denom;
 | |
| 	
 | |
| 	return static_cast<double>(end - start) * toNano * 0.000001;
 | |
| }
 | |
| 
 | |
| }  // end namespace moodycamel
 | |
| 
 | |
| #elif defined(ST_NIX)
 | |
| 
 | |
| #include <unistd.h>
 | |
| 
 | |
| namespace moodycamel
 | |
| {
 | |
| 
 | |
| void sleep(int milliseconds)
 | |
| {
 | |
| 	::usleep(milliseconds * 1000);
 | |
| }
 | |
| 
 | |
| SystemTime getSystemTime()
 | |
| {
 | |
| 	timespec t;
 | |
| 	CompilerMemBar();
 | |
| 	if (clock_gettime(CLOCK_MONOTONIC_RAW, &t) != 0) {
 | |
| 		t.tv_sec = (time_t)-1;
 | |
| 		t.tv_nsec = -1;
 | |
| 	}
 | |
| 	CompilerMemBar();
 | |
| 	
 | |
| 	return t;
 | |
| }
 | |
| 
 | |
| double getTimeDelta(SystemTime start)
 | |
| {
 | |
| 	timespec t;
 | |
| 	CompilerMemBar();
 | |
| 	if ((start.tv_sec == (time_t)-1 && start.tv_nsec == -1) || clock_gettime(CLOCK_MONOTONIC_RAW, &t) != 0) {
 | |
| 		return -1;
 | |
| 	}
 | |
| 	CompilerMemBar();
 | |
| 
 | |
| 	return static_cast<double>(static_cast<long>(t.tv_sec) - static_cast<long>(start.tv_sec)) * 1000 + double(t.tv_nsec - start.tv_nsec) / 1000000;
 | |
| }
 | |
| 
 | |
| }  // end namespace moodycamel
 | |
| 
 | |
| #endif
 |