]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/jaegertracing/thrift/lib/cpp/src/thrift/windows/GetTimeOfDay.cpp
update source to Ceph Pacific 16.2.2
[ceph.git] / ceph / src / jaegertracing / thrift / lib / cpp / src / thrift / windows / GetTimeOfDay.cpp
diff --git a/ceph/src/jaegertracing/thrift/lib/cpp/src/thrift/windows/GetTimeOfDay.cpp b/ceph/src/jaegertracing/thrift/lib/cpp/src/thrift/windows/GetTimeOfDay.cpp
new file mode 100644 (file)
index 0000000..0a0292c
--- /dev/null
@@ -0,0 +1,95 @@
+/*
+ * 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 == NULL);
+
+    // 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;
+}