/* * * Copyright 2015 gRPC authors. * * Licensed 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 GRPC_CORE_LIB_PROFILING_TIMERS_H #define GRPC_CORE_LIB_PROFILING_TIMERS_H void gpr_timers_global_init(void); void gpr_timers_global_destroy(void); void gpr_timer_add_mark(const char* tagstr, int important, const char* file, int line); void gpr_timer_begin(const char* tagstr, int important, const char* file, int line); void gpr_timer_end(const char* tagstr, int important, const char* file, int line); void gpr_timers_set_log_filename(const char* filename); void gpr_timer_set_enabled(int enabled); #if !(defined(GRPC_STAP_PROFILER) + defined(GRPC_BASIC_PROFILER) + \ defined(GRPC_CUSTOM_PROFILER)) /* No profiling. No-op all the things. */ #define GPR_TIMER_MARK(tag, important) \ do { \ } while (0) #define GPR_TIMER_SCOPE(tag, important) \ do { \ } while (0) #else /* at least one profiler requested... */ /* ... hopefully only one. */ #if defined(GRPC_STAP_PROFILER) && defined(GRPC_BASIC_PROFILER) #error "GRPC_STAP_PROFILER and GRPC_BASIC_PROFILER are mutually exclusive." #endif #if defined(GRPC_STAP_PROFILER) && defined(GRPC_CUSTOM_PROFILER) #error "GRPC_STAP_PROFILER and GRPC_CUSTOM_PROFILER are mutually exclusive." #endif #if defined(GRPC_CUSTOM_PROFILER) && defined(GRPC_BASIC_PROFILER) #error "GRPC_CUSTOM_PROFILER and GRPC_BASIC_PROFILER are mutually exclusive." #endif /* Generic profiling interface. */ #define GPR_TIMER_MARK(tag, important) \ gpr_timer_add_mark(tag, important, __FILE__, __LINE__); #ifdef GRPC_STAP_PROFILER /* Empty placeholder for now. */ #endif /* GRPC_STAP_PROFILER */ #ifdef GRPC_BASIC_PROFILER /* Empty placeholder for now. */ #endif /* GRPC_BASIC_PROFILER */ namespace grpc { class ProfileScope { public: ProfileScope(const char* desc, bool important, const char* file, int line) : desc_(desc) { gpr_timer_begin(desc_, important ? 1 : 0, file, line); } ~ProfileScope() { gpr_timer_end(desc_, 0, "n/a", 0); } private: const char* const desc_; }; } // namespace grpc #define GPR_TIMER_SCOPE_NAME_INTERNAL(prefix, line) prefix##line #define GPR_TIMER_SCOPE_NAME(prefix, line) \ GPR_TIMER_SCOPE_NAME_INTERNAL(prefix, line) #define GPR_TIMER_SCOPE(tag, important) \ ::grpc::ProfileScope GPR_TIMER_SCOPE_NAME(_profile_scope_, __LINE__)( \ (tag), (important), __FILE__, __LINE__) #endif /* at least one profiler requested. */ #endif /* GRPC_CORE_LIB_PROFILING_TIMERS_H */