Skip to content

Commit ae1f158

Browse files
Merge pull request #19 from LIHPC-Computational-Geometry/log_usage_dev
Version 6.14.0.
2 parents db075b3 + c8a7d83 commit ae1f158

File tree

11 files changed

+609
-272
lines changed

11 files changed

+609
-272
lines changed

src/TkUtil/ApplicationStats.cpp

Lines changed: 362 additions & 186 deletions
Large diffs are not rendered by default.

src/TkUtil/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ foreach (lib ${ALL_TARGETS})
2121
target_compile_options (${lib} PUBLIC ${MANDATORY_CXX_OPTIONS})
2222
target_compile_definitions (${lib} PRIVATE TOSTR_USES_CPP_IMPLEMENTATION)
2323
target_compile_definitions (${lib} PRIVATE UTIL_VERSION="${TK_UTIL_VERSION}")
24+
target_compile_definitions (${lib} PRIVATE OS_DISTRIBUTION="${PLATFORM}") # défini dans workarounds.cmake
2425
set_property (TARGET ${lib} PROPERTY VERSION ${TK_UTIL_VERSION})
2526
set_property (TARGET ${lib} PROPERTY SOVERSION ${TK_UTIL_MAJOR_VERSION})
2627
# Etre capable une fois installée de retrouver les libs utilisées (iconv ?), ... :

src/TkUtil/MachineData.cpp

Lines changed: 43 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ OperatingSystem * OperatingSystem::_currentOS = 0;
3838

3939

4040
OperatingSystem::OperatingSystem ( )
41-
: _name ( ), _version ("0.0.0"), _infos ( ), _numericInfos ( )
41+
: _name ( ), _distribution (OS_DISTRIBUTION), _version ("0.0.0"), _infos ( ), _numericInfos ( )
4242
{
4343
errno = 0;
4444

@@ -48,10 +48,8 @@ OperatingSystem::OperatingSystem ( )
4848
if (-1 == retVal)
4949
{
5050
ConsoleOutput::cout ( )
51-
<< "Erreur lors de l'initialisation des informations sur le "
52-
<< "système d'exploitation de la machine "
53-
<< MachineData::instance ( ).getCurrentHostName ( )
54-
<< " : " << co_endl << strerror (errno) << ".";
51+
<< "Erreur lors de l'initialisation des informations sur le système d'exploitation de la machine "
52+
<< MachineData::instance ( ).getCurrentHostName ( ) << " : " << co_endl << strerror (errno) << ".";
5553
errno = 0;
5654
} // if (-1 == retVal)
5755
else
@@ -64,18 +62,14 @@ OperatingSystem::OperatingSystem ( )
6462
catch (const Exception& exc)
6563
{
6664
ConsoleOutput::cout ( )
67-
<< "Erreur lors de l'initialisation des informations sur le "
68-
<< "système d'exploitation de la machine "
69-
<< MachineData::instance ( ).getCurrentHostName ( )
70-
<< " : " << co_endl << exc.getFullMessage ( ) << ".";
65+
<< "Erreur lors de l'initialisation des informations sur le système d'exploitation de la machine "
66+
<< MachineData::instance ( ).getCurrentHostName ( ) << " : " << co_endl << exc.getFullMessage ( ) << ".";
7167
}
7268
catch (...)
7369
{
7470
ConsoleOutput::cout ( )
75-
<< "Erreur lors de l'initialisation des informations sur le "
76-
<< "système d'exploitation de la machine "
77-
<< MachineData::instance ( ).getCurrentHostName ( )
78-
<< " : " << co_endl << "Erreur non documentée." << ".";
71+
<< "Erreur lors de l'initialisation des informations sur le système d'exploitation de la machine "
72+
<< MachineData::instance ( ).getCurrentHostName ( ) << " : " << co_endl << "Erreur non documentée." << ".";
7973
}
8074
setInformations (osInfos.version);
8175
} // else if (0 != retVal)
@@ -305,37 +299,42 @@ OperatingSystem::OperatingSystem ( )
305299
<< NumericServices::unsignedLongLongDigitsMax
306300
<< '\n';
307301

