| /* |
| 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 |