blob: d1efc9bb50d27ae5034812e30d9be95df08d299a [file] [log] [blame]
Julian Hall8cff2b82020-11-23 18:12:17 +01001/*
julhal01c3f4e9a2020-12-15 13:39:01 +00002 * Copyright (c) 2020-2021, Arm Limited and Contributors. All rights reserved.
Julian Hall8cff2b82020-11-23 18:12:17 +01003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
Imre Kisfbde07a2023-08-01 14:33:54 +02007#include "service_locator.h"
Julian Hall8cff2b82020-11-23 18:12:17 +01008#include "service_name.h"
9#include <assert.h>
10#include <stddef.h>
11
12#define SERVICE_LOCATOR_MAX_STATEGIES (8)
13
14/*
15 * The singleton service_locator object.
16 */
17static struct service_locator
18{
Imre Kisfbde07a2023-08-01 14:33:54 +020019 unsigned int num_strategies;
20 const struct service_location_strategy *strategies[SERVICE_LOCATOR_MAX_STATEGIES];
Julian Hall8cff2b82020-11-23 18:12:17 +010021
22} service_locator_instance = { .num_strategies = 0 };
23
24
25void service_locator_init(void)
26{
Imre Kisfbde07a2023-08-01 14:33:54 +020027 if (service_locator_instance.num_strategies == 0) service_locator_envinit();
Julian Hall8cff2b82020-11-23 18:12:17 +010028}
29
30void service_locator_register_strategy(const struct service_location_strategy *strategy)
31{
Imre Kisfbde07a2023-08-01 14:33:54 +020032 assert(service_locator_instance.num_strategies < SERVICE_LOCATOR_MAX_STATEGIES);
Julian Hall8cff2b82020-11-23 18:12:17 +010033
Imre Kisfbde07a2023-08-01 14:33:54 +020034 if (service_locator_instance.num_strategies < SERVICE_LOCATOR_MAX_STATEGIES) {
Julian Hall8cff2b82020-11-23 18:12:17 +010035
Imre Kisfbde07a2023-08-01 14:33:54 +020036 service_locator_instance.strategies[service_locator_instance.num_strategies] = strategy;
37 ++service_locator_instance.num_strategies;
38 }
Julian Hall8cff2b82020-11-23 18:12:17 +010039}
40
Imre Kisfbde07a2023-08-01 14:33:54 +020041struct service_context *service_locator_query(const char *sn)
Julian Hall8cff2b82020-11-23 18:12:17 +010042{
Imre Kisfbde07a2023-08-01 14:33:54 +020043 struct service_context *located_context = NULL;
44 unsigned int index = 0;
Julian Hall8cff2b82020-11-23 18:12:17 +010045
Imre Kisfbde07a2023-08-01 14:33:54 +020046 if (sn_is_valid(sn)) {
Julian Hall8cff2b82020-11-23 18:12:17 +010047
Imre Kisfbde07a2023-08-01 14:33:54 +020048 while (!located_context && (index < service_locator_instance.num_strategies)) {
Julian Hall8cff2b82020-11-23 18:12:17 +010049
Imre Kisfbde07a2023-08-01 14:33:54 +020050 located_context = service_locator_instance.strategies[index]->query(sn);
51 ++index;
52 }
53 }
Julian Hall8cff2b82020-11-23 18:12:17 +010054
Imre Kisfbde07a2023-08-01 14:33:54 +020055 return located_context;
Julian Hall8cff2b82020-11-23 18:12:17 +010056}
57
Imre Kisfbde07a2023-08-01 14:33:54 +020058struct rpc_caller_session *service_context_open(struct service_context *s)
Julian Hall8cff2b82020-11-23 18:12:17 +010059{
Imre Kisfbde07a2023-08-01 14:33:54 +020060 return s->open(s->context);
Julian Hall8cff2b82020-11-23 18:12:17 +010061}
62
Imre Kisfbde07a2023-08-01 14:33:54 +020063void service_context_close(struct service_context *s, struct rpc_caller_session *session)
Julian Hall8cff2b82020-11-23 18:12:17 +010064{
Imre Kisfbde07a2023-08-01 14:33:54 +020065 s->close(s->context, session);
Julian Hall8cff2b82020-11-23 18:12:17 +010066}
67
68void service_context_relinquish(struct service_context *s)
69{
Imre Kisfbde07a2023-08-01 14:33:54 +020070 s->relinquish(s->context);
Julian Hall8cff2b82020-11-23 18:12:17 +010071}