308-
// numericInfos.utf8 ( ) : copie directe du buffer, mais ne doit
309-
// contenir que des caractères ASCII.
302+
// numericInfos.utf8 ( ) : copie directe du buffer, mais ne doit contenir que des caractères ASCII.
310303
setNumericInformations (numericInfos.utf8 ( ));
311304
}
312305
catch (const Exception& exc)
313306
{
314307
ConsoleOutput::cout ( )
315-
<< "Erreur lors de l'initialisation des informations numériques "
316-
<< "sur le système d'exploitation de la machine "
317-
<< MachineData::instance ( ).getCurrentHostName ( )
318-
<< " : " << co_endl << exc.getFullMessage ( ) << ".";
308+
<< "Erreur lors de l'initialisation des informations numériques sur le système d'exploitation de la machine "
309+
<< MachineData::instance ( ).getCurrentHostName ( ) << " : " << co_endl << exc.getFullMessage ( ) << ".";
319310
}
320311
catch (const exception& e)
321312
{
322313
ConsoleOutput::cout ( )
323-
<< "Erreur lors de l'initialisation des informations numériques "
324-
<< "sur le système d'exploitation de la machine "
325-
<< MachineData::instance ( ).getCurrentHostName ( )
326-
<< " : " << co_endl << e.what ( ) << ".";
314+
<< "Erreur lors de l'initialisation des informations numériques sur le système d'exploitation de la machine "
315+
<< MachineData::instance ( ).getCurrentHostName ( ) << " : " << co_endl << e.what ( ) << ".";
327316
}
328317
catch (...)
329318
{
330319
ConsoleOutput::cout ( )
331-
<< "Erreur lors de l'initialisation des informations numériques "
332-
<< "sur le système d'exploitation de la machine "
333-
<< MachineData::instance ( ).getCurrentHostName ( )
334-
<< " : " << co_endl << "Erreur non documentée." << ".";
320+
<< "Erreur lors de l'initialisation des informations numériques sur le système d'exploitation de la machine "
321+
<< MachineData::instance ( ).getCurrentHostName ( ) << " : " << co_endl << "Erreur non documentée." << ".";
335322
}
336323
} // OperatingSystem::OperatingSystem
337324

338325

