Version: 9.15.0
SALOME_LogManager.hxx
Go to the documentation of this file.
1 // Copyright (C) 2024-2025 CEA, EDF
2 //
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
7 //
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
12 //
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19 
20 #pragma once
21 
22 #include "SALOME_Launcher_defs.hxx"
23 
24 #include "Python.h"
25 
26 #include "PythonCppUtils.hxx"
27 #include "Utils_CorbaException.hxx"
28 #include "SALOMEconfig.h"
29 
30 #include CORBA_SERVER_HEADER(SALOME_LogManager)
31 
32 #include <vector>
33 #include <string>
34 #include <memory>
35 
37 class SALOME_LogManager;
41 
42 namespace SALOME
43 {
44  auto ServantDeleter = [](PortableServer::ServantBase *serv) { if(serv) serv->_remove_ref(); };
45  using AutoServantDeleter = std::unique_ptr<PortableServer::ServantBase, decltype(ServantDeleter)>;
46 
56  template<class TVar, class TServ>
58  {
59  public:
60  RefAndServant(TVar var, TServ *serv):_var(var),_serv(serv,ServantDeleter) { }
61  RefAndServant(const RefAndServant& other):_var( other._var ),_serv(nullptr,ServantDeleter)
62  {
63  other.getServ()->_add_ref();
64  _serv.reset( other.getServ() );
65  }
66  ~RefAndServant() = default;
68  {
69  _var = other._var;
70  other.getServ()->_add_ref();
71  _serv.reset( other.getServ() );
72  return *this;
73  }
74  TVar getVar() const { return _var; }
75  TServ *getServ() const { return dynamic_cast<TServ *>( _serv.get() ); }
77  {
78  PortableServer::ObjectId_var oid = getServ()->getPOA()->reference_to_id(_var);
79  getServ()->getPOA()->deactivate_object(oid);
80  }
81  private:
82  TVar _var;
84  };
85 }
86 
88 {
89 public:
90  virtual void enterLogManager(SALOME_LogManager& inst) = 0;
91  virtual void leaveLogManager(SALOME_LogManager& inst) = 0;
97 };
98 
99 
100 class SALOMELAUNCHER_EXPORT SALOME_ContainerScriptExecPerfLog : public POA_Engines::ContainerScriptExecPerfLog
101 {
102 public:
104  SALOME_ContainerScriptPerfLog *father() const { return _father; }
105  void setPyObj(PyObject *obj) { _pyExecutionLog.set(obj); }
106  PyObject *pyObj() { return _pyExecutionLog.get(); }
107  PortableServer::POA_var getPOA();
108  void assign(const SALOME::vectorOfByte& value) override;
109  void assignAndAppendFreestyle(const SALOME::vectorOfByte& value) override;
110  SALOME::vectorOfByte *getObj() override;
111  const std::vector<char>& data() const { return _data; }
112  void setData(std::vector<char>&& data) { _data = std::move(data); }
113 public:
114  void accept(SALOME_VisitorContainerLog &visitor);
115 public:
116  void start();
117  AutoPyRef end();
118  void clear() { _data.clear(); }
119 private:
120  AutoPyRefGilSafe _pyExecutionLog;
121  SALOME_ContainerScriptPerfLog *_father = nullptr;
122  std::vector<char> _data;
123 };
124 
126 
127 class SALOMELAUNCHER_EXPORT SALOME_ContainerScriptPerfLog : public POA_Engines::ContainerScriptPerfLog
128 {
129 public:
130  SALOME_ContainerScriptPerfLog(SALOME_ContainerPerfLog *father, const std::string& name, const std::string& code):_father(father),_name(name),_code(code) { }
132  SALOME_ContainerPerfLog *father() const { return _father; }
133  void setPyObj(PyObject *obj) { _pyScriptLog.set(obj); }
134  PyObject *pyObj() { return _pyScriptLog.get(); }
135  PortableServer::POA_var getPOA();
136  Engines::ContainerScriptExecPerfLog_ptr addExecutionSession() override;
137  Engines::ListOfContainerScriptExecPerfLog *listOfExecs() override;
138  char *getCode() override;
139  char *getName() override;
140  const std::string& name() const { return _name; }
141  const std::string& code() const { return _code; }
142  void setName(const std::string& name) { _name = name; }
143  void setCode(const std::string& code) { _code = code; }
144  std::size_t getNumberOfSessions() const { return _sessions.size(); }
145 public:
146  void accept(SALOME_VisitorContainerLog &visitor);
147 private:
148  AutoPyRefGilSafe _pyScriptLog;
149  SALOME_ContainerPerfLog *_father = nullptr;
150  std::string _name;
151  std::string _code;
152  std::vector< ContainerScriptExecPerfLogPair > _sessions;
153 };
154 
156 
157 class SALOMELAUNCHER_EXPORT SALOME_ContainerPerfLog : public POA_Engines::ContainerPerfLog
158 {
159 public:
160  SALOME_ContainerPerfLog(SALOME_LogManager *father, const std::string& nameInNS, const std::string& logFile):_father(father),_name_in_ns(nameInNS),_log_file(logFile) { }
162  SALOME_LogManager *father() const { return _father; }
163  void setPyObj(PyObject *obj) { _pyContLog.set(obj); }
164  PyObject *pyObj() { return _pyContLog.get(); }
165  PortableServer::POA_var getPOA();
166  char *getLogFile() override;
167  char *getContainerEntryInNS() override;
168  Engines::ContainerScriptPerfLog_ptr addScript(const char *name, const char *code) override;
169  Engines::ListOfContainerScriptPerfLog *listOfScripts() override;
170  /* Call that destroy this object AND unregister from POA all referecences of this*/
171  void destroy() override;
172  const std::string& nameInNS() const { return _name_in_ns; }
173  const std::string& logFile() const { return _log_file; }
174  void setNameInNS(const std::string& name) { _name_in_ns = name; }
175  void setLogFile(const std::string& logFile) { _log_file = logFile; }
176  std::size_t getNumberOfScripts() const { return _scripts.size(); }
177 public:
178  void accept(SALOME_VisitorContainerLog &visitor);
179 private:
180  void destroyInternal();
181 private:
182  AutoPyRefGilSafe _pyContLog;
183  SALOME_LogManager *_father = nullptr;
184  std::string _name_in_ns;
185  std::string _log_file;
186  std::vector< ContainerScriptPerfLogPair > _scripts;
187 };
188 
191 
193 {
194 public:
195  void setFileNamePairOfLogger(const std::string& loggerFileNameA, const std::string& loggerFileNameB) { _logger_file_a = loggerFileNameA; _logger_file_b = loggerFileNameB; }
196  void getFileNamePairOfLogger(std::string& loggerFileNameA, std::string& loggerFileNameB) { loggerFileNameA = _logger_file_a; loggerFileNameB = _logger_file_b; }
199  std::string getLastVersionOfFileNameLogger();
200 private:
201  std::string _logger_file_a;
202  std::string _logger_file_b;
204 };
205 
207 
208 class SALOMELAUNCHER_EXPORT SALOME_LogManager : public POA_Engines::LogManager
209 {
210  public:
211  SALOME_LogManager(CORBA::ORB_ptr orb, PortableServer::POA_var poa, SALOME_NamingService_Abstract *ns = nullptr);
212  PortableServer::POA_var getPOA() { return _poa; }
213  PyObject *pyHelper() const { return _pyLogManager; }
215  void clear() override;
216  Engines::ContainerPerfLog_ptr declareContainer(const char *contInNS, const char *logfile) override;
217  Engines::ListOfContainerPerfLog *listOfContainerLogs() override;
218  SALOME::vectorOfByte *getAllStruct(bool clearMemory) override;
219  void putStructInFileAtomic(bool clearMemory, const char *fileName) override;
220  public:
221  void setFileNamePairOfLogger(const char *loggerFileNameA, const char *loggerFileNameB) override;
222  void getFileNamePairOfLogger(CORBA::String_out loggerFileNameA, CORBA::String_out loggerFileNameB) override;
223  void versionA_IsTheLatestValidVersion() override { _safe_logger_file_holder.versionA_IsTheLatestValidVersion(); }
224  void versionB_IsTheLatestValidVersion() override { _safe_logger_file_holder.versionB_IsTheLatestValidVersion(); }
225  char *getLastVersionOfFileNameLogger() override;
226  public:
227  void removeEntryBeforeDying(SALOME_ContainerPerfLog *child);
228  public:
229  std::size_t getNumberOfContainers() const { return _containers.size(); }
230  public:
231  void accept(SALOME_VisitorContainerLog &visitor);
232  private:
233  std::vector<char> dumpCppInternalFrmt(bool clearMemory);
234  private:
235  PyObject *_pyLogManager = nullptr;
236  std::unique_ptr<SALOME_NamingService_Abstract> _NS;
237  PortableServer::POA_var _poa;
238  std::vector< ContainerPerfLogPair > _containers;
240  public:
241  static const char NAME_IN_NS[];
242 };
static PortableServer::POA_var _poa
Definition: SALOMEDS_Study_i.cxx:70
#define SALOMELAUNCHER_EXPORT
Definition: SALOME_Launcher_defs.hxx:30
SafeLoggerActiveVersionType
Definition: SALOME_LogManager.hxx:190
Class in charge to manage life cycle of servant instance and its associated reference.
Definition: SALOME_LogManager.hxx:58
SALOME::AutoServantDeleter _serv
Definition: SALOME_LogManager.hxx:83
RefAndServant(TVar var, TServ *serv)
Definition: SALOME_LogManager.hxx:60
TVar _var
Definition: SALOME_LogManager.hxx:82
RefAndServant(const RefAndServant &other)
Definition: SALOME_LogManager.hxx:61
TVar getVar() const
Definition: SALOME_LogManager.hxx:74
TServ * getServ() const
Definition: SALOME_LogManager.hxx:75
void desactivateObjectFromPOA()
Definition: SALOME_LogManager.hxx:76
RefAndServant & operator=(const RefAndServant &other)
Definition: SALOME_LogManager.hxx:67
Definition: SALOME_LogManager.hxx:158
void setNameInNS(const std::string &name)
Definition: SALOME_LogManager.hxx:174
std::string _name_in_ns
Definition: SALOME_LogManager.hxx:184
PyObject * pyObj()
Definition: SALOME_LogManager.hxx:164
void setPyObj(PyObject *obj)
Definition: SALOME_LogManager.hxx:163
std::vector< ContainerScriptPerfLogPair > _scripts
Definition: SALOME_LogManager.hxx:186
const std::string & nameInNS() const
Definition: SALOME_LogManager.hxx:172
std::string _log_file
Definition: SALOME_LogManager.hxx:185
AutoPyRefGilSafe _pyContLog
Definition: SALOME_LogManager.hxx:182
std::size_t getNumberOfScripts() const
Definition: SALOME_LogManager.hxx:176
SALOME_ContainerPerfLog(SALOME_LogManager *father, const std::string &nameInNS, const std::string &logFile)
Definition: SALOME_LogManager.hxx:160
SALOME_LogManager * father() const
Definition: SALOME_LogManager.hxx:162
const std::string & logFile() const
Definition: SALOME_LogManager.hxx:173
void setLogFile(const std::string &logFile)
Definition: SALOME_LogManager.hxx:175
Definition: SALOME_LogManager.hxx:101
std::vector< char > _data
Definition: SALOME_LogManager.hxx:122
SALOME_ContainerScriptPerfLog * father() const
Definition: SALOME_LogManager.hxx:104
void setPyObj(PyObject *obj)
Definition: SALOME_LogManager.hxx:105
const std::vector< char > & data() const
Definition: SALOME_LogManager.hxx:111
SALOME_ContainerScriptExecPerfLog(SALOME_ContainerScriptPerfLog *father)
Definition: SALOME_LogManager.hxx:103
void clear()
Definition: SALOME_LogManager.hxx:118
PyObject * pyObj()
Definition: SALOME_LogManager.hxx:106
AutoPyRefGilSafe _pyExecutionLog
Definition: SALOME_LogManager.hxx:120
void setData(std::vector< char > &&data)
Definition: SALOME_LogManager.hxx:112
Definition: SALOME_LogManager.hxx:128
SALOME_ContainerPerfLog * father() const
Definition: SALOME_LogManager.hxx:132
void setName(const std::string &name)
Definition: SALOME_LogManager.hxx:142
void setPyObj(PyObject *obj)
Definition: SALOME_LogManager.hxx:133
std::size_t getNumberOfSessions() const
Definition: SALOME_LogManager.hxx:144
std::string _name
Definition: SALOME_LogManager.hxx:150
SALOME_ContainerScriptPerfLog(SALOME_ContainerPerfLog *father, const std::string &name, const std::string &code)
Definition: SALOME_LogManager.hxx:130
void setCode(const std::string &code)
Definition: SALOME_LogManager.hxx:143
const std::string & code() const
Definition: SALOME_LogManager.hxx:141
std::string _code
Definition: SALOME_LogManager.hxx:151
AutoPyRefGilSafe _pyScriptLog
Definition: SALOME_LogManager.hxx:148
const std::string & name() const
Definition: SALOME_LogManager.hxx:140
std::vector< ContainerScriptExecPerfLogPair > _sessions
Definition: SALOME_LogManager.hxx:152
PyObject * pyObj()
Definition: SALOME_LogManager.hxx:134
PortableServer::POA_var _poa
Definition: SALOME_LogManager.hxx:237
PortableServer::POA_var getPOA()
Definition: SALOME_LogManager.hxx:212
std::unique_ptr< SALOME_NamingService_Abstract > _NS
Definition: SALOME_LogManager.hxx:236
void versionA_IsTheLatestValidVersion() override
Definition: SALOME_LogManager.hxx:223
void versionB_IsTheLatestValidVersion() override
Definition: SALOME_LogManager.hxx:224
SALOME_SafeLoggerFileHolder _safe_logger_file_holder
Definition: SALOME_LogManager.hxx:239
std::size_t getNumberOfContainers() const
Definition: SALOME_LogManager.hxx:229
PyObject * pyHelper() const
Definition: SALOME_LogManager.hxx:213
std::vector< ContainerPerfLogPair > _containers
Definition: SALOME_LogManager.hxx:238
Definition: SALOME_NamingService_Abstract.hxx:46
Definition: SALOME_LogManager.hxx:193
void setFileNamePairOfLogger(const std::string &loggerFileNameA, const std::string &loggerFileNameB)
Definition: SALOME_LogManager.hxx:195
void getFileNamePairOfLogger(std::string &loggerFileNameA, std::string &loggerFileNameB)
Definition: SALOME_LogManager.hxx:196
void versionA_IsTheLatestValidVersion()
Definition: SALOME_LogManager.hxx:197
std::string _logger_file_a
Definition: SALOME_LogManager.hxx:201
void versionB_IsTheLatestValidVersion()
Definition: SALOME_LogManager.hxx:198
std::string _logger_file_b
Definition: SALOME_LogManager.hxx:202
SafeLoggerActiveVersionType _version_activated
Definition: SALOME_LogManager.hxx:203
std::string getLastVersionOfFileNameLogger()
Definition: SALOME_LogManager.cxx:284
Definition: SALOME_LogManager.hxx:88
virtual void leaveContainerScriptPerfLog(SALOME_ContainerScriptPerfLog &inst)=0
virtual void enterContainerPerfLog(SALOME_ContainerPerfLog &inst)=0
virtual void leaveLogManager(SALOME_LogManager &inst)=0
virtual void enterContainerScriptPerfLog(SALOME_ContainerScriptPerfLog &inst)=0
virtual void enterLogManager(SALOME_LogManager &inst)=0
virtual void leaveContainerPerfLog(SALOME_ContainerPerfLog &inst)=0
virtual void visitContainerScriptExecPerfLog(SALOME_ContainerScriptExecPerfLog &inst)=0
sequence< ContainerScriptPerfLog > ListOfContainerScriptPerfLog
Definition: SALOME_LogManager.idl:43
sequence< ContainerScriptExecPerfLog > ListOfContainerScriptExecPerfLog
Definition: SALOME_LogManager.idl:33
sequence< ContainerPerfLog > ListOfContainerPerfLog
Definition: SALOME_LogManager.idl:54
obj
Definition: batchmode_salome.py:275
poa
Definition: SALOME_ContainerPy.py:377
Definition: SALOME_LogManager.py:1
Module SALOME contains all base interfaces of SALOME Kernel.
Definition: SALOME_LockMasterImpl.hxx:29
std::unique_ptr< PortableServer::ServantBase, decltype(ServantDeleter)> AutoServantDeleter
Definition: SALOME_LogManager.hxx:45
sequence< octet > vectorOfByte
Definition: SALOME_Comm.idl:44
auto ServantDeleter
Definition: SALOME_LogManager.hxx:44
string name
Definition: pythfilter.py:56
orb
Definition: salome.py:122