Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
simgrid.git
2 years agotake 2 on declare_flag, not sure it's better... a bit weird
SUTER Frederic [Tue, 15 Mar 2022 22:24:36 +0000 (23:24 +0100)]
take 2 on declare_flag, not sure it's better... a bit weird

2 years agoFix makedistcheck after !87
Martin Quinson [Wed, 16 Mar 2022 11:12:32 +0000 (12:12 +0100)]
Fix makedistcheck after !87

2 years agoDirectly reset observer_ instead of using an empty simcall for that.
Arnaud Giersch [Wed, 16 Mar 2022 09:45:54 +0000 (10:45 +0100)]
Directly reset observer_ instead of using an empty simcall for that.

2 years agoSimcalls are not allowed on exit, even when cheating with raii.
Arnaud Giersch [Wed, 16 Mar 2022 09:38:42 +0000 (10:38 +0100)]
Simcalls are not allowed on exit, even when cheating with raii.

This partially reverts commit 26f93d36882a4af53d1b797294caeae9efbf9b47
"Use RAII to simplify the release of semaphores on exit."

2 years agoMerge branch 'add_barrier_python_bindings' into 'master'
Martin Quinson [Wed, 16 Mar 2022 07:57:12 +0000 (07:57 +0000)]
Merge branch 'add_barrier_python_bindings' into 'master'

Add Barrier Python bindings

See merge request simgrid/simgrid!87

2 years agoRegroup common code.
Arnaud Giersch [Tue, 15 Mar 2022 22:17:31 +0000 (23:17 +0100)]
Regroup common code.

2 years agoExtract eigen3 version from build logs.
Arnaud Giersch [Tue, 15 Mar 2022 20:30:17 +0000 (21:30 +0100)]
Extract eigen3 version from build logs.

2 years agoUse the right comparison operator for version numbers.
Arnaud Giersch [Tue, 15 Mar 2022 20:16:12 +0000 (21:16 +0100)]
Use the right comparison operator for version numbers.

2 years agoAdd missing license
Jean-Edouard BOULANGER [Tue, 15 Mar 2022 20:30:33 +0000 (21:30 +0100)]
Add missing license

2 years agoAdd Barrier Python bindings
Jean-Edouard BOULANGER [Tue, 15 Mar 2022 18:35:47 +0000 (19:35 +0100)]
Add Barrier Python bindings

2 years agoUpdated Release notes wit text from Arnaud, with a round of minor
Henri Casanova [Tue, 15 Mar 2022 18:15:51 +0000 (08:15 -1000)]
Updated Release notes wit text from Arnaud, with a round of minor
rewriting and typo chasing

2 years agoFix column numbers for sortTable.
Arnaud Giersch [Tue, 15 Mar 2022 16:20:17 +0000 (17:20 +0100)]
Fix column numbers for sortTable.

2 years agoUse existing helper function.
Arnaud Giersch [Tue, 15 Mar 2022 14:07:16 +0000 (15:07 +0100)]
Use existing helper function.

2 years agoDraft a few paragraphs in release notes about modeling efforts [no-ci]
Martin Quinson [Tue, 15 Mar 2022 14:35:56 +0000 (15:35 +0100)]
Draft a few paragraphs in release notes about modeling efforts [no-ci]

2 years agoBetter fix for the mutex IDs modifications in mutex-MC test
Martin Quinson [Tue, 15 Mar 2022 13:04:29 +0000 (14:04 +0100)]
Better fix for the mutex IDs modifications in mutex-MC test

kill the extra mutex forgotten out of the loop in the hijacked example

This reverts and reworks commit 5190c1c45270085777ef904c35ab99b5ad52d681.

2 years ago[project-description] Put build status starting at 3rd column.
Arnaud Giersch [Tue, 15 Mar 2022 13:41:08 +0000 (14:41 +0100)]
[project-description] Put build status starting at 3rd column.

[ci-skip]

2 years agoAdd eigen3 to project_description.sh
Arnaud Giersch [Tue, 15 Mar 2022 12:59:34 +0000 (13:59 +0100)]
Add eigen3 to project_description.sh

2 years agoDisable debug output by default.
Arnaud Giersch [Tue, 15 Mar 2022 11:07:51 +0000 (12:07 +0100)]
Disable debug output by default.

