blob: 74128cca35d94687216923f24ab8904e2c7e4725 [file] [log] [blame]
/*
* 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.
*/
#pragma once
#include <time.h>
#include <arrow/status.h>
#include <glog/logging.h>
#include <chrono>
#include "utils/Exception.h"
#define GLUTEN_EXPAND(x) x
#define GLUTEN_STRINGIFY(x) #x
#define GLUTEN_TOSTRING(x) GLUTEN_STRINGIFY(x)
#define GLUTEN_CONCAT(x, y) x##y
#define TIME_NANO_DIFF(finish, start) (finish.tv_sec - start.tv_sec) * 1000000000 + (finish.tv_nsec - start.tv_nsec)
#define TIME_MICRO_OR_RAISE(time, expr) \
do { \
auto start = std::chrono::steady_clock::now(); \
auto __s = (expr); \
if (!__s.ok()) { \
return __s; \
} \
auto end = std::chrono::steady_clock::now(); \
time += std::chrono::duration_cast<std::chrono::microseconds>(end - start).count(); \
} while (false);
#define TIME_MICRO_OR_THROW(time, expr) \
do { \
auto start = std::chrono::steady_clock::now(); \
auto __s = (expr); \
if (!__s.ok()) { \
throw GlutenException(__s.message()); \
} \
auto end = std::chrono::steady_clock::now(); \
time += std::chrono::duration_cast<std::chrono::microseconds>(end - start).count(); \
} while (false);
#define TIME_NANO(time, expr) \
do { \
auto start = std::chrono::steady_clock::now(); \
(expr); \
auto end = std::chrono::steady_clock::now(); \
time += std::chrono::duration_cast<std::chrono::nanoseconds>(end - start).count(); \
} while (false);
#define TIME_NANO_START(time) auto time##Start = std::chrono::steady_clock::now();
#define TIME_NANO_END(time) \
auto time##End = std::chrono::steady_clock::now(); \
time += std::chrono::duration_cast<std::chrono::nanoseconds>(time##End - time##Start).count();
#define TIME_NANO_OR_RAISE(time, expr) \
do { \
auto start = std::chrono::steady_clock::now(); \
auto __s = (expr); \
if (!__s.ok()) { \
return __s; \
} \
auto end = std::chrono::steady_clock::now(); \
time += std::chrono::duration_cast<std::chrono::nanoseconds>(end - start).count(); \
} while (false);
#define TIME_NANO_OR_THROW(time, expr) \
do { \
auto start = std::chrono::steady_clock::now(); \
auto __s = (expr); \
if (!__s.ok()) { \
throw GlutenException(__s.message()); \
} \
auto end = std::chrono::steady_clock::now(); \
time += std::chrono::duration_cast<std::chrono::nanoseconds>(end - start).count(); \
} while (false);
#define VECTOR_PRINT(v, name) \
std::cout << "[" << name << "]:"; \
for (int i = 0; i < v.size(); i++) { \
if (i != v.size() - 1) \
std::cout << v[i] << ","; \
else \
std::cout << v[i]; \
} \
std::cout << std::endl;
#define TIME_TO_STRING(time) (time > 10000 ? time / 1000 : time) << (time > 10000 ? " ms" : " us")
#define TIME_NANO_TO_STRING(time) \
(time > 1e7 ? time / 1e6 : ((time > 1e4) ? time / 1e3 : time)) << (time > 1e7 ? "ms" : (time > 1e4 ? "us" : "ns"))
#define ROUND_TO_LINE(n, round) (((n) + (round)-1) & ~((round)-1))
#if defined(__GNUC__) || __has_builtin(__builtin_unreachable)
#define GLUTEN_UNREACHABLE() __builtin_unreachable()
#elif defined(_MSC_VER)
#define GLUTEN_UNREACHABLE() __assume(false)
#else
#define GLUTEN_UNREACHABLE() ((void)0)
#endif