diff --git a/packages/base/any/onlp/src/onlp/module/auto/onlp.yml b/packages/base/any/onlp/src/onlp/module/auto/onlp.yml
index 537f00b9..daaff3a3 100644
--- a/packages/base/any/onlp/src/onlp/module/auto/onlp.yml
+++ b/packages/base/any/onlp/src/onlp/module/auto/onlp.yml
@@ -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
diff --git a/packages/base/any/onlp/src/onlp/module/inc/onlp/onlp_config.h b/packages/base/any/onlp/src/onlp/module/inc/onlp/onlp_config.h
index 1c7bd70b..c6581f75 100644
--- a/packages/base/any/onlp/src/onlp/module/inc/onlp/onlp_config.h
+++ b/packages/base/any/onlp/src/onlp/module/inc/onlp/onlp_config.h
@@ -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
+
/**
diff --git a/packages/base/any/onlp/src/onlp/module/src/onlp_config.c b/packages/base/any/onlp/src/onlp/module/src/onlp_config.c
index 06942b09..7b90cf44 100644
--- a/packages/base/any/onlp/src/onlp/module/src/onlp_config.c
+++ b/packages/base/any/onlp/src/onlp/module/src/onlp_config.c
@@ -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 }
};
diff --git a/packages/base/any/onlp/src/onlp/module/src/onlp_locks.h b/packages/base/any/onlp/src/onlp/module/src/onlp_locks.h
index dbb0e5e5..0ea6dc13 100644
--- a/packages/base/any/onlp/src/onlp/module/src/onlp_locks.h
+++ b/packages/base/any/onlp/src/onlp/module/src/onlp_locks.h
@@ -1,21 +1,21 @@
/************************************************************
*
- *
- * 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.
- *
+ *
*
************************************************************
*
@@ -64,109 +64,170 @@ void onlp_api_unlock(void);
* ONLP API entry points.
*
***************************************************************************/
+#include
+#include
+#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); \
}