mirror of
https://github.com/Telecominfraproject/OpenNetworkLinux.git
synced 2025-12-25 17:27:01 +00:00
Support optional API profiling.
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
/**
|
||||
|
||||
@@ -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 }
|
||||
};
|
||||
|
||||
@@ -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); \
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user