Skip to content

Commit c87fec6

Browse files
Merge pull request #10 from LIHPC-Computational-Geometry/dev-6.10.0
Version 6.10.0. Correctif Process::wait (cas de processus très brefs)…
2 parents 3dec96a + ce4e663 commit c87fec6

File tree

11 files changed

+234
-65
lines changed

11 files changed

+234
-65
lines changed

cmake/version.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
#
44

55
set (TK_UTIL_MAJOR_VERSION "6")
6-
set (TK_UTIL_MINOR_VERSION "9")
6+
set (TK_UTIL_MINOR_VERSION "10")
77
set (TK_UTIL_RELEASE_VERSION "0")
88
set (TK_UTIL_VERSION ${TK_UTIL_MAJOR_VERSION}.${TK_UTIL_MINOR_VERSION}.${TK_UTIL_RELEASE_VERSION})
99

src/TkUtil/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ foreach (lib ${ALL_TARGETS})
3030
endforeach (lib)
3131
target_link_libraries (TkUtil PUBLIC ${Iconv_LIBRARIES})
3232
target_include_directories (TkUtil PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/public>$<INSTALL_INTERFACE:${CMAKE_INSTALL_PREFIX}/include>)
33-
target_link_libraries (TkUtil PUBLIC pthread)
33+
target_link_libraries (TkUtil PUBLIC stdc++fs pthread)
3434

3535
# INSTALLATION :
3636
include(CMakePackageConfigHelpers)

src/TkUtil/File.cpp

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
#include <sys/stat.h>
1515
#include <fcntl.h>
1616
#include <dirent.h>
17-
#include <vector>
17+
#include <filesystem>
1818

1919

2020
USING_STD
@@ -245,6 +245,28 @@ bool File::isExecutable ( ) const
245245
} // File::isExecutable
246246

247247

