Support optional API profiling.

This commit is contained in:
Jeffrey Townsend
2016-09-19 20:12:44 +00:00
parent 6b5c4c1c33
commit 80c90ac3a4
4 changed files with 132 additions and 53 deletions

View File

@@ -84,6 +84,9 @@ cdefs: &cdefs
- ONLP_CONFIG_INCLUDE_THERMAL_THRESHOLDS:
doc: "Include thermal threshold reporting."
default: 0
- ONLP_CONFIG_INCLUDE_API_PROFILING:
doc: "Include API timing profiles."
default: 0
# Error codes
onlp_status: &onlp_status

View File

@@ -244,6 +244,16 @@
#define ONLP_CONFIG_INCLUDE_THERMAL_THRESHOLDS 0
#endif
/**
* ONLP_CONFIG_INCLUDE_API_PROFILING
*
* Include API timing profiles. */
#ifndef ONLP_CONFIG_INCLUDE_API_PROFILING
#define ONLP_CONFIG_INCLUDE_API_PROFILING 0
#endif
/**

View File

@@ -129,6 +129,11 @@ onlp_config_settings_t onlp_config_settings[] =
{ __onlp_config_STRINGIFY_NAME(ONLP_CONFIG_INCLUDE_THERMAL_THRESHOLDS), __onlp_config_STRINGIFY_VALUE(ONLP_CONFIG_INCLUDE_THERMAL_THRESHOLDS) },
#else
{ ONLP_CONFIG_INCLUDE_THERMAL_THRESHOLDS(__onlp_config_STRINGIFY_NAME), "__undefined__" },
#endif
#ifdef ONLP_CONFIG_INCLUDE_API_PROFILING
{ __onlp_config_STRINGIFY_NAME(ONLP_CONFIG_INCLUDE_API_PROFILING), __onlp_config_STRINGIFY_VALUE(ONLP_CONFIG_INCLUDE_API_PROFILING) },
#else
{ ONLP_CONFIG_INCLUDE_API_PROFILING(__onlp_config_STRINGIFY_NAME), "__undefined__" },
#endif
{ NULL, NULL }
};

View File

@@ -1,21 +1,21 @@
/************************************************************
* <bsn.cl fy=2014 v=onl>
*
* Copyright 2014, 2015 Big Switch Networks, Inc.
*
*
* Copyright 2014, 2015 Big Switch Networks, Inc.
*
* Licensed under the Eclipse Public License, Version 1.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.eclipse.org/legal/epl-v10.html
*
*
* 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.
*
*
* </bsn.cl>
************************************************************
*
@@ -64,109 +64,170 @@ void onlp_api_unlock(void);
* ONLP API entry points.
*
***************************************************************************/
#include <inttypes.h>
#include <AIM/aim_time.h>
#include "onlp_log.h"
#define ONLP_LOCKED_API_NAME(_name) _name##_locked__
#define ONLP_LOCKED_API0(_name) \
int _name (void) \
{ \
ONLP_API_LOCK(#_name); \
int _rv = ONLP_LOCKED_API_NAME(_name)(); \
ONLP_API_UNLOCK(); \
return _rv; \
#if ONLP_CONFIG_INCLUDE_API_PROFILING == 1
#define ONLP_API_T0(_name) \
uint64_t t0, t1, t2; t0 = aim_time_monotonic()
#define ONLP_API_T1(_name) \
t1 = aim_time_monotonic();
#define ONLP_API_T2(_name) \
do { \
t2 = aim_time_monotonic(); \
AIM_LOG_MSG("API '%s' : (total=%"PRId64", ltime=%"PRId64" ftime=%"PRId64")", #_name, t2-t0, t1-t0, t2-t1); \
} while(0)
#else
#define ONLP_API_T0(_name)
#define ONLP_API_T1(_name)
#define ONLP_API_T2(_name)
#endif
#define ONLP_LOCKED_API0(_name) \
int _name (void) \
{ \
ONLP_API_T0(_name); \
ONLP_API_LOCK(#_name); \
ONLP_API_T1(_name); \
int _rv = ONLP_LOCKED_API_NAME(_name)(); \
ONLP_API_UNLOCK(); \
ONLP_API_T2(_name); \
return _rv; \
}
#define ONLP_LOCKED_API1(_name, _t, _v) \
int _name (_t _v) \
{ \
ONLP_API_LOCK(#_name); \
int _rv = ONLP_LOCKED_API_NAME(_name)(_v); \
ONLP_API_UNLOCK(); \
return _rv; \
#define ONLP_LOCKED_API1(_name, _t, _v) \
int _name (_t _v) \
{ \
ONLP_API_T0(_name); \
ONLP_API_LOCK(#_name); \
ONLP_API_T1(_name); \
int _rv = ONLP_LOCKED_API_NAME(_name)(_v); \
ONLP_API_UNLOCK(); \
ONLP_API_T2(_name); \
return _rv; \
}
#define ONLP_LOCKED_API2(_name, _t1, _v1, _t2, _v2) \
int _name (_t1 _v1, _t2 _v2) \
{ \
ONLP_API_LOCK(#_name); \
int _rv = ONLP_LOCKED_API_NAME(_name) (_v1, _v2); \
ONLP_API_UNLOCK(); \
return _rv; \
#define ONLP_LOCKED_API2(_name, _t1, _v1, _t2, _v2) \
int _name (_t1 _v1, _t2 _v2) \
{ \
ONLP_API_T0(_name); \
ONLP_API_LOCK(#_name); \
ONLP_API_T1(_name); \
int _rv = ONLP_LOCKED_API_NAME(_name) (_v1, _v2); \
ONLP_API_UNLOCK(); \
ONLP_API_T2(_name); \
return _rv; \
}
#define ONLP_LOCKED_API3(_name, _t1, _v1, _t2, _v2, _t3, _v3) \
int _name (_t1 _v1, _t2 _v2, _t3 _v3) \
{ \
ONLP_API_LOCK(#_name); \
ONLP_API_T0(_name); \
ONLP_API_LOCK(#_name); \
ONLP_API_T1(_name); \
int _rv = ONLP_LOCKED_API_NAME(_name) (_v1, _v2, _v3); \
ONLP_API_UNLOCK(); \
ONLP_API_T2(_name); \
return _rv; \
}
#define ONLP_LOCKED_API4(_name, _t1, _v1, _t2, _v2, _t3, _v3, _t4, _v4) \
int _name (_t1 _v1, _t2 _v2, _t3 _v3, _t4 _v4) \
{ \
ONLP_API_LOCK(#_name); \
ONLP_API_T0(_name); \
ONLP_API_LOCK(#_name); \
ONLP_API_T1(_name); \
int _rv = ONLP_LOCKED_API_NAME(_name) (_v1, _v2, _v3, _v4); \
ONLP_API_UNLOCK(); \
ONLP_API_T2(_name); \
return _rv; \
}
#define ONLP_LOCKED_API5(_name, _t1, _v1, _t2, _v2, _t3, _v3, _t4, _v4, _t5, _v5) \
int _name (_t1 _v1, _t2 _v2, _t3 _v3, _t4 _v4, _t5 _v5) \
{ \
ONLP_API_LOCK(#_name); \
ONLP_API_T0(_name); \
ONLP_API_LOCK(#_name); \
ONLP_API_T1(_name); \
int _rv = ONLP_LOCKED_API_NAME(_name) (_v1, _v2, _v3, _v4, _v5); \
ONLP_API_UNLOCK(); \
ONLP_API_T2(_name); \
return _rv; \
}
#define ONLP_LOCKED_VAPI0(_name) \
void _name (void) \
{ \
ONLP_API_LOCK(#_name); \
ONLP_LOCKED_API_NAME(_name)(); \
ONLP_API_UNLOCK(); \
}
#define ONLP_LOCKED_VAPI1(_name, _t, _v) \
void _name (_t _v) \
{ \
ONLP_API_LOCK(#_name); \
ONLP_LOCKED_API_NAME(_name)(_v); \
ONLP_API_UNLOCK(); \
}
#define ONLP_LOCKED_VAPI2(_name, _t1, _v1, _t2, _v2) \
void _name (_t1 _v1, _t2 _v2) \
#define ONLP_LOCKED_VAPI0(_name) \
void _name (void) \
{ \
ONLP_API_LOCK(#_name); \
ONLP_LOCKED_API_NAME(_name) (_v1, _v2); \
ONLP_API_T0(_name); \
ONLP_API_LOCK(#_name); \
ONLP_API_T1(_name); \
ONLP_LOCKED_API_NAME(_name)(); \
ONLP_API_UNLOCK(); \
ONLP_API_T2(_name); \
}
#define ONLP_LOCKED_VAPI1(_name, _t, _v) \
void _name (_t _v) \
{ \
ONLP_API_T0(_name); \
ONLP_API_LOCK(#_name); \
ONLP_API_T1(_name); \
ONLP_LOCKED_API_NAME(_name)(_v); \
ONLP_API_UNLOCK(); \
ONLP_API_T2(_name); \
}
#define ONLP_LOCKED_VAPI2(_name, _t1, _v1, _t2, _v2) \
void _name (_t1 _v1, _t2 _v2) \
{ \
ONLP_API_T0(_name); \
ONLP_API_LOCK(#_name); \
ONLP_API_T1(_name); \
ONLP_LOCKED_API_NAME(_name) (_v1, _v2); \
ONLP_API_UNLOCK(); \
ONLP_API_T2(_name); \
}
#define ONLP_LOCKED_VAPI3(_name, _t1, _v1, _t2, _v2, _t3, _v3) \
void _name (_t1 _v1, _t2 _v2, _t3 _v3) \
{ \
ONLP_API_LOCK(#_name); \
ONLP_API_T0(_name); \
ONLP_API_LOCK(#_name); \
ONLP_API_T1(_name); \
ONLP_LOCKED_API_NAME(_name) (_v1, _v2, _v3); \
ONLP_API_UNLOCK(); \
ONLP_API_T2_(name); \
}
#define ONLP_LOCKED_VAPI4(_name, _t1, _v1, _t2, _v2, _t3, _v3, _t4, _v4) \
void _name (_t1 _v1, _t2 _v2, _t3 _v3, _t4 _v4) \
{ \
ONLP_API_LOCK(#_name); \
ONLP_API_T0(_name); \
ONLP_API_LOCK(#_name); \
ONLP_API_T1(_name); \
ONLP_LOCKED_API_NAME(_name) (_v1, _v2, _v3, _v4); \
ONLP_API_UNLOCK(); \
ONLP_API_T2(_name); \
}
#define ONLP_LOCKED_VAPI5(_name, _t1, _v1, _t2, _v2, _t3, _v3, _t4, _v4, _t5, _v5) \
void _name (_t1 _v1, _t2 _v2, _t3 _v3, _t4 _v4, _t5 _v5) \
{ \
ONLP_API_LOCK(#_name); \
ONLP_API_T0(_name); \
ONLP_API_LOCK(#_name); \
ONLP_API_T1(_name); \
ONLP_LOCKED_API_NAME(_name) (_v1, _v2, _v3, _v4, _v5); \
ONLP_API_UNLOCK(); \
ONLP_API_T2(_name); \
}