| /* | |
| Copyright (c) 2014-2016 Intel Corporation. All Rights Reserved. | |
| Redistribution and use in source and binary forms, with or without | |
| modification, are permitted provided that the following conditions | |
| are met: | |
| * Redistributions of source code must retain the above copyright | |
| notice, this list of conditions and the following disclaimer. | |
| * Redistributions in binary form must reproduce the above copyright | |
| notice, this list of conditions and the following disclaimer in the | |
| documentation and/or other materials provided with the distribution. | |
| * Neither the name of Intel Corporation nor the names of its | |
| contributors may be used to endorse or promote products derived | |
| from this software without specific prior written permission. | |
| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |
| HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
| */ | |
| #ifndef OFFLOAD_TIMER_H_INCLUDED | |
| #define OFFLOAD_TIMER_H_INCLUDED | |
| #include <stdio.h> | |
| #include <stdarg.h> | |
| #include <stdint.h> | |
| #include "liboffload_error_codes.h" | |
| DLL_LOCAL extern int timer_enabled; | |
| #ifdef TIMING_SUPPORT | |
| struct OffloadTargetTimerData { | |
| uint64_t frequency; | |
| struct { | |
| uint64_t start; | |
| uint64_t total; | |
| } phases[c_offload_target_max_phase]; | |
| }; | |
| struct OffloadHostTimerData { | |
| // source file name and line number | |
| const char* file; | |
| int line; | |
| // host timer data | |
| struct { | |
| uint64_t start; | |
| uint64_t total; | |
| } phases[c_offload_host_max_phase]; | |
| uint64_t sent_bytes; | |
| uint64_t received_bytes; | |
| int card_number; | |
| int offload_number; | |
| // target timer data | |
| OffloadTargetTimerData target; | |
| // next element | |
| OffloadHostTimerData *next; | |
| }; | |
| #if HOST_LIBRARY | |
| DLL_LOCAL extern int offload_report_level; | |
| DLL_LOCAL extern int offload_report_enabled; | |
| #define OFFLOAD_REPORT_1 1 | |
| #define OFFLOAD_REPORT_2 2 | |
| #define OFFLOAD_REPORT_3 3 | |
| #define OFFLOAD_REPORT_ON 1 | |
| #define OFFLOAD_REPORT_OFF 0 | |
| #define OFFLOAD_TIMER_DATALEN() \ | |
| ((timer_enabled || (offload_report_level && offload_report_enabled)) ? \ | |
| ((1 + c_offload_target_max_phase) * sizeof(uint64_t)) : 0) | |
| #define OFFLOAD_TIMER_START(timer_data, pnode) \ | |
| if (timer_enabled || \ | |
| (offload_report_level && offload_report_enabled)) { \ | |
| offload_timer_start(timer_data, pnode); \ | |
| } | |
| #define OFFLOAD_TIMER_STOP(timer_data, pnode) \ | |
| if (timer_enabled || \ | |
| (offload_report_level && offload_report_enabled)) { \ | |
| offload_timer_stop(timer_data, pnode); \ | |
| } | |
| #define OFFLOAD_TIMER_INIT(file, line) \ | |
| offload_timer_init(file, line); | |
| #define OFFLOAD_TIMER_TARGET_DATA(timer_data, data) \ | |
| if (timer_enabled || \ | |
| (offload_report_level && offload_report_enabled)) { \ | |
| offload_timer_fill_target_data(timer_data, data); \ | |
| } | |
| #define OFFLOAD_TIMER_HOST_SDATA(timer_data, data) \ | |
| if (offload_report_level && offload_report_enabled) { \ | |
| offload_timer_fill_host_sdata(timer_data, data); \ | |
| } | |
| #define OFFLOAD_TIMER_HOST_RDATA(timer_data, data) \ | |
| if (offload_report_level && offload_report_enabled) { \ | |
| offload_timer_fill_host_rdata(timer_data, data); \ | |
| } | |
| #define OFFLOAD_TIMER_HOST_MIC_NUM(timer_data, data) \ | |
| if (offload_report_level && offload_report_enabled) { \ | |
| offload_timer_fill_host_mic_num(timer_data, data); \ | |
| } | |
| extern DLL_LOCAL void offload_timer_start(OffloadHostTimerData *, | |
| OffloadHostPhase t_node); | |
| extern DLL_LOCAL void offload_timer_stop(OffloadHostTimerData *, | |
| OffloadHostPhase t_node); | |
| extern DLL_LOCAL OffloadHostTimerData * offload_timer_init(const char *file, int line); | |
| extern DLL_LOCAL void offload_timer_fill_target_data(OffloadHostTimerData *, | |
| void *data); | |
| extern DLL_LOCAL void offload_timer_fill_host_sdata(OffloadHostTimerData *, | |
| uint64_t sent_bytes); | |
| extern DLL_LOCAL void offload_timer_fill_host_rdata(OffloadHostTimerData *, | |
| uint64_t sent_bytes); | |
| extern DLL_LOCAL void offload_timer_fill_host_mic_num(OffloadHostTimerData *, | |
| int card_number); | |
| // Utility structure for starting/stopping timer | |
| struct OffloadTimer { | |
| OffloadTimer(OffloadHostTimerData *data, OffloadHostPhase phase) : | |
| m_data(data), | |
| m_phase(phase) | |
| { | |
| OFFLOAD_TIMER_START(m_data, m_phase); | |
| } | |
| ~OffloadTimer() | |
| { | |
| OFFLOAD_TIMER_STOP(m_data, m_phase); | |
| } | |
| private: | |
| OffloadHostTimerData* m_data; | |
| OffloadHostPhase m_phase; | |
| }; | |
| #else | |
| #define OFFLOAD_TIMER_DATALEN() \ | |
| ((timer_enabled) ? \ | |
| ((1 + c_offload_target_max_phase) * sizeof(uint64_t)) : 0) | |
| #define OFFLOAD_TIMER_START(pnode) \ | |
| if (timer_enabled) offload_timer_start(pnode); | |
| #define OFFLOAD_TIMER_STOP(pnode) \ | |
| if (timer_enabled) offload_timer_stop(pnode); | |
| #define OFFLOAD_TIMER_INIT() \ | |
| if (timer_enabled) offload_timer_init(); | |
| #define OFFLOAD_TIMER_TARGET_DATA(data) \ | |
| if (timer_enabled) offload_timer_fill_target_data(data); | |
| extern DLL_LOCAL void offload_timer_start(OffloadTargetPhase t_node); | |
| extern DLL_LOCAL void offload_timer_stop(OffloadTargetPhase t_node); | |
| extern DLL_LOCAL void offload_timer_init(void); | |
| extern DLL_LOCAL void offload_timer_fill_target_data(void *data); | |
| #endif // HOST_LIBRARY | |
| #else // TIMING_SUPPORT | |
| #define OFFLOAD_TIMER_START(...) | |
| #define OFFLOAD_TIMER_STOP(...) | |
| #define OFFLOAD_TIMER_INIT(...) | |
| #define OFFLOAD_TIMER_TARGET_DATA(...) | |
| #define OFFLOAD_TIMER_DATALEN(...) (0) | |
| #endif // TIMING_SUPPORT | |
| #endif // OFFLOAD_TIMER_H_INCLUDED |