|  | @@ -41,12 +41,34 @@
 | 
	
		
			
				|  |  |  #include <sys/timeb.h>
 | 
	
		
			
				|  |  |  #include <windows.h>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -gpr_timespec gpr_now(void) {
 | 
	
		
			
				|  |  | +static LARGE_INTEGER g_start_time;
 | 
	
		
			
				|  |  | +static double g_time_scale;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +void gpr_time_init(void) {
 | 
	
		
			
				|  |  | +  LARGE_INTEGER frequency;
 | 
	
		
			
				|  |  | +  QueryPerformanceFrequency(&frequency);
 | 
	
		
			
				|  |  | +  QueryPerformanceCounter(&g_start_time);
 | 
	
		
			
				|  |  | +  g_time_scale = 1.0 / frequency.QuadPart;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +gpr_timespec gpr_now(gpr_clock_type clock) {
 | 
	
		
			
				|  |  |    gpr_timespec now_tv;
 | 
	
		
			
				|  |  |    struct _timeb now_tb;
 | 
	
		
			
				|  |  | -  _ftime_s(&now_tb);
 | 
	
		
			
				|  |  | -  now_tv.tv_sec = now_tb.time;
 | 
	
		
			
				|  |  | -  now_tv.tv_nsec = now_tb.millitm * 1000000;
 | 
	
		
			
				|  |  | +  LARGE_INTEGER timestamp;
 | 
	
		
			
				|  |  | +  double now_dbl;
 | 
	
		
			
				|  |  | +  switch (clock) {
 | 
	
		
			
				|  |  | +    case GPR_CLOCK_REALTIME:
 | 
	
		
			
				|  |  | +	    _ftime_s(&now_tb);
 | 
	
		
			
				|  |  | +	    now_tv.tv_sec = now_tb.time;
 | 
	
		
			
				|  |  | +	    now_tv.tv_nsec = now_tb.millitm * 1000000;
 | 
	
		
			
				|  |  | +	    break;
 | 
	
		
			
				|  |  | +	  case GPR_CLOCK_MONOTONIC:
 | 
	
		
			
				|  |  | +	    QueryPerformanceCounter(×tamp);
 | 
	
		
			
				|  |  | +      now_dbl = (timestamp.QuadPart - g_start_time.QuadPart) * g_time_scale;
 | 
	
		
			
				|  |  | +      now_tv.tv_sec = (time_t)now_dbl;
 | 
	
		
			
				|  |  | +      now_tv.tv_nsec = (int)((now_dbl - (double)now_tv.tv_sec) * 1e9);
 | 
	
		
			
				|  |  | +      break;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  |    return now_tv;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 |