2 years agoEnable valgrind for unit-tests.
Arnaud Giersch [Tue, 15 Mar 2022 11:05:25 +0000 (12:05 +0100)]
Enable valgrind for unit-tests.

2 years agoRename TESH_WRAPPER -> VALGRIND_WRAPPER.
Arnaud Giersch [Tue, 15 Mar 2022 11:02:08 +0000 (12:02 +0100)]
Rename TESH_WRAPPER -> VALGRIND_WRAPPER.

2 years agoWhitespace cleanup and reindent.
Arnaud Giersch [Tue, 15 Mar 2022 10:44:29 +0000 (11:44 +0100)]
Whitespace cleanup and reindent.

2 years agoUnnecessary semicolon.
Arnaud Giersch [Tue, 15 Mar 2022 10:38:54 +0000 (11:38 +0100)]
Unnecessary semicolon.

2 years agoRevalidate the tesh output of mutex-MC. The mutex IDs were changed for the same traces
Martin Quinson [Tue, 15 Mar 2022 11:33:14 +0000 (12:33 +0100)]
Revalidate the tesh output of mutex-MC. The mutex IDs were changed for the same traces

2 years agoMake the Eigen3 dependency optionnal
Martin Quinson [Tue, 15 Mar 2022 09:18:51 +0000 (10:18 +0100)]
Make the Eigen3 dependency optionnal

2 years agoDon't feed ICC with command-line parameters that it doesn't understand
Martin Quinson [Tue, 15 Mar 2022 08:17:47 +0000 (09:17 +0100)]
Don't feed ICC with command-line parameters that it doesn't understand

2 years agoMerge branch 'add_mutex_python_bindings' into 'master'
Martin Quinson [Tue, 15 Mar 2022 08:09:00 +0000 (08:09 +0000)]
Merge branch 'add_mutex_python_bindings' into 'master'

Add Mutex Python bindings

See merge request simgrid/simgrid!84

2 years agoUpdate synchro-mutex.py to match last version of s4u-synchro-mutex.cpp
Jean-Edouard BOULANGER [Tue, 15 Mar 2022 07:58:24 +0000 (08:58 +0100)]
Update synchro-mutex.py to match last version of s4u-synchro-mutex.cpp

2 years agoMake synchro-mutex.py in line with s4u-synchro-mutex.cpp
Jean-Edouard BOULANGER [Mon, 14 Mar 2022 18:01:12 +0000 (19:01 +0100)]
Make synchro-mutex.py in line with s4u-synchro-mutex.cpp

2 years agoMartin's suggestions
Jean-Edouard BOULANGER [Mon, 14 Mar 2022 17:51:20 +0000 (18:51 +0100)]
Martin's suggestions

2 years agoAdd Mutex Python bindings
Jean-Edouard BOULANGER [Mon, 14 Mar 2022 17:30:23 +0000 (18:30 +0100)]
Add Mutex Python bindings

2 years ago[config] some declare_flag to Flag
SUTER Frederic [Tue, 15 Mar 2022 03:25:05 +0000 (04:25 +0100)]
[config] some declare_flag to Flag

2 years agosynchro-mutex example: don't have all pairs intermix their results
Martin Quinson [Mon, 14 Mar 2022 22:59:54 +0000 (23:59 +0100)]
synchro-mutex example: don't have all pairs intermix their results

Thanks @jean-edouard-boulanger for noticing.

2 years agoCope with Eigen 3.3.4 directly in cmake
Martin Quinson [Mon, 14 Mar 2022 21:50:43 +0000 (22:50 +0100)]
Cope with Eigen 3.3.4 directly in cmake

and remove the specific workaround for our robots. Also, move the
Eigen detection with the other external dependencies in the CMakeLists.

2 years agoFix the cleanup. Sorry @agiersch for breaking everything so consistently
Martin Quinson [Mon, 14 Mar 2022 21:08:58 +0000 (22:08 +0100)]
Fix the cleanup. Sorry @agiersch for breaking everything so consistently

2 years agoFix clang builds
Martin Quinson [Mon, 14 Mar 2022 20:46:27 +0000 (21:46 +0100)]
Fix clang builds

2 years agoTutorial: try to hint on some errors that the users may get when attempting the tutorial
Martin Quinson [Mon, 14 Mar 2022 20:42:30 +0000 (21:42 +0100)]
Tutorial: try to hint on some errors that the users may get when attempting the tutorial

