Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
548 changes: 362 additions & 186 deletions src/TkUtil/ApplicationStats.cpp

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions src/TkUtil/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ foreach (lib ${ALL_TARGETS})
target_compile_options (${lib} PUBLIC ${MANDATORY_CXX_OPTIONS})
target_compile_definitions (${lib} PRIVATE TOSTR_USES_CPP_IMPLEMENTATION)
target_compile_definitions (${lib} PRIVATE UTIL_VERSION="${TK_UTIL_VERSION}")
target_compile_definitions (${lib} PRIVATE OS_DISTRIBUTION="${PLATFORM}") # défini dans workarounds.cmake
set_property (TARGET ${lib} PROPERTY VERSION ${TK_UTIL_VERSION})
set_property (TARGET ${lib} PROPERTY SOVERSION ${TK_UTIL_MAJOR_VERSION})
# Etre capable une fois installée de retrouver les libs utilisées (iconv ?), ... :
Expand Down
112 changes: 43 additions & 69 deletions src/TkUtil/MachineData.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ OperatingSystem * OperatingSystem::_currentOS = 0;


OperatingSystem::OperatingSystem ( )
: _name ( ), _version ("0.0.0"), _infos ( ), _numericInfos ( )
: _name ( ), _distribution (OS_DISTRIBUTION), _version ("0.0.0"), _infos ( ), _numericInfos ( )
{
errno = 0;

Expand All @@ -48,10 +48,8 @@ OperatingSystem::OperatingSystem ( )
if (-1 == retVal)
{
ConsoleOutput::cout ( )
<< "Erreur lors de l'initialisation des informations sur le "
<< "système d'exploitation de la machine "
<< MachineData::instance ( ).getCurrentHostName ( )
<< " : " << co_endl << strerror (errno) << ".";
<< "Erreur lors de l'initialisation des informations sur le système d'exploitation de la machine "
<< MachineData::instance ( ).getCurrentHostName ( ) << " : " << co_endl << strerror (errno) << ".";
errno = 0;
} // if (-1 == retVal)
else
Expand All @@ -64,18 +62,14 @@ OperatingSystem::OperatingSystem ( )
catch (const Exception& exc)
{
ConsoleOutput::cout ( )
<< "Erreur lors de l'initialisation des informations sur le "
<< "système d'exploitation de la machine "
<< MachineData::instance ( ).getCurrentHostName ( )
<< " : " << co_endl << exc.getFullMessage ( ) << ".";
<< "Erreur lors de l'initialisation des informations sur le système d'exploitation de la machine "
<< MachineData::instance ( ).getCurrentHostName ( ) << " : " << co_endl << exc.getFullMessage ( ) << ".";
}
catch (...)
{
ConsoleOutput::cout ( )
<< "Erreur lors de l'initialisation des informations sur le "
<< "système d'exploitation de la machine "
<< MachineData::instance ( ).getCurrentHostName ( )
<< " : " << co_endl << "Erreur non documentée." << ".";
<< "Erreur lors de l'initialisation des informations sur le système d'exploitation de la machine "
<< MachineData::instance ( ).getCurrentHostName ( ) << " : " << co_endl << "Erreur non documentée." << ".";
}
setInformations (osInfos.version);
} // else if (0 != retVal)
Expand Down Expand Up @@ -305,37 +299,42 @@ OperatingSystem::OperatingSystem ( )
<< NumericServices::unsignedLongLongDigitsMax
<< '\n';

// numericInfos.utf8 ( ) : copie directe du buffer, mais ne doit
// contenir que des caractères ASCII.
// numericInfos.utf8 ( ) : copie directe du buffer, mais ne doit contenir que des caractères ASCII.
setNumericInformations (numericInfos.utf8 ( ));
}
catch (const Exception& exc)
{
ConsoleOutput::cout ( )
<< "Erreur lors de l'initialisation des informations numériques "
<< "sur le système d'exploitation de la machine "
<< MachineData::instance ( ).getCurrentHostName ( )
<< " : " << co_endl << exc.getFullMessage ( ) << ".";
<< "Erreur lors de l'initialisation des informations numériques sur le système d'exploitation de la machine "
<< MachineData::instance ( ).getCurrentHostName ( ) << " : " << co_endl << exc.getFullMessage ( ) << ".";
}
catch (const exception& e)
{
ConsoleOutput::cout ( )
<< "Erreur lors de l'initialisation des informations numériques "
<< "sur le système d'exploitation de la machine "
<< MachineData::instance ( ).getCurrentHostName ( )
<< " : " << co_endl << e.what ( ) << ".";
<< "Erreur lors de l'initialisation des informations numériques sur le système d'exploitation de la machine "
<< MachineData::instance ( ).getCurrentHostName ( ) << " : " << co_endl << e.what ( ) << ".";
}
catch (...)
{
ConsoleOutput::cout ( )
<< "Erreur lors de l'initialisation des informations numériques "
<< "sur le système d'exploitation de la machine "
<< MachineData::instance ( ).getCurrentHostName ( )
<< " : " << co_endl << "Erreur non documentée." << ".";
<< "Erreur lors de l'initialisation des informations numériques sur le système d'exploitation de la machine "
<< MachineData::instance ( ).getCurrentHostName ( ) << " : " << co_endl << "Erreur non documentée." << ".";
}
} // OperatingSystem::OperatingSystem


