| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| #include <thrift/windows/GetTimeOfDay.h> |
| #include <thrift/thrift-config.h> |
| |
| // win32 |
| #if defined(__MINGW32__) |
| #include <sys/time.h> |
| #endif |
| |
| #if !defined(__MINGW32__) |
| struct timezone { |
| int tz_minuteswest; /* minutes W of Greenwich */ |
| int tz_dsttime; /* type of dst correction */ |
| }; |
| #endif |
| |
| #if defined(__MINGW32__) |
| int thrift_gettimeofday(struct timeval* tv, struct timezone* tz) { |
| return gettimeofday(tv,tz); |
| } |
| #else |
| #define WIN32_LEAN_AND_MEAN |
| #include <Winsock2.h> |
| #include <cstdint> |
| #include <sstream> |
| #include <thrift/transport/TTransportException.h> |
| |
| // This code started from a "FREE implementation" posted to Stack Overflow at: |
| // https://stackoverflow.com/questions/10905892/equivalent-of-gettimeday-for-windows |
| // added: assert |
| // added: error handling |
| // added: C++ style casts |
| int thrift_gettimeofday(struct timeval * tp, struct timezone * tzp) |
| { |
| // We don't fill it in so prove nobody is looking for the data |
| assert(tzp == nullptr); |
| |
| // Note: some broken versions only have 8 trailing zero's, the correct epoch has 9 trailing zero's |
| // This magic number is the number of 100 nanosecond intervals since January 1, 1601 (UTC) |
| // until 00:00:00 January 1, 1970 |
| static const uint64_t EPOCH = static_cast<uint64_t>(116444736000000000ULL); |
| |
| SYSTEMTIME system_time; |
| FILETIME file_time; |
| uint64_t time; |
| |
| GetSystemTime( &system_time ); |
| if (!SystemTimeToFileTime( &system_time, &file_time )) { |
| DWORD lastError = GetLastError(); |
| std::stringstream ss; |
| ss << "SystemTimeToFileTime failed: 0x" << std::hex << lastError; |
| using apache::thrift::transport::TTransportException; |
| throw TTransportException(TTransportException::INTERNAL_ERROR, ss.str()); |
| } |
| time = static_cast<uint64_t>(file_time.dwLowDateTime ) ; |
| time += static_cast<uint64_t>(file_time.dwHighDateTime) << 32; |
| |
| tp->tv_sec = static_cast<long>((time - EPOCH) / 10000000L); |
| tp->tv_usec = static_cast<long>(system_time.wMilliseconds * 1000); |
| return 0; |
| } |
| #endif |
| |
| int thrift_sleep(unsigned int seconds) { |
| ::Sleep(seconds * 1000); |
| return 0; |
| } |
| int thrift_usleep(unsigned int microseconds) { |
| unsigned int milliseconds = (microseconds + 999) / 1000; |
| ::Sleep(milliseconds); |
| return 0; |
| } |
| |
| char* thrift_ctime_r(const time_t* _clock, char* _buf) { |
| strcpy(_buf, ctime(_clock)); |
| return _buf; |
| } |