Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
ModuleFactory.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/* ModuleFactory.cc (C) 2000-2019 */
9/* */
10/* Manufacture des modules. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/ArcanePrecomp.h"
15
16#include "arcane/utils/String.h"
17#include "arcane/utils/FatalErrorException.h"
18#include "arcane/utils/TraceInfo.h"
19
20#include "arcane/ModuleFactory.h"
21#include "arcane/IModuleMng.h"
22#include "arcane/IModule.h"
23#include "arcane/ISubDomain.h"
24#include "arcane/IServiceInfo.h"
25#include "arcane/IMesh.h"
26
27#include "arcane/utils/Iostream.h"
28
29/*---------------------------------------------------------------------------*/
30/*---------------------------------------------------------------------------*/
31
32namespace Arcane
33{
34
35/*---------------------------------------------------------------------------*/
36/*---------------------------------------------------------------------------*/
37
39ModuleFactory(Ref<IModuleFactory2> factory,bool is_autoload)
40: m_factory(factory)
41, m_is_autoload(is_autoload)
42, m_name(factory->moduleName())
43, m_nb_ref(0)
44{
45 //cerr << "** ADD MODULE FACTORY this=" << this
46 // << " service_info_name=" << m_service_info->localName()
47 // << " autoload=" << is_autoload << '\n';
48}
49
50/*---------------------------------------------------------------------------*/
51/*---------------------------------------------------------------------------*/
52
53ModuleFactory::
54~ModuleFactory()
55{
56}
57
58/*---------------------------------------------------------------------------*/
59/*---------------------------------------------------------------------------*/
60
61Ref<IModule> ModuleFactory::
62createModule(ISubDomain* parent,const MeshHandle& mesh_handle)
63{
64 if (!m_factory)
65 ARCANE_FATAL("Null factory for module named '{0}'",moduleName());
66
67 Ref<IModule> module = m_factory->createModuleInstance(parent,mesh_handle);
68
69 if (!module)
70 ARCANE_FATAL("Can not create module named '{0}'",moduleName());
71
72 parent->checkId("ModuleFactory::createModule",module->name());
73 parent->moduleMng()->addModule(module);
74
75 return module;
76}
77
78/*---------------------------------------------------------------------------*/
79/*---------------------------------------------------------------------------*/
80
83{
84 m_factory->initializeModuleFactory(sub_domain);
85}
86
87/*---------------------------------------------------------------------------*/
88/*---------------------------------------------------------------------------*/
89
91serviceInfo() const
92{
93 return m_factory->serviceInfo();
94}
95
96/*---------------------------------------------------------------------------*/
97/*---------------------------------------------------------------------------*/
98
99void ModuleFactory::
100addReference()
101{
102 ++m_nb_ref;
103}
104
105/*---------------------------------------------------------------------------*/
106/*---------------------------------------------------------------------------*/
107
108void ModuleFactory::
109removeReference()
110{
111 // Décrémente et retourne la valeur d'avant.
112 // Si elle vaut 1, cela signifie qu'on n'a plus de références
113 // sur l'objet et qu'il faut le détruire.
114 Int32 v = std::atomic_fetch_add(&m_nb_ref,-1);
115 if (v==1)
116 delete this;
117}
118
119/*---------------------------------------------------------------------------*/
120/*---------------------------------------------------------------------------*/
121
122ModuleFactoryReference::
123ModuleFactoryReference(Ref<IModuleFactory2> factory,bool is_autoload)
124: Base(new ModuleFactory(factory,is_autoload))
125{
126}
127
128/*---------------------------------------------------------------------------*/
129/*---------------------------------------------------------------------------*/
130
131/*---------------------------------------------------------------------------*/
132/*---------------------------------------------------------------------------*/
133
134ModuleFactory2::
135~ModuleFactory2()
136{
137 if (m_service_info){
138 delete m_service_info->factoryInfo();
139 delete m_service_info;
140 }
141}
142
143/*---------------------------------------------------------------------------*/
144/*---------------------------------------------------------------------------*/
145
146} // End namespace Arcane
147
148/*---------------------------------------------------------------------------*/
149/*---------------------------------------------------------------------------*/
150
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
virtual void addModule(Ref< IModule > m)=0
Ajoute le module m au gestionnaire.
Interface des informations d'un service ou d'un module.
virtual IServiceFactoryInfo * factoryInfo() const =0
Infos sur les fabriques disponibles pour ce service.
Interface du gestionnaire d'un sous-domaine.
Definition ISubDomain.h:74
virtual IModuleMng * moduleMng()=0
Retourne le gestionnaire de modules.
virtual void checkId(const String &where, const String &id)=0
Vérifie qu'un identifiant est valide.
Handle sur un maillage.
Definition MeshHandle.h:47
ModuleFactory(Ref< IModuleFactory2 > factory, bool is_autoload)
Construit une fabrique pour un module.
Ref< IModule > createModule(ISubDomain *parent, const MeshHandle &mesh_handle) override
Créé un module.
String moduleName() const override
Nom du module créé par cette fabrique.
void initializeModuleFactory(ISubDomain *sub_domain) override
Si la fabrique est un pour un module, l'initialise sur le sous-domaine sub_domain.
const IServiceInfo * serviceInfo() const override
Informations sur le module pouvant être créé par cette fabrique.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-