2 years agomore C++ish in EngineImpl
Martin Quinson [Mon, 14 Mar 2022 07:39:20 +0000 (08:39 +0100)]
more C++ish in EngineImpl

Move some stuff to the object destructor where it belongs.

There is still a lot to do in there before it's real C++ code...

2 years agoCosmetics in comments (mainly in EngineImpl::run)
Martin Quinson [Sun, 13 Mar 2022 23:28:36 +0000 (00:28 +0100)]
Cosmetics in comments (mainly in EngineImpl::run)

2 years agoMake sure that ActorImpl::cleanup_from_kernel is called only once per actor, and...
Martin Quinson [Sun, 13 Mar 2022 23:06:24 +0000 (00:06 +0100)]
Make sure that ActorImpl::cleanup_from_kernel is called only once per actor, and move on_termination to there

2 years agoMerge branch 'dev-profile-callbacks' into 'master'
Martin Quinson [Mon, 14 Mar 2022 20:17:31 +0000 (20:17 +0000)]
Merge branch 'dev-profile-callbacks' into 'master'

Refactoring profiles to use generic callbacks

See merge request simgrid/simgrid!82

2 years agoRefactoring profiles to use generic callbacks
Fabien Chaix [Mon, 14 Mar 2022 20:17:27 +0000 (20:17 +0000)]
Refactoring profiles to use generic callbacks

2 years agoCosmetics [ci-skip].
Arnaud Giersch [Mon, 14 Mar 2022 16:17:12 +0000 (17:17 +0100)]
Cosmetics [ci-skip].

2 years agoMake test work with python < 3.9.
Arnaud Giersch [Mon, 14 Mar 2022 15:52:32 +0000 (16:52 +0100)]
Make test work with python < 3.9.

See https://stackoverflow.com/questions/39458193/using-list-tuple-etc-from-typing-vs-directly-referring-type-as-list-tuple-etc

Thanks @tocornebize and @bruno.donassolo for the hint

2 years agoUpdate documentation.
Arnaud Giersch [Mon, 14 Mar 2022 15:02:57 +0000 (16:02 +0100)]
Update documentation.

2 years agoFix distcheck.
Arnaud Giersch [Mon, 14 Mar 2022 14:55:44 +0000 (15:55 +0100)]
Fix distcheck.

2 years agoRemove target "make uninstall".
Arnaud Giersch [Mon, 14 Mar 2022 14:49:31 +0000 (15:49 +0100)]
Remove target "make uninstall".

Close simgrid/simgrid#104

2 years agoUpdate comments.
Arnaud Giersch [Mon, 14 Mar 2022 13:58:35 +0000 (14:58 +0100)]
Update comments.

2 years agoMark more smx_* type aliases as deprecated.
Arnaud Giersch [Mon, 14 Mar 2022 13:41:34 +0000 (14:41 +0100)]
Mark more smx_* type aliases as deprecated.

2 years agoMark smx_actor_t as deprecated.
Arnaud Giersch [Mon, 14 Mar 2022 13:21:48 +0000 (14:21 +0100)]
Mark smx_actor_t as deprecated.

2 years agoMerge branch 'xsltproc' into 'master'
Martin Quinson [Mon, 14 Mar 2022 09:58:14 +0000 (09:58 +0000)]
Merge branch 'xsltproc' into 'master'

Add missing xsltproc dependency for starpu-mpi

See merge request simgrid/simgrid!86

2 years agoAdd missing xsltproc dependency for starpu-mpi
Samuel Thibault [Mon, 14 Mar 2022 09:56:13 +0000 (10:56 +0100)]
Add missing xsltproc dependency for starpu-mpi

2 years agoMerge branch 'starpu-mpi' into 'master'
Martin Quinson [Mon, 14 Mar 2022 09:25:18 +0000 (09:25 +0000)]
Merge branch 'starpu-mpi' into 'master'

Explicitly tell StarPU to enable starpu-mpi

See merge request simgrid/simgrid!85

2 years agoExplicitly tell StarPU to enable starpu-mpi
Samuel Thibault [Mon, 14 Mar 2022 09:19:38 +0000 (10:19 +0100)]
Explicitly tell StarPU to enable starpu-mpi

This is not enabled by default.

