| // 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. |
| |
| |
| #ifndef IMPALA_UTIL_DEBUG_COUNTERS_H |
| #define IMPALA_UTIL_DEBUG_COUNTERS_H |
| |
| #include "util/runtime-profile.h" |
| |
| #define ENABLE_DEBUG_COUNTERS 1 |
| |
| namespace impala { |
| |
| /// Runtime counters have a two-phase lifecycle - creation and update. This is not |
| /// convenient for debugging where we would like to add and remove counters with a minimum |
| /// of boilerplate. This header adds a global debug runtime profile, and macros to |
| /// update-or-create counters in one line of code. Counters created this way are not |
| /// intended to remain in the code; they are a tool for identifying hotspots without having |
| /// to run a full profiler. |
| /// The AddCounter call adds some more overhead to each macro, and therefore they |
| /// should not be used where minimal impact on performance is needed. |
| class DebugRuntimeProfile { |
| public: |
| static RuntimeProfile& profile() { |
| static RuntimeProfile profile(new ObjectPool(), "DebugProfile"); |
| return profile; |
| } |
| }; |
| |
| #if ENABLE_DEBUG_COUNTERS |
| |
| #define DEBUG_SCOPED_TIMER(counter_name) \ |
| COUNTER_SCOPED_TIMER(DebugRuntimeProfile::profile().AddCounter(counter_name, \ |
| TUnit::CPU_TICKS)) |
| |
| #define DEBUG_COUNTER_ADD(counter_name, v) \ |
| COUNTER_ADD(DebugRuntimeProfile::profile().AddCounter(counter_name, \ |
| TUnit::UNIT), v) |
| |
| #define DEBUG_COUNTER_SET(counter_name, v) \ |
| COUNTER_SET(DebugRuntimeProfile::profile().AddCounter(counter_name, \ |
| TUnit::UNIT), v) |
| |
| #define PRETTY_PRINT_DEBUG_COUNTERS(ostream_ptr) \ |
| DebugRuntimeProfile::profile().PrettyPrint(ostream_ptr) |
| |
| #else |
| |
| #define DEBUG_SCOPED_TIMER(counter_name) |
| #define DEBUG_COUNTER_ADD(counter_name, v) |
| #define DEBUG_COUNTER_SET(counter_name, v) |
| #define PRETTY_PRINT_DEBUG_COUNTERS(ostream_ptr) |
| |
| #endif // ENABLE_DEBUG_COUNTERS |
| |
| } |
| |
| #endif // IMPALA_UTIL_DEBUG_COUNTERS_H |