OperatingSystem::OperatingSystem (const string& name, const Version& version, const string& infos, const string& numericInfos)
: _name (name), _version (version), _distribution (OS_DISTRIBUTION), _infos (infos), _numericInfos (numericInfos)
{
} // OperatingSystem::OperatingSystem


OperatingSystem::OperatingSystem (const OperatingSystem& os)
: _name (os._name), _distribution (OS_DISTRIBUTION), _version (os._version), _infos (os._infos), _numericInfos (os._numericInfos)
{
} // OperatingSystem::OperatingSystem


const OperatingSystem& OperatingSystem::instance ( )
{
if (0 == _currentOS)
Expand All @@ -354,22 +353,17 @@ MachineData* MachineData::_currentMachine = 0;
bool MachineData::_instanciated = false; // Lib non instanciée

MachineData::MachineData ( )
: NetworkData ( ),
_processorNum ((size_t)-1),
_operatingSystem (OperatingSystem::instance ( )), _hardware ( )
: NetworkData ( ), _processorNum ((size_t)-1), _operatingSystem (OperatingSystem::instance ( )), _hardware ( )
{
// LE CODE DOIT ETRE LE MEME DANS MachineData::MachineData (char)
// POUR MachineData::_currentMachine.
// LE CODE DOIT ETRE LE MEME DANS MachineData::MachineData (char) POUR MachineData::_currentMachine.
long nbProcs = -1;
#ifdef _SC_NPROCESSORS_ONLN
nbProcs = sysconf (_SC_NPROCESSORS_ONLN);
#elif defined(_SC_NPROC_ONLN)
nbProcs = sysconf (_SC_NPROC_ONLN);
#else
ConsoleOutput::cout ( )
<< "ERREUR dans MachineData::MachineData : "
<< "détermination impossible du nombre de processeurs de la "
<< "machine " << getHostName ( ) << co_endl << "\a";
<< "ERREUR dans MachineData::MachineData : détermination impossible du nombre de processeurs de la machine " << getHostName ( ) << co_endl << "\a";
#endif // _SC_NPROCESSORS_ONLN
_processorNum = (size_t)nbProcs;

Expand All @@ -380,10 +374,8 @@ MachineData::MachineData ( )
if (-1 == retVal)
{
ConsoleOutput::cout ( )
<< "Erreur lors de l'initialisation des informations sur le "
<< "système matériel de la machine "
<< getCurrentHostName ( ) << " : " << co_endl << strerror (errno)
<< ".";
<< "Erreur lors de l'initialisation des informations sur le système matériel de la machine "
<< getCurrentHostName ( ) << " : " << co_endl << strerror (errno) << ".";
errno = 0;
} // if (-1 == retVal)
else
Expand All @@ -392,30 +384,21 @@ MachineData::MachineData ( )


MachineData::MachineData (const MachineData& machine)
: NetworkData (machine),
_processorNum (machine._processorNum),
_operatingSystem (machine._operatingSystem),
_hardware (machine._hardware)
: NetworkData (machine), _processorNum (machine._processorNum), _operatingSystem (machine._operatingSystem), _hardware (machine._hardware)
{
} // MachineData::MachineData (const MachineData&)


MachineData::MachineData (char)
: NetworkData ( ),
_processorNum ((size_t)-1),
_operatingSystem (OperatingSystem::instance ( )), _hardware ( )
: NetworkData ( ), _processorNum ((size_t)-1), _operatingSystem (OperatingSystem::instance ( )), _hardware ( )
{
if (true == _instanciated) // v 2.27.0
{ // Protection contre les (dé)chargements multiples de la bibliothèque
UTF8String message (charset);
message << "ATTENTION. Chargement de la version "
<< UtilInfos::getVersion ( ).getVersion ( )
<< " de la bibliothèque TkUtil. Cette bibliothèque est déjà "
<< "chargée, et ce second chargement risque de provoquer un "
message << "ATTENTION. Chargement de la version " << UtilInfos::getVersion ( ).getVersion ( )
<< " de la bibliothèque TkUtil. Cette bibliothèque est déjà chargée, et ce second chargement risque de provoquer un "
<< "comportement anormal, voire un plantage, du logiciel."
<< "\nErreur détectée en ligne "
<< (unsigned long)__LINE__ << " du fichier "
<< (unsigned long)__FILE__ << "\n";
<< "\nErreur détectée en ligne " << (unsigned long)__LINE__ << " du fichier " << (unsigned long)__FILE__ << "\n";
ConsoleOutput::cout ( ) << message << co_endl;
} // if (true == _instanciated)

Expand All @@ -429,9 +412,7 @@ MachineData::MachineData (char)
nbProcs = sysconf (_SC_NPROC_ONLN);
#else
ConsoleOutput::cout ( )
<< "ERREUR dans MachineData::MachineData : "
<< "détermination impossible du nombre de processeurs de la "
<< "machine " << getHostName ( ) << co_endl << "\a";
<< "ERREUR dans MachineData::MachineData : détermination impossible du nombre de processeurs de la machine " << getHostName ( ) << co_endl << "\a";
#endif // _SC_NPROCESSORS_ONLN
_processorNum = (size_t)nbProcs;

Expand All @@ -442,10 +423,8 @@ MachineData::MachineData (char)
if (-1 == retVal)
{
ConsoleOutput::cout ( )
<< "Erreur lors de l'initialisation des informations sur le "
<< "système matériel de la machine "
<< getCurrentHostName ( ) << " : " << co_endl << strerror (errno)
<< ".";
<< "Erreur lors de l'initialisation des informations sur le système matériel de la machine "
<< getCurrentHostName ( ) << " : " << co_endl << strerror (errno) << ".";
errno = 0;
} // if (-1 == retVal)
else
Expand Down Expand Up @@ -474,15 +453,10 @@ MachineData::~MachineData ( )
if (false == _instanciated)
{
ConsoleOutput::cout ( )
<< "ATTENTION. Déchargement de la version "
<< UtilInfos::getVersion ( ).getVersion ( )
<< " de la bibliothèque TkUtil. Cette bibliothèque est déjà "
<< "déchargée, et ce second déchargement risque de provoquer "
<< "comportement anormal, voire un plantage, du logiciel."
<< co_endl
<< "Erreur détectée en ligne "
<< (unsigned long)__LINE__ << " du fichier "
<< (unsigned long)__FILE__ << co_endl;
<< "ATTENTION. Déchargement de la version " << UtilInfos::getVersion ( ).getVersion ( )
<< " de la bibliothèque TkUtil. Cette bibliothèque est déjà déchargée, et ce second déchargement risque de provoquer "
<< "comportement anormal, voire un plantage, du logiciel." << co_endl
<< "Erreur détectée en ligne " << (unsigned long)__LINE__ << " du fichier " << (unsigned long)__FILE__ << co_endl;
} // if (false == _instanciated)

_instanciated = false;
Expand Down
10 changes: 9 additions & 1 deletion src/TkUtil/Process.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -446,10 +446,18 @@ void Process::initialize (char* envp [])
} // Process::initialize


void Process::finalize ( )
void Process::finalize (unsigned int delay)
{
for (set<pid_t>::iterator itk = _toKill.begin ( ); _toKill.end ( ) != itk; itk++)
{
// int status = 0;
// if ((0 != delay) && (0 == ::waitpid (*itk, &status, WNOHANG))) // fonctionne également :)
if ((0 != delay) && (0 == ::kill (*itk, 0)))
{
::sleep (delay);
delay = 0;
} // if ((0 != delay) && (0 == ::kill (*itk, 0)))

int res = ::kill (*itk, SIGKILL);
if (0 != res)
{
Expand Down
20 changes: 20 additions & 0 deletions src/TkUtil/public/TkUtil/ApplicationStats.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,18 @@ class ApplicationStats
*/
static void logUsage (const std::string& appName, const std::string& logDir);

/**
* Ajoute une utilisation de cette version de l'application pour un operating system et un chemin d'accès donnés.
* 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.
* @param appName est le nom de l'application
* @param logDir est le répertoire où sont stockés les fichiers de logs
* @param version est la version utilisée de l'application
* @param os est le nom du système d'exploitation (ou tout autre moyen de l'identifier)
* @param path est le chemin d'accès complet de l'application
* @since 6.14.0
*/
static void logUsage (const std::string& appName, const std::string& logDir, const std::string& version, const std::string& os, const std::string& path);

/**
* Rassemble les utilisations d'une application sur la période demandée et en affiche la synthèse dans le flux transmis en argument.
* Toute erreur rencontrée est affichée dans la console de lancement de l'application.
Expand All @@ -62,6 +74,14 @@ class ApplicationStats

private :

/**
* Effectue un fork, ouvre le fichier en lecture/réécriture avec les bons droits, ...
* @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
* processus fils (tolérance aux fautes).
* @since 6.14.0
*/
static FILE* initLogSession (const std::string fullFileName);

/**
* Charge les logs du fichiers ouvert transmis en argument dans la map transmise en second argument.
* @return 0 en cas de succès. En cas d'erreur errno est positionné.
Expand Down
Loading