From 2f3ec7ea25db3ef9a3b210a621fc419f934e88f9 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 4 Jan 2026 22:34:07 +0530 Subject: [PATCH] Use a different base temporary directory for each page count job --- src/calibre/library/page_count.py | 23 ++++++++++++----------- src/calibre/ptempfile.py | 11 +++++++++++ 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/calibre/library/page_count.py b/src/calibre/library/page_count.py index 14282473a9..e21c802612 100644 --- a/src/calibre/library/page_count.py +++ b/src/calibre/library/page_count.py @@ -20,7 +20,7 @@ from calibre.ebooks.oeb.polish.container import Container as ContainerBase from calibre.ebooks.oeb.polish.parsing import decode_xml, parse from calibre.ebooks.oeb.polish.pretty import NON_NAMESPACED_BLOCK_TAGS from calibre.ebooks.oeb.polish.toc import get_toc -from calibre.ptempfile import TemporaryDirectory +from calibre.ptempfile import TemporaryDirectory, override_base_dir from calibre.utils.cleantext import clean_xml_chars from calibre.utils.ipc import eintr_retry_call from calibre.utils.logging import DevNull @@ -246,17 +246,18 @@ class Server: def serve_requests(pipe: Connection) -> None: executor = ThreadPoolExecutor() - for line in sys.stdin: + for i, line in enumerate(sys.stdin): path = bytes.fromhex(line.rstrip()).decode() - try: - result = count_pages(path, executor) - except Exception as e: - import traceback - result = str(e), traceback.format_exc() - try: - eintr_retry_call(pipe.send, result) - except EOFError: - break + with TemporaryDirectory(suffix=f'.pc{i}') as base_tdir, override_base_dir(base_tdir): + try: + result = count_pages(path, executor) + except Exception as e: + import traceback + result = str(e), traceback.format_exc() + try: + eintr_retry_call(pipe.send, result) + except EOFError: + break def worker_main(pipe_fd: int) -> None: diff --git a/src/calibre/ptempfile.py b/src/calibre/ptempfile.py index a6544dfa0d..ac6e5ac3c8 100644 --- a/src/calibre/ptempfile.py +++ b/src/calibre/ptempfile.py @@ -6,6 +6,7 @@ being closed. ''' import os import tempfile +from contextlib import contextmanager from calibre.constants import __appname__, filesystem_encoding, get_windows_temp_path, ismacos, iswindows from calibre.utils.safe_atexit import remove_dir, remove_file_atexit, remove_folder_atexit, unlink @@ -105,6 +106,16 @@ def reset_base_dir(): _base_dir = None +@contextmanager +def override_base_dir(newval: str) -> None: + global _base_dir + before, _base_dir = _base_dir, newval + try: + yield + finally: + _base_dir = before + + def force_unicode(x): # Cannot use the implementation in calibre.__init__ as it causes a circular # dependency