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