Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
ServiceFactory.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2022 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* ServiceFactory.cc (C) 2000-2019 */
9/* */
10/* Fabrique des services/modules. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/List.h"
15
16#include "arcane/IServiceInfo.h"
17#include "arcane/ServiceFactory.h"
18#include "arcane/ServiceInstance.h"
19
20#include <iostream>
21
22/*---------------------------------------------------------------------------*/
23/*---------------------------------------------------------------------------*/
24
25namespace Arcane::Internal
26{
27
28/*---------------------------------------------------------------------------*/
29/*---------------------------------------------------------------------------*/
30/*!
31 * \file ServiceFactory.h
32 *
33 * \brief Ce fichier contient les différentes fabriques de services
34 * et macro pour enregistrer les services.
35 *
36 * La plupart des types de ce fichier sont internes à Arcane. Le seul élément
37 * utile pour un utilisateur est la macro ARCANE_REGISTER_SERVICE() qui
38 * permet d'enregistrer un service.
39 */
40
41/*!
42 * \file ServiceProperty.h
43 *
44 * \brief Ce fichier contient les différentes types et classes
45 * pour spécifier les propriétés d'un service.
46 */
47
48
49/*!
50 * \defgroup Service Service
51 *
52 * \brief Ensemble des types utilisés dans la gestion des services.
53 *
54 * La plupart des services utilisateurs sont des services de
55 * sous-domaine et dérivent indirectement de la classe
56 * BasicService. En règle générale, un service est défini dans un
57 * fichier AXL et l'outil \a axl2cc permet de générer la classe
58 * de base d'un service à partir de ce fichier AXL. Pour plus
59 * d'informations se reporter à la rubrique \ref arcanedoc_core_types_service.
60 *
61 * Il est néanmoins possible d'avoir des services sans fichier
62 * AXL. Dans ce cas, l'enregistrement d'un service pour qu'il soit
63 * reconnu par Arcane se fait via la macro ARCANE_REGISTER_SERVICE().
64 */
65
66/*---------------------------------------------------------------------------*/
67/*---------------------------------------------------------------------------*/
68/*!
69 * \brief Instances des services singletons.
70 *
71 * Les services singletons peuvent implémenter plusieurs interfaces.
72 * Il y a donc une instance IServiceInstance par interface plus une instance
73 * pour le service lui-même. Comme toutes ces instances référencent le
74 * même service, il faut faire attention de ne détruire le service qu'une
75 * seule fois.
76 */
80{
81 public:
83 : m_service_info(si){}
85 {
86 destroyInstance();
87 }
88 public:
89 void addReference() override { ++m_nb_ref; }
90 void removeReference() override
91 {
92 Int32 v = std::atomic_fetch_add(&m_nb_ref,-1);
93 if (v==1)
94 delete this;
95 }
96 public:
97 ServiceInstanceCollection interfaceInstances() override { return m_instances; }
98 void destroyInstance()
99 {
100 m_true_instance.reset();
101 m_instances.clear();
102 }
103 IServiceInfo* serviceInfo() const override { return m_service_info; }
104 void setTrueInstance(ServiceInstanceRef si) { m_true_instance = si; }
105 public:
106 void addInstance(ServiceInstanceRef instance) override
107 {
108 m_instances.add(instance);
109 }
110 private:
111 IServiceInfo* m_service_info;
112 List<ServiceInstanceRef> m_instances;
113 ServiceInstanceRef m_true_instance;
114 std::atomic<Int32> m_nb_ref = 0;
115};
116
117/*---------------------------------------------------------------------------*/
118/*---------------------------------------------------------------------------*/
119
120//! Créé un service singleton
121Ref<ISingletonServiceInstance> SingletonServiceFactoryBase::
123{
124 auto x = new ServiceInstance(m_service_info);
125 IServiceInstanceAdder* sia = x;
126 ServiceInstanceRef si = _createInstance(sbib,sia);
127 x->setTrueInstance(si);
128 return makeRef<ISingletonServiceInstance>(x);
129}
130
131/*---------------------------------------------------------------------------*/
132/*---------------------------------------------------------------------------*/
133
136{
137 ++m_nb_ref;
138}
139
142{
143 // Décrémente et retourne la valeur d'avant.
144 // Si elle vaut 1, cela signifie qu'on n'a plus de références
145 // sur l'objet et qu'il faut le détruire.
146 Int32 v = std::atomic_fetch_add(&m_nb_ref,-1);
147 if (v==1)
148 delete this;
149}
150
151/*---------------------------------------------------------------------------*/
152/*---------------------------------------------------------------------------*/
153
154} // End namespace Arcane::Internal
155
156/*---------------------------------------------------------------------------*/
157/*---------------------------------------------------------------------------*/
158
Interface des informations d'un service ou d'un module.
void removeReference() override
Supprime une référence.
void addReference() override
Ajoute une référence.
ServiceInstanceCollection interfaceInstances() override
Liste des instances des interfaces implémentées par le singleton.
void removeReference() override
Supprime une référence.
Ref< ISingletonServiceInstance > createSingletonServiceInstance(const ServiceBuildInfoBase &sbib) override
Créé un service singleton.
Informations pour créer un service.
Référence sur une instance de service.
Types interne à Arcane.
Definition ArcaneTypes.h:88
Collection< ServiceInstanceRef > ServiceInstanceCollection
Collection d'instances de services.