2 years agoDisable parallel tests.
Arnaud Giersch [Sun, 13 Mar 2022 22:07:19 +0000 (23:07 +0100)]
Disable parallel tests.

2 years agoctest --output-on-failure on jar building [no-ci]
Martin Quinson [Sun, 13 Mar 2022 21:30:30 +0000 (22:30 +0100)]
ctest --output-on-failure on jar building [no-ci]

2 years agoSometimes propagating an exception across different libraries fails.
Arnaud Giersch [Sun, 13 Mar 2022 21:20:50 +0000 (22:20 +0100)]
Sometimes propagating an exception across different libraries fails.

I don't know if this is the case here, but take a safe bet.

2 years agofix jarfile.yml
Augustin Degomme [Sun, 13 Mar 2022 20:48:52 +0000 (20:48 +0000)]
fix jarfile.yml

2 years agoadd eigen to bigdft test
Augustin Degomme [Sun, 13 Mar 2022 20:43:59 +0000 (20:43 +0000)]
add eigen to bigdft test

2 years agoAlso test java builds on github jar action
Martin Quinson [Sun, 13 Mar 2022 20:32:52 +0000 (21:32 +0100)]
Also test java builds on github jar action

2 years agoMerge remote-tracking branch 'github/master'
Arnaud Giersch [Sun, 13 Mar 2022 19:51:07 +0000 (20:51 +0100)]
Merge remote-tracking branch 'github/master'

2 years agoMerge branch 'fix_bindings_mistakenly_set_as_member_functions' into 'master'
Martin Quinson [Sun, 13 Mar 2022 17:24:49 +0000 (17:24 +0000)]
Merge branch 'fix_bindings_mistakenly_set_as_member_functions' into 'master'

Make Python bindings static where needed

See merge request simgrid/simgrid!83

