On Mon, 2026-01-19 at 17:45 -0300, Wander Lairson Costa wrote:
> Replace manual file open and close operations with context managers
> throughout the rvgen codebase. The previous implementation used
> explicit open() and close() calls, which could lead to resource leaks
> if exceptions occurred between opening and closing the file handles.
> 
> This change affects three file operations: reading DOT specification
> files in the automata parser, reading template files in the generator
> base class, and writing generated monitor files. All now use the with
> statement to ensure proper resource cleanup even in error conditions.
> 
> Context managers provide automatic cleanup through the with statement,
> which guarantees that file handles are closed when the with block
> exits regardless of whether an exception occurred. This follows PEP
> 343 recommendations and is the standard Python idiom for resource
> management. The change also reduces code verbosity while improving
> safety and maintainability.
> 
> Signed-off-by: Wander Lairson Costa <[email protected]>

Looks reasonable, thanks!

Reviewed-by: Gabriele Monaco <[email protected]>

> ---
>  tools/verification/rvgen/rvgen/automata.py  |  6 ++----
>  tools/verification/rvgen/rvgen/generator.py | 12 ++++--------
>  2 files changed, 6 insertions(+), 12 deletions(-)
> 
> diff --git a/tools/verification/rvgen/rvgen/automata.py
> b/tools/verification/rvgen/rvgen/automata.py
> index ed02d0c69b410..70ff98abea751 100644
> --- a/tools/verification/rvgen/rvgen/automata.py
> +++ b/tools/verification/rvgen/rvgen/automata.py
> @@ -51,13 +51,11 @@ class Automata:
>          cursor = 0
>          dot_lines = []
>          try:
> -            dot_file = open(self.__dot_path)
> +            with open(self.__dot_path) as dot_file:
> +                dot_lines = dot_file.read().splitlines()
>          except OSError as exc:
>              raise AutomataError(f"Cannot open the file: {self.__dot_path}")
> from exc
>  
> -        dot_lines = dot_file.read().splitlines()
> -        dot_file.close()
> -
>          # checking the first line:
>          line = dot_lines[cursor].split()
>  
> diff --git a/tools/verification/rvgen/rvgen/generator.py
> b/tools/verification/rvgen/rvgen/generator.py
> index 6d16fb68798a7..ee75e111feef1 100644
> --- a/tools/verification/rvgen/rvgen/generator.py
> +++ b/tools/verification/rvgen/rvgen/generator.py
> @@ -51,11 +51,8 @@ class RVGenerator:
>          raise FileNotFoundError("Could not find the rv directory, do you have
> the kernel source installed?")
>  
>      def _read_file(self, path):
> -        fd = open(path, 'r')
> -
> -        content = fd.read()
> -
> -        fd.close()
> +        with open(path, 'r') as fd:
> +            content = fd.read()
>          return content
>  
>      def _read_template_file(self, file):
> @@ -199,9 +196,8 @@ obj-$(CONFIG_RV_MON_{name_up}) += monitors/{name}/{name}.o
>              return
>  
>      def __write_file(self, file_name, content):
> -        file = open(file_name, 'w')
> -        file.write(content)
> -        file.close()
> +        with open(file_name, 'w') as file:
> +            file.write(content)
>  
>      def _create_file(self, file_name, content):
>          path = f"{self.name}/{file_name}"


Reply via email to