[PATCH v2 01/15] service: rework probe and get name to use ids
From: Harry van Haaren <hidden>
Date: 2017-08-21 12:58:27
Subsystem:
library code, the rest · Maintainers:
Andrew Morton, Linus Torvalds
This commit adds a macro to easily validate a service ID, and then lookup the service pointer, or return a user-specified error code. This marco will be heavily used in the following patches as it will be ID based instead of pointer-based. The probe_capability function is reworked to use an integer ID instead of a pointer. Rework the service_get_name() function is updated to use IDs. Unit tests are updated to keep things compiling after each commit. Signed-off-by: Harry van Haaren <redacted> --- lib/librte_eal/common/include/rte_service.h | 5 ++--- lib/librte_eal/common/rte_service.c | 20 +++++++++++++++----- test/test/test_service_cores.c | 7 +++---- 3 files changed, 20 insertions(+), 12 deletions(-)
diff --git a/lib/librte_eal/common/include/rte_service.h b/lib/librte_eal/common/include/rte_service.h
index 7c6f738..bed1a61 100644
--- a/lib/librte_eal/common/include/rte_service.h
+++ b/lib/librte_eal/common/include/rte_service.h@@ -133,7 +133,7 @@ struct rte_service_spec *rte_service_get_by_name(const char *name); * @return A pointer to the name of the service. The returned pointer remains * in ownership of the service, and the application must not free it. */ -const char *rte_service_get_name(const struct rte_service_spec *service); +const char *rte_service_get_name(uint32_t id); /** * @warning
@@ -146,8 +146,7 @@ const char *rte_service_get_name(const struct rte_service_spec *service); * @retval 1 Capability supported by this service instance * @retval 0 Capability not supported by this service instance */ -int32_t rte_service_probe_capability(const struct rte_service_spec *service, - uint32_t capability); +int32_t rte_service_probe_capability(uint32_t id, uint32_t capability); /** * @warning
diff --git a/lib/librte_eal/common/rte_service.c b/lib/librte_eal/common/rte_service.c
index 7efb76d..c969406 100644
--- a/lib/librte_eal/common/rte_service.c
+++ b/lib/librte_eal/common/rte_service.c@@ -144,6 +144,13 @@ service_valid(uint32_t id) return !!(rte_services[id].internal_flags & SERVICE_F_REGISTERED); } +/* validate ID and retrieve service pointer, or return error value */ +#define SERVICE_VALID_GET_OR_ERR_RET(id, service, retval) do { \ + if (id >= RTE_SERVICE_NUM_MAX || !service_valid(id)) \ + return retval; \ + service = &rte_services[id]; \ +} while (0) + /* returns 1 if statistics should be colleced for service * Returns 0 if statistics should not be collected for service */
@@ -207,16 +214,19 @@ struct rte_service_spec *rte_service_get_by_name(const char *name) } const char * -rte_service_get_name(const struct rte_service_spec *service) +rte_service_get_name(uint32_t id) { - return service->name; + struct rte_service_spec_impl *s; + SERVICE_VALID_GET_OR_ERR_RET(id, s, 0); + return s->spec.name; } int32_t -rte_service_probe_capability(const struct rte_service_spec *service, - uint32_t capability) +rte_service_probe_capability(uint32_t id, uint32_t capability) { - return service->capabilities & capability; + struct rte_service_spec_impl *s; + SERVICE_VALID_GET_OR_ERR_RET(id, s, -EINVAL); + return s->spec.capabilities & capability; } int32_t
diff --git a/test/test/test_service_cores.c b/test/test/test_service_cores.c
index 88fac8f..940bc62 100644
--- a/test/test/test_service_cores.c
+++ b/test/test/test_service_cores.c@@ -225,8 +225,8 @@ service_probe_capability(void) "Register of MT SAFE service failed"); /* verify flag is enabled */ - struct rte_service_spec *s = rte_service_get_by_id(0); - int32_t mt = rte_service_probe_capability(s, RTE_SERVICE_CAP_MT_SAFE); + const uint32_t sid = 0; + int32_t mt = rte_service_probe_capability(sid, RTE_SERVICE_CAP_MT_SAFE); TEST_ASSERT_EQUAL(1, mt, "MT SAFE capability flag not set.");
@@ -239,8 +239,7 @@ service_probe_capability(void) "Register of non-MT safe service failed"); /* verify flag is enabled */ - s = rte_service_get_by_id(0); - mt = rte_service_probe_capability(s, RTE_SERVICE_CAP_MT_SAFE); + mt = rte_service_probe_capability(sid, RTE_SERVICE_CAP_MT_SAFE); TEST_ASSERT_EQUAL(0, mt, "MT SAFE cap flag set on non MT SAFE service"); return unregister_all();
--
2.7.4