248+
void File::getChildren (std::vector<File>& directories, std::vector<File>& files) const // v 6.10.0
249+
{ // API C++ 17
250+
directories.clear ( );
251+
files.clear ( );
252+
253+
if (false == isDirectory ( ))
254+
{
255+
UTF8String message (charset);
256+
message << "Impossibilité de donner la liste des sous-répertoires et fichiers : " << getFullFileName ( ) << " n'est pas un répertoire.";
257+
throw Exception (message);
258+
} // if (false == isDirectory ( ))
259+
260+
for (const auto& entry : filesystem::directory_iterator (getFullFileName ( )))
261+
{
262+
if (true == filesystem::is_directory (entry))
263+
directories.push_back (File (filesystem::path (entry)));
264+
else if (true == filesystem::is_regular_file (entry))
265+
files.push_back (File (filesystem::path (entry)));
266+
} // for (const auto& entry : filesystem::directory_iterator (getFullFileName ( )))
267+
} // File::getChildren
268+
269+
248270
mode_t File::getAccessRights ( ) const // v 5.11.0
249271
{
250272
errno = 0;

src/TkUtil/Process.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -326,11 +326,12 @@ void Process::execute (bool autoDelete)
326326
int Process::wait ( )
327327
{
328328
if (true == isCompleted ( ))
329-
{
329+
return getCompletionCode ( ); // v 6.10.0
330+
/* {
330331
UTF8String errorMsg (charset);
331332
errorMsg << "Impossibilité d'attendre la fin du processus " << getName ( ) << " : processus terminé.";
332333
throw Exception (errorMsg);
333-
} // if (true == isCompleted ( ))
334+
} // if (true == isCompleted ( )) */
334335
setWaited (true);
335336
pid_t childPid = getPid ( );
336337
int status = -1;
@@ -446,9 +447,7 @@ void Process::initialize (char* envp [])
446447
string Process::getChildLine ( )
447448
{
448449
if ((true == isCompleted ( )) && (0 == _childBuffer.length ( )))
449-
{ // v 2.21.0 : le remplissage du buffer n'est plus effectué dans
450-
// childDeath (accès concurrents depuis la même pile aux fonctions de
451-
// la lib malloc).
450+
{ // v 2.21.0 : le remplissage du buffer n'est plus effectué dans childDeath (accès concurrents depuis la même pile aux fonctions de la lib malloc).
452451
try
453452
{
454453
fillChildBuffer ( );

src/TkUtil/public/TkUtil/File.h

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include <sys/types.h>
77
#include <sys/stat.h>
88
#include <ostream>
9+
#include <vector>
910

1011

1112
BEGIN_NAMESPACE_UTIL
@@ -120,22 +121,30 @@ class File
120121
* @return true si le fichier est accessible en exécution, sinon false.
121122
*/
122123
virtual bool isExecutable ( ) const;
124+
125+
/**
126+
* @return La liste des sous-répertoires (exception faite de "." et "..") et fichiers.
127+
* @exception Une exception est levée en cas d'erreur, notamment si l'instance n'est pas un répertoire.
128+
* @since 6.10.0
129+
*/
130+
virtual void getChildren (std::vector<File>& directories, std::vector<File>& files) const;
123131

124132
/**
125133
* @return Les droits d'accès sur le fichier (champ <I>st_mode</I> de la structure <I>stat</I>).
126-
* Combinaison par opérateur | des flags S_IR*, S_IW*, S_IX*, * pouvant prendre pour
127-
* valeurs USR, GRP, OTH (cf. man chmod).
134+
* Combinaison par opérateur | des flags S_IR*, S_IW*, S_IX*, * pouvant prendre pour valeurs USR, GRP, OTH (cf. man chmod).
128135
* @exception Une exception est levée en cas d'erreur.
129136
* @see setAccessRights
137+
* @since 5.11.0
130138
*/
131-
virtual mode_t getAccessRights ( ) const; // v 5.11.0
139+
virtual mode_t getAccessRights ( ) const;
132140

133141
/**
134142
* @param Nouveaux droits d'accès sur le fichier (champ <I>st_mode</I> de la structure <I>stat</I>).
135143
* @exception Une exception est levée en cas d'erreur.
136144
* @see getAccessRights
145+
* @since 5.11.0
137146
*/
138-
virtual void setAccessRights (mode_t rigths); // v 5.11.0
147+
virtual void setAccessRights (mode_t rigths);
139148

140149
/**
141150
* Créé effectivement le fichier si celui-ci n'existe pas. Créé l'arborescence parente si nécessaire.
@@ -154,11 +163,11 @@ class File
154163
* Déplace physiquement le fichier.
155164
* @param Nouveau path du fichier.
156165
* @param Si <I>true</I> détruit l'éventuel fichier ayant le path demandé.
157-
* Si false et qu'un fichier existe déjà alors lève une exception.
166+
* Si <I>false</I> et qu'un fichier existe déjà alors lève une exception.
158167
* @exception Une exception est levée en cas d'impossibilité de déplacer le fichier.
159168
* @see setFullFileName
160169
*/
161-
virtual void rename (const std::string& newpath, bool erase); // v 5.4.0
170+
virtual void rename (const std::string& newpath, bool erase); // v 5.4.0
162171

163172
/**
164173
* Détruit le fichier s'il existe.
@@ -173,16 +182,14 @@ class File
173182
virtual void print (IN_STD ostream& stream) const;
174183

175184
/**
176-
* @return Le masque de permissions utilisé lors de la création de
177-
* fichiers.
185+
* @return Le masque de permissions utilisé lors de la création de fichiers.
178186
*/
179187
static mode_t getUMask ( );
180188

181189
/**
182190
* Créé un nom unique de fichier temporaire.
183191
* @param Préfix du nom de fichier temporaire.
184-
* @param true si le fichier doit être créé dans le répertoire des fichiers temporaires,
185-
* false si il doit être créé en relatif par rapport à prefix.
192+
* @param true si le fichier doit être créé dans le répertoire des fichiers temporaires, false si il doit être créé en relatif par rapport à prefix.
186193
* @exception Une exception est levée en cas d'échec.
187194
*/
188195
static IN_STD string createTemporaryName (const IN_STD string& prefix, bool inTmpDir = true);

src/TkUtil/public/TkUtil/Process.h

Lines changed: 46 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,30 @@ BEGIN_NAMESPACE_UTIL
7979
* // ...<BR>
8080
* }<BR>
8181
* </CODE><BR>
82+
* 3- Lecture de la sortie standard du processus lancé (cf. src/tests/process.cpp) :<BR>
83+
* <CODE>
84+
* unique_ptr<Process> process (new Process ("ls"));
85+
* process->getOptions ( ).addOption ("-al");
86+
* process->getOptions ( ).addOption (argv [1]);
87+
* cout << "Cmd line is : " << process->getCommandLine ( ) << endl;
88+
* process->enableChildToSonCommunications (true);
89+
* process->execute (false);
90+
* const int status = process->wait ( );
91+
* cout << "Process standard output :" << endl;
92+
* bool completed = false;
93+
* while (false == completed)
94+
* {
95+
* try
96+
* {
97+
* const string output = process->getChildLine ( );
98+
* cout << output << endl;
99+
* }
100+
* catch (...)
101+
* {
102+
* completed = true;
103+
* }
104+
* } // while (false == completed)
105+
* </CODE><BR>
82106
* </P>
83107
* <P>Cette classe permet également de connaître le répertoire courrant de l'application à l'aide de la méthode statique <I>getCurrentDirectory</I>.
84108
* </P>
@@ -141,16 +165,15 @@ class Process
141165
Process (const IN_STD string& processName);
142166

143167
/**
144-
* Destructeur : appelé automatiquement par l'instance en fin d'exécution
145-
* si true est passé en argument d'<I>execute</I> .
168+
* Destructeur : appelé automatiquement par l'instance en fin d'exécution si true est passé en argument d'<I>execute</I> .
146169
* @see execute
147170
*/
148171
virtual ~Process ( );
149172

150173
/**
151174
* Créé une instance à partir de la ligne de commande transmise en argument (exécutable puis arguments).
152175
* @return instance créée.
153-
* @todo possibilité de déclarer des variables d'environnement avant l'exécutable avec la synatxe variable=valeur
176+
* @todo possibilité de déclarer des variables d'environnement avant l'exécutable avec la syntaxe variable=valeur
154177
*/
155178
static Process* create (const std::string& cmdLine); // v 6.2.0
156179

@@ -160,8 +183,7 @@ class Process
160183
virtual ProcessOptions& getOptions ( );
161184

162185
/**
163-
* @return La ligne de commande complète qui sera exécutée. A des
164-
* fins de débogage, méthode non utilisée par <I>execute</I>.
186+
* @return La ligne de commande complète qui sera exécutée. A des fins de débogage, méthode non utilisée par <I>execute</I>.
165187
*/
166188
virtual IN_STD string getCommandLine ( );
167189

@@ -173,8 +195,8 @@ class Process
173195
virtual void execute (bool autoDelete = true);
174196

175197
/**
176-
* Attend la fin du processus fils.
177-
* @return status de retour du processus fils.
198+
* Attend si nécessaire la fin du processus fils.
199+
* @return status de retour du processus fils (<I>getCompletionCode ( )</I>).
178200
* @see getCompletionCode
179201
* @see getErrorMessage
180202
*/
@@ -224,25 +246,20 @@ class Process
224246
* @see getCompletionCode
225247
* @see isCompleted
226248
*/
227-
// virtual const IN_STD string& getErrorMessage ( ) const // v 4.4.0
228-
// { return _errorMessage; }
229-
virtual const IN_STD string getErrorMessage ( ) const // v 4.4.0
249+
virtual const IN_STD string getErrorMessage ( ) const
230250
{ return std::string (_errorMessage); }
231251

232252
/**
233-
* A invoquer si un pipe doit être ouvert de la sortie standard du
234-
* processus fils vers le processus père.
235-
* @param true si la communication doit être en mode bloquant, false
236-
* dans le cas contraire. Le mode non bloquant est irréversible.
253+
* A invoquer si un pipe doit être ouvert de la sortie standard du processus fils vers le processus père.
254+
* @param true si la communication doit être en mode bloquant, false dans le cas contraire. Le mode non bloquant est irréversible.
237255
* @exception Lève une exception en cas d'erreur
238256
* @see getpipeDescriptors
239257
* @see getChildLine
240258
*/
241259
void enableChildToSonCommunications (bool blocking = true);
242260

243261
/**
244-
* @return true si un pipe doit être ouvert de la sortie standard du
245-
* processus fils vers le processus père.
262+
* @return true si un pipe doit être ouvert de la sortie standard du processus fils vers le processus père.
246263
* @see enableChildToSonCommunications
247264
*/
248265
bool isChildToSonCommunicationsEnabled ( ) const
@@ -279,8 +296,7 @@ class Process
279296
* int main (int argc, char* argv[], char* envp [])
280297
* @warning il est essentiel d'appeler cette fonction avant le lancement de tout process fils. En son absence
281298
* il est possible que l'exécution du process fils échoue.
282-
* @deprecated Utiliser la version utilisant également <I>argc</I> et
283-
* <I>argv</I> du main.
299+
* @deprecated Utiliser la version utilisant également <I>argc</I> et <I>argv</I> du main.
284300
*/
285301
static void initialize (char* envp []);
286302

@@ -303,8 +319,7 @@ class Process
303319
* @see getCurrentSoftware
304320
* @see getCurrentSoftwareVersion
305321
*/
306-
static void setCurrentSoftware (
307-
const IN_STD string& name, const Version& version = Version ("0.0.0"));
322+
static void setCurrentSoftware (const IN_STD string& name, const Version& version = Version ("0.0.0"));
308323

309324
/**
310325
* @return Le nom du logiciel courrant, ou une chaine vide s'il n'a pas été renseigné par setCurrentSoftware.
@@ -342,20 +357,14 @@ class Process
342357

343358
/**
344359
* @param Le message d'erreur associé à une terminaison anormale.
345-
* Sa recopie se limite aux PROCESS_ERROR_MESSAGE_SIZE-1
346-
* premiers caractères. Depuis la version 4.4.0 la gestion
347-
* du message d'erreur est géré dans un tampon pré-alloué car
348-
* ce message peut être issu d'un <I>signal émis</I> et recopié
349-
* dans un handler sur signal où il ne fait pas bon d'utiliser
350-
* malloc et free.
360+
* Sa recopie se limite aux PROCESS_ERROR_MESSAGE_SIZE-1 premiers caractères. Depuis la version 4.4.0 la gestion
361+
* du message d'erreur est géré dans un tampon pré-alloué car ce message peut être issu d'un <I>signal émis</I> et recopié
362+
* dans un handler sur signal où il ne fait pas bon d'utiliser malloc et free.
351363
*/
352-
// virtual void setErrorMessage (const IN_STD string& message) // v 4.4.0
353-
// { _errorMessage = message; }
354-
virtual void setErrorMessage (const char* message); // v 4.4.0
364+
virtual void setErrorMessage (const char* message);
355365

356366
/**
357-
* @return True si la terminaison du processus fils est attendue,
358-
* sinon false.
367+
* @return True si la terminaison du processus fils est attendue, sinon false.
359368
* @see setWaited
360369
* @see waited
361370
*/
@@ -371,9 +380,7 @@ class Process
371380
{ _waited = waited; }
372381

373382
/**
374-
* Lit les l'ensemble des données dans le pipe de communication avec
375-
* le processus fils et les stocke dans l'attente d'appels à
376-
* getChildLine.
383+
* Lit les l'ensemble des données dans le pipe de communication avec le processus fils et les stocke dans l'attente d'appels à getChildLine.
377384
*/
378385
virtual void fillChildBuffer ( );
379386

@@ -383,12 +390,11 @@ class Process
383390
* @param Si true, ajoute un caractère de fin de ligne après
384391
* la chaine.
385392
*/
386-
virtual void appendChildBuffer (
387-
const IN_STD string& str, bool newLine = true);
393+
virtual void appendChildBuffer (const IN_STD string& str, bool newLine = true);
388394

389395
/**
390396
* Appelé lorsqu'un processus fils est fini. Marque l'instance comme terminée.
391-
*i<B>Depuis la version 4.4.0 ne détruit plus l'instance associée si isWaited retourne false.</B>
397+
* <B>Depuis la version 4.4.0 ne détruit plus l'instance associée si isWaited retourne false.</B>
392398
* @param nature du signal reçu.
393399
* @param informations sur l'origine du signal
394400
* @param contexte d'appel du signal
@@ -417,13 +423,10 @@ class Process
417423
/** Le caractère "terminé" de l'instance. */
418424
bool _completed;
419425

420-
/** Vaut true si un pipe de communication doit être ouvert de la sortie
421-
* standard du processus fils vers le processus père. */
426+
/** Vaut true si un pipe de communication doit être ouvert de la sortie standard du processus fils vers le processus père. */
422427
bool _childToSonCommunications;
423428

424-
/** Vaut true si les communications du processus fils vers le processus
425-
* père sont bloquantes, false dans le cas contraire. Vaut true par
426-
* défaut.
429+
/** Vaut true si les communications du processus fils vers le processus père sont bloquantes, false dans le cas contraire. Vaut true par défaut.
427430
*/
428431
bool _blockingCommunications;
429432

@@ -447,8 +450,7 @@ class Process
447450
int _completionCode;
448451

449452
/** Le message d'erreur associé à une terminaison anormale. */
450-
// IN_STD string _errorMessage; // v 4.4.0
451-
char _errorMessage [PROCESS_ERROR_MESSAGE_SIZE];// v 4.4.0
453+
char _errorMessage [PROCESS_ERROR_MESSAGE_SIZE];
452454

453455
/** La table comprenant les ids des tâches et les pointeurs sur les instances associées de cette classe.
454456
*/

src/TkUtilScripting/CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ file (GLOB CPP_SOURCES *.i *.cpp)
2626
# => dans cette version on ne génère que _TkUtilScripting qui sera utilisé directement depuis les scripts comme par les exécutables.
2727
set (ALL_TARGETS TkUtilScripting)
2828
set_property (SOURCE TkUtilScripting.i PROPERTY CPLUSPLUS ON)
29+
set_property (SOURCE TkUtilScripting.i PROPERTY USE_SWIG_DEPENDENCIES TRUE)
2930
swig_add_library (TkUtilScripting TYPE SHARED LANGUAGE PYTHON SOURCES ${CPP_SOURCES})
3031
cmake_policy (SET CMP0086 NEW)
3132
set_source_files_properties (TkUtilScripting.i PROPERTIES SWIG_MODULE_NAME TkUtil)
@@ -39,7 +40,7 @@ if (SWIG_VERSION VERSION_GREATER 4)
3940
list (APPEND MT_SWIG_COMPILE_OPTIONS "-doxygen")
4041
endif (SWIG_VERSION VERSION_GREATER 4)
4142
# Avec cmake_policy (SET CMP0086 NEW) -module ${SWIG_MODULE_NAME} devrait être automatiquement passé, SWIG_MODULE_NAME étant défini comme propriété du fichier swig. Mais ...
42-
swig_link_libraries (TkUtilScripting PUBLIC TkUtil ${Python_LIBRARIES})
43+
target_link_libraries (TkUtilScripting PUBLIC TkUtil ${Python_LIBRARIES})
4344
target_include_directories (TkUtilScripting PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/public>$<INSTALL_INTERFACE:${CMAKE_INSTALL_PREFIX}/include>)
4445
foreach (lib ${ALL_TARGETS})
4546
target_include_directories (TkUtilScripting PRIVATE ${Python_INCLUDE_DIRS})

src/tests/CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ include (${GUIToolkitsVariables_CMAKE_DIR}/common.cmake)
33
include (${GUIToolkitsVariables_CMAKE_DIR}/workarounds.cmake)
44

55
set (ALL_EXECUTABLES
6-
ansi_esc_codes canceled_threads conversions date exceptions
6+
ansi_esc_codes canceled_threads conversions date dir_list exceptions
77
fileExtractor fileinfos fileopts hostinfos joinable locale
8-
logs memory modify_script remoteProcess removefile script_tags
8+
logs memory modify_script process remoteProcess removefile script_tags
99
scripting_logs thread_manager thread_pool timer tmpfile
1010
unicode urlfifo user_representation userinfos utf8 utf8chars
1111
)

0 commit comments

Comments
 (0)