326+
OperatingSystem::OperatingSystem (const string& name, const Version& version, const string& infos, const string& numericInfos)
327+
: _name (name), _version (version), _distribution (OS_DISTRIBUTION), _infos (infos), _numericInfos (numericInfos)
328+
{
329+
} // OperatingSystem::OperatingSystem
330+
331+
332+
OperatingSystem::OperatingSystem (const OperatingSystem& os)
333+
: _name (os._name), _distribution (OS_DISTRIBUTION), _version (os._version), _infos (os._infos), _numericInfos (os._numericInfos)
334+
{
335+
} // OperatingSystem::OperatingSystem
336+
337+
339338
const OperatingSystem& OperatingSystem::instance ( )
340339
{
341340
if (0 == _currentOS)
@@ -354,22 +353,17 @@ MachineData* MachineData::_currentMachine = 0;
354353
bool MachineData::_instanciated = false; // Lib non instanciée
355354

356355
MachineData::MachineData ( )
357-
: NetworkData ( ),
358-
_processorNum ((size_t)-1),
359-
_operatingSystem (OperatingSystem::instance ( )), _hardware ( )
356+
: NetworkData ( ), _processorNum ((size_t)-1), _operatingSystem (OperatingSystem::instance ( )), _hardware ( )
360357
{
361-
// LE CODE DOIT ETRE LE MEME DANS MachineData::MachineData (char)
362-
// POUR MachineData::_currentMachine.
358+
// LE CODE DOIT ETRE LE MEME DANS MachineData::MachineData (char) POUR MachineData::_currentMachine.
363359
long nbProcs = -1;
364360
#ifdef _SC_NPROCESSORS_ONLN
365361
nbProcs = sysconf (_SC_NPROCESSORS_ONLN);
366362
#elif defined(_SC_NPROC_ONLN)
367363
nbProcs = sysconf (_SC_NPROC_ONLN);
368364
#else
369365
ConsoleOutput::cout ( )
370-
<< "ERREUR dans MachineData::MachineData : "
371-
<< "détermination impossible du nombre de processeurs de la "
372-
<< "machine " << getHostName ( ) << co_endl << "\a";
366+
<< "ERREUR dans MachineData::MachineData : détermination impossible du nombre de processeurs de la machine " << getHostName ( ) << co_endl << "\a";
373367
#endif // _SC_NPROCESSORS_ONLN
374368
_processorNum = (size_t)nbProcs;
375369

@@ -380,10 +374,8 @@ MachineData::MachineData ( )
380374
if (-1 == retVal)
381375
{
382376
ConsoleOutput::cout ( )
383-
<< "Erreur lors de l'initialisation des informations sur le "
384-
<< "système matériel de la machine "
385-
<< getCurrentHostName ( ) << " : " << co_endl << strerror (errno)
386-
<< ".";
377+
<< "Erreur lors de l'initialisation des informations sur le système matériel de la machine "
378+
<< getCurrentHostName ( ) << " : " << co_endl << strerror (errno) << ".";
387379
errno = 0;
388380
} // if (-1 == retVal)
389381
else
@@ -392,30 +384,21 @@ MachineData::MachineData ( )
392384

393385

394386
MachineData::MachineData (const MachineData& machine)
395-
: NetworkData (machine),
396-
_processorNum (machine._processorNum),
397-
_operatingSystem (machine._operatingSystem),
398-
_hardware (machine._hardware)
387+
: NetworkData (machine), _processorNum (machine._processorNum), _operatingSystem (machine._operatingSystem), _hardware (machine._hardware)
399388
{
400389
} // MachineData::MachineData (const MachineData&)
401390

402391

403392
MachineData::MachineData (char)
404-
: NetworkData ( ),
405-
_processorNum ((size_t)-1),
406-
_operatingSystem (OperatingSystem::instance ( )), _hardware ( )
393+
: NetworkData ( ), _processorNum ((size_t)-1), _operatingSystem (OperatingSystem::instance ( )), _hardware ( )
407394
{
408395
if (true == _instanciated) // v 2.27.0
409396
{ // Protection contre les (dé)chargements multiples de la bibliothèque
410397
UTF8String message (charset);
411-
message << "ATTENTION. Chargement de la version "
412-
<< UtilInfos::getVersion ( ).getVersion ( )
413-
<< " de la bibliothèque TkUtil. Cette bibliothèque est déjà "
414-
<< "chargée, et ce second chargement risque de provoquer un "
398+
message << "ATTENTION. Chargement de la version " << UtilInfos::getVersion ( ).getVersion ( )
399+
<< " de la bibliothèque TkUtil. Cette bibliothèque est déjà chargée, et ce second chargement risque de provoquer un "
415400
<< "comportement anormal, voire un plantage, du logiciel."
416-
<< "\nErreur détectée en ligne "
417-
<< (unsigned long)__LINE__ << " du fichier "
418-
<< (unsigned long)__FILE__ << "\n";
401+
<< "\nErreur détectée en ligne " << (unsigned long)__LINE__ << " du fichier " << (unsigned long)__FILE__ << "\n";
419402
ConsoleOutput::cout ( ) << message << co_endl;
420403
} // if (true == _instanciated)
421404

@@ -429,9 +412,7 @@ MachineData::MachineData (char)
429412
nbProcs = sysconf (_SC_NPROC_ONLN);
430413
#else
431414
ConsoleOutput::cout ( )
432-
<< "ERREUR dans MachineData::MachineData : "
433-
<< "détermination impossible du nombre de processeurs de la "
434-
<< "machine " << getHostName ( ) << co_endl << "\a";
415+
<< "ERREUR dans MachineData::MachineData : détermination impossible du nombre de processeurs de la machine " << getHostName ( ) << co_endl << "\a";
435416
#endif // _SC_NPROCESSORS_ONLN
436417
_processorNum = (size_t)nbProcs;
437418

@@ -442,10 +423,8 @@ MachineData::MachineData (char)
442423
if (-1 == retVal)
443424
{
444425
ConsoleOutput::cout ( )
445-
<< "Erreur lors de l'initialisation des informations sur le "
446-
<< "système matériel de la machine "
447-
<< getCurrentHostName ( ) << " : " << co_endl << strerror (errno)
448-
<< ".";
426+
<< "Erreur lors de l'initialisation des informations sur le système matériel de la machine "
427+
<< getCurrentHostName ( ) << " : " << co_endl << strerror (errno) << ".";
449428
errno = 0;
450429
} // if (-1 == retVal)
451430
else
@@ -474,15 +453,10 @@ MachineData::~MachineData ( )
474453
if (false == _instanciated)
475454
{
476455
ConsoleOutput::cout ( )
477-
<< "ATTENTION. Déchargement de la version "
478-
<< UtilInfos::getVersion ( ).getVersion ( )
479-
<< " de la bibliothèque TkUtil. Cette bibliothèque est déjà "
480-
<< "déchargée, et ce second déchargement risque de provoquer "
481-
<< "comportement anormal, voire un plantage, du logiciel."
482-
<< co_endl
483-
<< "Erreur détectée en ligne "
484-
<< (unsigned long)__LINE__ << " du fichier "
485-
<< (unsigned long)__FILE__ << co_endl;
456+
<< "ATTENTION. Déchargement de la version " << UtilInfos::getVersion ( ).getVersion ( )
457+
<< " de la bibliothèque TkUtil. Cette bibliothèque est déjà déchargée, et ce second déchargement risque de provoquer "
458+
<< "comportement anormal, voire un plantage, du logiciel." << co_endl
459+
<< "Erreur détectée en ligne " << (unsigned long)__LINE__ << " du fichier " << (unsigned long)__FILE__ << co_endl;
486460
} // if (false == _instanciated)
487461

488462
_instanciated = false;

src/TkUtil/Process.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -446,10 +446,18 @@ void Process::initialize (char* envp [])
446446
} // Process::initialize
447447

448448

449-
void Process::finalize ( )
449+
void Process::finalize (unsigned int delay)
450450
{
451451
for (set<pid_t>::iterator itk = _toKill.begin ( ); _toKill.end ( ) != itk; itk++)
452452
{
453+
// int status = 0;
454+
// if ((0 != delay) && (0 == ::waitpid (*itk, &status, WNOHANG))) // fonctionne également :)
455+
if ((0 != delay) && (0 == ::kill (*itk, 0)))
456+
{
457+
::sleep (delay);
458+
delay = 0;
459+
} // if ((0 != delay) && (0 == ::kill (*itk, 0)))
460+
453461
int res = ::kill (*itk, SIGKILL);
454462
if (0 != res)
455463
{

src/TkUtil/public/TkUtil/ApplicationStats.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,18 @@ class ApplicationStats
4747
*/
4848
static void logUsage (const std::string& appName, const std::string& logDir);
4949

50+
/**
51+
* Ajoute une utilisation de cette version de l'application pour un operating system et un chemin d'accès donnés.
52+
* L'opération se fait dans un processus détaché. Toute erreur rencontrée est affichée dans la console de lancement de l'application.
53+
* @param appName est le nom de l'application
54+
* @param logDir est le répertoire où sont stockés les fichiers de logs
55+
* @param version est la version utilisée de l'application
56+
* @param os est le nom du système d'exploitation (ou tout autre moyen de l'identifier)
57+
* @param path est le chemin d'accès complet de l'application
58+
* @since 6.14.0
59+
*/
60+
static void logUsage (const std::string& appName, const std::string& logDir, const std::string& version, const std::string& os, const std::string& path);
61+
5062
/**
5163
* Rassemble les utilisations d'une application sur la période demandée et en affiche la synthèse dans le flux transmis en argument.
5264
* Toute erreur rencontrée est affichée dans la console de lancement de l'application.
@@ -62,6 +74,14 @@ class ApplicationStats
6274

6375
private :
6476

77+
/**
78+
* Effectue un fork, ouvre le fichier en lecture/réécriture avec les bons droits, ...
79+
* @return un pointeur sur le fichier ouvert pour y écrire des informations (processus fils) ou 0 (processus père). Appelle exit (0) en cas d'erreur dans le
80+
* processus fils (tolérance aux fautes).
81+
* @since 6.14.0
82+
*/
83+
static FILE* initLogSession (const std::string fullFileName);
84+
6585
/**
6686
* Charge les logs du fichiers ouvert transmis en argument dans la map transmise en second argument.
6787
* @return 0 en cas de succès. En cas d'erreur errno est positionné.

0 commit comments

Comments
 (0)