2 years agoJarfile github action: fix scoop install + add eigen (#379)
adegomme [Sun, 13 Mar 2022 17:22:02 +0000 (18:22 +0100)]
Jarfile github action: fix scoop install + add eigen   (#379)

* Update jarfile.yml

* add eigen

* Update jarfile.yml

* Update jarfile.yml

* Update jarfile.yml

* Update jarfile.yml

* Update CMakeLists.txt

* Update CMakeLists.txt

* Update jarfile.yml

* Update jarfile.yml

* Update jarfile.yml

* Update jarfile.yml

* Update jarfile.yml

* Update jarfile.yml

* Update jarfile.yml

* Update jarfile.yml

* Update jarfile.yml

* Update jarfile.yml

* Update jarfile.yml

* Update jarfile.yml

* Update jarfile.yml

* Update jarfile.yml

* Update jarfile.yml

* Update jarfile.yml

* Update jarfile.yml

* Update jarfile.yml

* Update jarfile.yml

2 years agoKill a useless static function
Martin Quinson [Sun, 13 Mar 2022 15:32:48 +0000 (16:32 +0100)]
Kill a useless static function

2 years agoSort Actor traits alphabetically + cleanups
Martin Quinson [Sun, 13 Mar 2022 15:24:36 +0000 (16:24 +0100)]
Sort Actor traits alphabetically + cleanups

2 years agoIntroduce ActorIDTrait to split ActorImpl apart
Martin Quinson [Sun, 13 Mar 2022 15:01:25 +0000 (16:01 +0100)]
Introduce ActorIDTrait to split ActorImpl apart

2 years agoSimplify parameter passing between EngineImpl and ContextFactory
Martin Quinson [Sun, 13 Mar 2022 14:28:21 +0000 (15:28 +0100)]
Simplify parameter passing between EngineImpl and ContextFactory

Indeed, it's easier to pass the object as a parameter instead of
having the called getting it afterward through a call back to the
caller.

2 years agoMove the actor lifecycle markers from Context to ActorImpl
Martin Quinson [Sun, 13 Mar 2022 11:25:05 +0000 (12:25 +0100)]
Move the actor lifecycle markers from Context to ActorImpl

and reduce Context.hpp visibility

2 years agomake the semaphore monkey more robust to deadlocks and to unanswered simcalls in...
Martin Quinson [Sat, 12 Mar 2022 18:20:42 +0000 (19:20 +0100)]
make the semaphore monkey more robust to deadlocks and to unanswered simcalls in RAII

2 years agodocument a function
Martin Quinson [Sat, 12 Mar 2022 18:04:10 +0000 (19:04 +0100)]
document a function

2 years agoActorImpl::join: react right away if the other actor is already dead
Martin Quinson [Sat, 12 Mar 2022 18:03:51 +0000 (19:03 +0100)]
ActorImpl::join: react right away if the other actor is already dead

2 years agofflush for all processes.
Arnaud Giersch [Sun, 13 Mar 2022 08:34:35 +0000 (09:34 +0100)]
fflush for all processes.

2nd try to make asan warnings ignored.
rank==0 is not always the last one to print.
[ci-skip]

2 years ago[tesh] Remove ignored lines *before* trimming the output.
Arnaud Giersch [Sat, 12 Mar 2022 20:30:21 +0000 (21:30 +0100)]
[tesh] Remove ignored lines *before* trimming the output.

[ci-skip]

2 years agoAdapt tests to avoid failures when spurious ASan warnings are interlaced.
Arnaud Giersch [Sat, 12 Mar 2022 16:51:20 +0000 (17:51 +0100)]
Adapt tests to avoid failures when spurious ASan warnings are interlaced.

2 years agoBlind attempt at getting scoop working again on Azur windows
Martin Quinson [Sat, 12 Mar 2022 14:12:37 +0000 (15:12 +0100)]
Blind attempt at getting scoop working again on Azur windows

2 years agoobey our coding conventions in ActorImpl::mailboxes, and free them once only
Martin Quinson [Sat, 12 Mar 2022 12:16:06 +0000 (13:16 +0100)]
obey our coding conventions in ActorImpl::mailboxes, and free them once only

2 years agoSimplify the Context::stop() and reduce duplication
Martin Quinson [Sat, 12 Mar 2022 11:25:00 +0000 (12:25 +0100)]
Simplify the Context::stop() and reduce duplication

2 years agoDefuse a trap on refcounting activities by adding a comment
Martin Quinson [Sat, 12 Mar 2022 10:47:26 +0000 (11:47 +0100)]
Defuse a trap on refcounting activities by adding a comment

2 years agoMake Python bindings static where needed
Jean-Edouard BOULANGER [Sat, 12 Mar 2022 07:58:12 +0000 (08:58 +0100)]
Make Python bindings static where needed

2 years agoaugment example to check sharing of a thread-execute
SUTER Frederic [Sat, 12 Mar 2022 01:02:14 +0000 (02:02 +0100)]
augment example to check sharing of a thread-execute

2 years agoMake sure that actors killed by a timer are properly finished
Martin Quinson [Sat, 12 Mar 2022 00:01:35 +0000 (01:01 +0100)]
Make sure that actors killed by a timer are properly finished

ActorImpl::exit() does not schedule the victim for execution because
exit() usually denotes a suicide.

When ran from a timer, it's executed in maestro context, so the victim
needs to be scheduled to be properly freed.

It worked properly before commit 2cb8c87fc8 because the actors were
completely destroyed by Context::stop() which is still used here. Now,
the cleanup is split in 2 parts (in actor context and in maestro
context), that are not directly inter-linked.

Gosh, that was a long debug session for a small patch. I hope it's OK now

2 years agoCosmetics in ActorImpl
Martin Quinson [Fri, 11 Mar 2022 21:13:40 +0000 (22:13 +0100)]
Cosmetics in ActorImpl

2 years agoMerge branch 'add_remaining_comm_sync_bindings' into 'master'
Martin Quinson [Fri, 11 Mar 2022 13:52:28 +0000 (13:52 +0000)]
Merge branch 'add_remaining_comm_sync_bindings' into 'master'

Add remaining Comm synchronisation Python bindings

See merge request simgrid/simgrid!81

2 years agoMinor improv in threads
Bruno Donassolo [Fri, 11 Mar 2022 11:36:55 +0000 (12:36 +0100)]
Minor improv in threads

Let the user_bound for bounds given by S4U user (if any).

For the requested_cores, the bound is already configured when creating
the action at CpuCas01Action.

Also, the current implementation for threads use the same mechanism used
by VMs, for a N-thread action:
- priority/sharing_penalty: 1/N to increase the amount of CPU given to
action.
- individual bound: speed < N*C: to limit the action speed to the number
of cores.

2 years agoComment back the unsuccessful try to use faster matrix solver.
Bruno Donassolo [Fri, 11 Mar 2022 11:17:12 +0000 (12:17 +0100)]
Comment back the unsuccessful try to use faster matrix solver.

Ideally we would like to use PartialPivLU most of the time. But in some
cases, as tested in the UTs, we need the complete pivoting and the
assurance given by FullPivLU.

Document why it didn't work.
Need another way to check that the solution is invalid that doesn't
include isNaN.

2 years agoAdd unit tests aiming at covering Comm::send and Comm::recv.
Arnaud Giersch [Thu, 10 Mar 2022 17:14:35 +0000 (18:14 +0100)]
Add unit tests aiming at covering Comm::send and Comm::recv.

2 years agoKill dead code.
Arnaud Giersch [Thu, 10 Mar 2022 16:21:30 +0000 (17:21 +0100)]
Kill dead code.

Unused since there is no future.

2 years agoUse std::function for smpi_comm_copy_data_callback.
Arnaud Giersch [Thu, 10 Mar 2022 10:04:09 +0000 (11:04 +0100)]
Use std::function for smpi_comm_copy_data_callback.

2 years agoUse std::function for Extension deleters.
Arnaud Giersch [Wed, 9 Mar 2022 22:19:55 +0000 (23:19 +0100)]
Use std::function for Extension deleters.

2 years agoUse std::function for Comm callbacks.
Arnaud Giersch [Wed, 9 Mar 2022 21:48:21 +0000 (22:48 +0100)]
Use std::function for Comm callbacks.

2 years agoeasy sonar fixes
Martin Quinson [Thu, 10 Mar 2022 07:28:35 +0000 (08:28 +0100)]
easy sonar fixes

2 years agocosmetics in the release notes
Martin Quinson [Wed, 9 Mar 2022 22:21:34 +0000 (23:21 +0100)]
cosmetics in the release notes

2 years agoBetter split between the cleanups from self and the ones from the kernel (ie on maest...
Martin Quinson [Wed, 9 Mar 2022 21:08:11 +0000 (22:08 +0100)]
Better split between the cleanups from self and the ones from the kernel (ie on maestro context)

This shall remove the need for OS synchronization when registering the
actors that should die. So that's hopefully another fix for the problem solved
by be00fecb16c89d44253052889f4815b35ab9abbe

Also, it protects more modifications to global datastructures from
concurrent modifications by doing them in maestro context. The
previous solution was only protecting a very small amount of them.

2 years agoAdd remaining Comm synchronisation Python bindings
Jean-Edouard BOULANGER [Wed, 9 Mar 2022 17:57:02 +0000 (18:57 +0100)]
Add remaining Comm synchronisation Python bindings

2 years agoMake our valgrind wrapper less verbose, so that it does not break tesh outputs when...
Martin Quinson [Wed, 9 Mar 2022 15:38:25 +0000 (16:38 +0100)]
Make our valgrind wrapper less verbose, so that it does not break tesh outputs when no error

2 years agofurther simpify the MC initialization on app side
Martin Quinson [Wed, 9 Mar 2022 11:21:06 +0000 (12:21 +0100)]
further simpify the MC initialization on app side

2 years agoSimplify the parameter passing while initializing the MC on the app side
Martin Quinson [Wed, 9 Mar 2022 10:33:38 +0000 (11:33 +0100)]
Simplify the parameter passing while initializing the MC on the app side

2 years agoSeal the platform only once from EngineImpl::run
Martin Quinson [Wed, 9 Mar 2022 10:26:03 +0000 (11:26 +0100)]
Seal the platform only once from EngineImpl::run

2 years agoFix mingw warning.
Arnaud Giersch [Wed, 9 Mar 2022 10:38:38 +0000 (11:38 +0100)]
Fix mingw warning.

redeclared without dllimport attribute: previous dllimport ignored [-Wattributes]

2 years agoKill useless target "make maintainer-clean".
Arnaud Giersch [Wed, 9 Mar 2022 10:34:24 +0000 (11:34 +0100)]
Kill useless target "make maintainer-clean".

It only tries to remove an non-existent file...

2 years agoDon't modify variable twice in the same expression.
Arnaud Giersch [Wed, 9 Mar 2022 09:42:05 +0000 (10:42 +0100)]
Don't modify variable twice in the same expression.